📖DQL - Komplexere Abfragen
⚡️ Ausprobieren
Öffne diese Beispiel-Datenbank in einem neuen Fenster: https://www.w3schools.com/sql/trysqlserver.asp?filename=trysql_func_sqlserver_concat
Hier kannst du direkt im Browser SQL Statements ausprobieren. Probiere die Beispiele hier mit einem ⚡️-Symbol aus.
Aggregatfunktionen
Mit Aggregatfunktionen werden Werte über mehrere Datenzeilen hinweg zusammengefasst (Multiple-Row-Funktionen). NULL
-Werte werden dabei ignoriert.
Ohne Gruppierung: Alle Ergebniszeilen werden zu einem Wert zusammengefasst.
Mit Gruppierung: Ein Ergebniswert pro Gruppe.
Funktion
Beschreibung
SUM()
Summe
MIN()
Kleinster Wert
MAX()
Grösster Wert
COUNT()
Anzahl (die nicht NULL
sind)
AVG()
Durchschnittswert
STDEV()
Standardabweichung
VAR()
Varianz
-- Kleinster, grösster und durchschnittlicher Wert einer Spalte
SELECT AVG(spalte1) AS Durchschnitt,
MIN(spalte1) AS Minimum,
MAX(spalte1) AS Maximum
FROM tabelle;
-- Anzahl Werte einer Spalte
SELECT COUNT(*) AS Anzahl
FROM tabelle;
-- Anzahl Werte einer Spalte (inkl. NULL-Werte)
SELECT COUNT(ISNULL(spalte1,'leer')) AS Anzahl
FROM tabelle;
⚡️ Ausprobieren
Schreibe ein SQL-Statement, welches den Durchschnittspreis, den kleinsten und grössten Preis aller Produkte anzeigt.
Schreibe ein SQL-Statement, welches die Anzahl der Produkte zurück gibt, die teurer als 40$ sind.
Gruppierung
Gruppenbildung nach einer oder mehreren Spalten
Für jede Ausprägung wird eine Gruppe und damit eine Ergebniszeile gebildet
Jede Spalte ohne Aggregatfunktion in der
SELECT
-Klausel muss in derGROUP BY-
Klausel enthalten sein
-- Kleinster, grösster und durchschnittlicher Wert einer Spalte pro Gruppe
SELECT spalte1 AS Gruppe
AVG(spalte2) AS Durchschnitt,
MIN(spalte2) AS Minimum,
MAX(spalte2) AS Maximum
FROM tabelle
GROUP BY spalte1;
SELECT spalte1, spalte2
AVG(spalte3) AS Durchschnitt,
MIN(spalte3) AS Minimum,
MAX(spalte3) AS Maximum
FROM tabelle
GROUP BY spalte1, spalte2;
Gruppierung einschränken
Um Gruppierte Werte einzuschränken, gibt es die HAVING
Klausel. Dabei gilt zu merken:
Die
WHERE
-Klausel kommt vor der GruppierungHAVING
schränkt nach der Gruppierung ein (Selektionskriterium auf Aggregate)
SELECT spalte2 AS Gruppe,
AVG(spalte1) AS Durchschnitt,
MIN(spalte1) AS Minimum,
MAX(spalte1) AS Maximum
FROM tabelle
WHERE spalte1 > 10
GROUP BY spalte2
HAVING AVG(spalte1) > 20;
⚡️ Ausprobieren
Schreibe ein SQL-Statement, welches den Durchschnittspreis, den kleinsten und grössten Preis aller Produkte anzeigt, gruppiert nach Kategorie.
Ergänze das Statement, sodass nur noch die Gruppen angezeigt werden, bei welchen der Durchschnittspreis über 25$ liegt.
Unterabfragen
Unterabfragen kommen immer dann zum Einsatz, wenn das Ergebnis einer Abfrage als Kriterium für eine andere Abfrage verwendet werden muss. Unterabfragen werden immer in runde Klammern gesetzt und stehen immer auf der rechten Seite des Vergleichsausdrucks.
SELECT spalte1, spalte2, spalte3
FROM tabelle1
WHERE spalte2 > (SELECT spalte1
FROM tabelle2);
Regeln für Unterabfragen
Unterabfragen dürfen bei single-row-Vergleichsoperatoren nur eine Spalte und eine Ergebniszeile liefern (sonst kommt es zu einem Fehler)
Bei Verwendung von
IN
,ANY
undALL
können mehrere Ergebniszeilen geliefert werdenUnterabfragen können auf mehreren Ebenen geschachtelt werden
Die innere Abfrage wird immer einmal vor der äusseren Abfrage gestartet
Ein Unterabfrage kann sich auf dieselbe Tabelle wie die Hauptabfrage oder auch auf beliebige andere Tabellen beziehen
Korrelierte Unterabfragen
Bei der korrelierten Unterabfrage wird in der Unterabfrage auf eine Spalte aus der Hauptabfrage verwiesen. Aus Performancegründen nicht immer sinnvoll (JOIN unter Umständen geeigneter).
SELECT spalte1, spalte2, spalte3
FROM tabelle1 AS a
WHERE spalte2 > (SELECT spalte1
FROM tabelle2 AS b
WHERE a.spalte1 = b.spalte2);
⚡️ Ausprobieren
Schreibe ein SQL-Statement, welches alle Produkte ausgibt, die teurer als der Durchschnittspreis sind.
Alle Produkte, deren Supplier aus den USA kommt.
Produkte, welche total schon mehr als 350 mal bestellt wurden
Unterabfragen in der FROM-Klausel
JOIN
mit einer Unterabfrage. Die gejointe Unterabfrage kann als virtuelle Tabelle betrachtet werden und wird auch als Inline-View bezeichnet. Wichtig ist, dass die Inline-View einen Alias-Namen erhält.
SELECT spalte1, spalte2, spalte3
FROM tabelle1
INNER JOIN (SELECT spalte1, spalte2
FROM tabelle2) AS tabelle3
ON tabelle1.spalte1 = tabelle3.spalte1
WHERE tabelle1.spalte3 < tabelle3.spalte2;
Mengen-Operationen
UNION [ALL]
Verbindet mehrereSELECT
-Anweisungen zu einem GesamtergebnisALL
: Duplikate aus den verschiedenen Anweisungen werden nicht unterdrückt.INTERSECT
Bringt alle Zeilen, die jede der SELECT-Anweisungen zurückliefert. Dies ist die Schnittmenge.EXCEPT
Bringt alles aus der ersten SELECT-Anweisung, das in der folgenden Anweisung nicht vorkommt. Unter OracleMINUS
.
Regeln für Mengen-Operationen
Die erste
SELECT
-Anweisung gibt vor:Spaltennamen
Reihenfolge
Datentypen
Spaltenanzahl und Datentypen müssen bei allen Anweisungen übereinstimmen
ORDER BY
kommt erst nach der letzten AnweisungWHERE
-Klausel in jeder Anweisung separat
SELECT spalte1, spalte2, spalte3
FROM tabelle1
UNION
SELECT spalte1, spalte2, spalte3
FROM tabelle2;
⚡️ Ausprobieren
Gebe die Namen und Adressen von allen Kunden und Lieferanten in einer Tabelle aus.
Gebe alle Städte aus, in welchen Kunden leben, aber keine Lieferanten.
Last updated
Was this helpful?