Der SQL-Befehl für das Auslesen von Daten ist SELECT. Weitere Befehle sind zum Beispiel UPDATE oder DELETE FROM. Diese Übersicht konzentriert sich jedoch auf SELECT.
Aufbau einer Query:
SELECT [Column 1], [Column 2],....[Column N]
FROM [Datasource]
WHERE [Column Name] {Comparison Operator} {Filter Criteria}
GROUP BY [Colun Name]
HAVING {[Aggregate Function]} {Comparison Operator} {Filter Criteria}
ORDER BY {[Column Name], [Column Alias], [Column Ordina]} [ASEC/DESC]
Beispiele für "Comparison Operator": <, >, =, !=
Beispiel für "Aggregate functions": MAX, MIN, COUNT, AVG, SUM
Beschreibung | SQL |
Spezifische Daten auslesen |
|
Abfrage aller Daten einer Tabelle |
SELECT * FROM source |
Kalkulationen bei SELECT sind möglich = kalkulierte Spalten |
SELECT feld1 + feld2 FROM source
SELECT preis + preis*0.19 FROM source
SELECT name, population/area FROM source
|
Umbenennung / ALIAS |
SELECT preis + preis*0,19 AS Preis_mit_MwST FROM source |
Weitere Funktionen
COUNT = Liefert die Anzahl der nicht leeren Zellen |
SELECT MAX(preis) FROM source
SELECT MIN(preis) FROM source
SELECT AVG(preis) FROM source
SELLECT COUNT(preis) FROM source
SELECT SUM(preis) FROM source |
Klausel ORDER BY, GROUP BY, HAVING oder wie man Daten sortiert und gruppiert |
|
Daten sortieren |
SELECT * FROM source ORDER BY DESC name |
GROUP BY = Gruppierung mit Aggregatsfunktion = Wie viele Nobelpreise wurden pro Fach vergeben? |
SELECT subject, COUNT(subject) FROM nobel GROUP BY subject
SELECT name, AVG(revenue) FROM source GROUP BY name
SELECT name, SUM(revenue) FROM source GROUP BY name |
GROUP BY GROUPING SETS Vorteil ist die Vereinfachung von Queries. |
SELECT a1, a2, aggregate (a3) FROM source GROUP BY GROUPING SETS ( (a1, a2), (a1), (a2), () ) |
HAVING = Ähnlich wie WHERE aber bezieht sich auf Datensatzgruppen nicht auf einzelne Datensätze |
SELECT COUNT (name), country FROM source GROUP BY country HAVING COUNT(name) >5 |
Klausel WHERE oder wie man Daten aus bestimmten Datensätzen ausliest |
|
Abfrage spezifischer Daten |
SELECT population
FROM source |
IN = Selektion von verschiedenen Items Statt name='Germany' OR name ='Sweden' or name='Norway' |
SELECT name, population
FROM source |
NOT IN |
SELECT name, population
FROM source
|
BETWEEN = Datenspanne Bei BETWEEN gehören die Grenzbereiche immer zu dem angegebenen Wertebereich
|
SELECT name, area
FROM source
SELECT name, area FROM source WHERE are BETWEEN 'A' and 'Nzzz'
SELECT name, area FROM source WHERE area >=200000 AND area <=250000 |
LIKE in Kombination mit Platzhaltern: (%,_[]) |
SELECT name, area
FROM source
|
Prozentzeichen demaskieren = Prozentzeichen nicht als Platzhalter interpretieren, sondern als Prozentezeichen werten |
SELECT name, area, gdp FROM source WHERE gdp LIKE '20#%' |
NOT LIKE in Kombination mit Platzhaltern (%, _) |
SELECT name FROM source WHERE name NOT LIKE 'Ge%' |
OR |
SELECT name, area FROM source WHERE name LIKE '%y' OR '%a' |
AND |
SELECT name, length FROM source WHERE length = 5 AND continent='EUROPE' |
AND OR Kombination mit Klammern |
SELECT * FROM source WHERE name LIKE 'B%' AND city = 'Stuttgart' AND (phone LIKE '%8%' OR code LIKE '%8%') |
AND NOT Und seine verschiedene Möglichkeiten |
SELECT* FROM source WHERE (team1='VFB' OR team2='VFB') AND NOT teamid = 'VFB'
Alternative: SELECT* FROM source WHERE (team1='VFB' OR team2='VFB') AND teamid != 'VFB'
SELECT* FROM source WHERE (team1='VFB' OR team2='VFB') AND teamid <> 'VFB' |
> < größer, kleiner |
SELECT name, area, population FROM source WHERE area > 50000 AND population < 100000 |
IS NULL = Spalten enthalten einen Nullwert
Umgekehrte Ausgabe: IS NOT NULL |
SELECT * FROM source WHERE phone IS NULL |
Beispiel von 2x SELECT = Höhere Bevölkerung als Deutschland? |
SELECT name FROM source WHERE population > (SELECT population FROM source WHERE name='Germany') |
ALL SELECT = Was ist das bevölkerungsreichste Land?
Welche Spieler haben in der 2.Liga mehr Tore geschossen als die besten Spieler in der 1. Liga? (es gibt zwei Tabellen) |
SELECT name FROM source WHERE population >= ALL(SELECT population FROM source WHERE population>0)
SELECT name FROM secondleague WEHRE goals > ALL(SELECT goals FROM firstleague) |
SONSTIGES |
|
ROUND = RUNDEN 0 = 1234 1 = 1234.5 3 = 1000
|
SELECT name, ROUND (length, -3) FROM source WHERE name IN ('China', 'Germany, 'France') |
SELECT DISTINCT = Abfrage mit eindeutigen Werten = Dies zeigt die Matrikelnummern aller Studenten, die mindestens eine Vorlesung hören, wobei mehrfach auftretende Matrikelnummern nur einmal ausgegeben werden. |
SELECT DISTINCT matrikelnummer FROM source |
CONCAT = Hinzufügen |
SELECT name, CONCAT((population /SELECT population FROM world WHERE name = 'Germany')*100),'%') FROM world WHERE continent = 'Europe' |
Correlated Subquery
Beispiel 1: Größtes Land pro Kontinent
Beispiel 2: Mitarbeiter, die mehr als der Durchschnittsgehalt in ihrer Abteilung haben. |
SELECT column1, column2 FROM table1 outer WHERE column1 operator (SELECT column1 FROM table2 WHERE expr1 = outer.expr2)
Beispiel 1: SELECT continent, name, area FROM world x WHERE area >= ALL (SELECT area FROM world y WHERE y.continent=x.continent AND area>0)
Beispiel 2: SELECT last_name, salary, department_id FROM employees outer WHERE salary > (SELECT AVG (salary) FROM employees WHERE department_id = outer.department_id) |
LIMIT sinnvoll beim testen der SQL-Abfrage oder in Kombination mit ORDER BY
Andere Datenbanksysteme unterstützen auch: SELECT TOP, FETCH FIRST 3 ROWS ONLY oder sogar SELECT TOP 10 PERCENT |
SELECT* FROM source WHERE name = "Schnitzelbrötchen" LIMIT 3 |
CASE Statement
Die Ausgabetabelle enthält eine Spalte mit dem Namen "Kundenklassifizierung" mit dem entsprechenden Text. |
SELECT BestellID, Bestellmenge, CASE WHEN Bestellmenge > 20 THEN 'Großkunde' WHEN Bestellmenge = 20 THEN 'Durchschnittskunde' ELSE 'Kleinkunde' END AS Kundenklassifizierung FROM Tabelle |
COALESCE = ein NULL-Wert ersetzen durch einen anderen Wert |
SELECT name, COALESCE(mobile,'keine nummer') FROM source |
JOIN | |
JOINs werden benötigt wenn man Daten in mehreren Tabellen hat
Es gibt mehrere Arten von JOINs? (INNER) JOIN, LEFT JOIN, RIGTH JOIN, FULL JOIN
Eine der besten Erklärungen: https://learnsql.com/blog/sql-joins-made-easy/ Kurzfassung ist: LEFT/RIGHT JOINs sehr wichtig wenn die Ausgabetabelle NULL-Werte enthalten soll, z.B. Für nicht jedes Haustier kann eine Farbe ausgegeben werden. |
SELECT table1.name, table2.name FROM table1 INNER JOIN table2 ON table1.id1=table2.id2
SELECT* FROM Haustier RIGHT JOIN Farbe ON Haustier.Name = Farbe.Name (Haustier & Farbe sind Tabellen, Name ist eine ID bzw. der matching Key) |
Beispiel von zwei JOINs die beide das gleiche Ergebnis bringen |
SELECT player,teamid,stadium,mdate FROM goal JOIN game ON (matchid=id)
SELECT player,teamid,stadium,mdate FROM game JOIN goal ON (id=matchid) |
JOIN und WHERE |
SELECT table1.name, table2.name FROM table1 INNER JOIN table2 ON table1.id1=table2.id2 WHERE table1.name='Schnitzelbrötchen' |
Zweimal JOINs in einer Abfrage Notwendig wenn eine dritte Tabelle zwei andere Tabellen verlinkt |
SELECT name FROM table3 JOIN table1 ON table1.superid=table3.superid JOIN table2 ON table2.bestid=table3.bestid WHERE name = 'Schnitzelbrötchen' |
Source:
Header: istock/solarseven