3.1. Syntax
/
Im Prinzip besteht das SELECT Statement aus sechs Komponenten
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Zwei Punkte sind äußerst wichtig und sollten immer vor Augen gehalten werden:
* Die Reihenfolge der Kompnenten ist fix vorgegben; eine GROUP BY Komponente darf nicht vor einer WHERE oder vor einer FROM Klausel stehen.
* Eine HAING-Komponente darf nur dann verwendet werden wenn eine GROUP BY Komponente verwendet wird.
FROM
definiert die Ausgangstabellen
WHERE
selektiert die Reihen, die der Bedingung genügen
GROUP BY
gruppiert Reihen auf Basis gleicher Werte in Spalten
HAVING
selektiert Gruppen, die der Bedingung genügen
SELECT
selektiert Spalten
ORDER BY
sortiert Reihen auf der Basis von Spalten
3.2. Verarbeitung einer SELECT ANWEISUNG
Ausgabe aller Kundennummer die 1993 mehr als einen Einkauf getätigt haben.
SELECT Kunden#
FROM Auftrag
WHERE DATUM > 01011993
GROUP BY Kunden#
HAVING COUNT(RE#) >1
ORDER BY Kunden#
3.2.1. FROM
In der FROM-Komponente wird nur die Tablle Auftrag genannt. Die bedeutet für SQL, daß mit der Tabelle AUFTRAG gearbeitet werden muß. Das Zwischenergebnis dieser Operation ist eine exakte Kopie der Tabelle AUFTRAG
Zwischenergebnis:
RE# Kunden# Datum status
1 1 1990-01-01 fa
2 1 1993-05-19 fa
3 3 1993-05-19 fa
4 2 1993-05.17 fa
5 3 1993-07-19 fa
3.2.2. WHERE
In der WHERE Komponente ist die Bedingung \'DATUM > 01011993\' angeben. Alle Reihen, in denen der Wert der Spalte DATUM größer als 01011993 ist, genügen dieser Bedingung. alle diese Reihen zusamen bilden das Zwischenergebnis der WHERE Komponente.
RE# Kunden# Datum status
2 1 1993-05-19 fa
3 3 1993-05-19 fa
4 2 1993-05.17 fa
5 3 1993-07-19 fa
3.2.3. GROUP BY
Die GROUP BY Komponennte gruppiert alle Reihen im Zwischenerbnis. Das Gruppieren erfolgt auf der Basis von Werten in der Spalte KUNDEN#. Reihen werden gruppiert wenn sie in der Betreffenden Spalte den gleichen Wert haben
Zwischenergbnis
RE# Kunden# Datum status
2 1 1993-05-19 fa
3,5 3 1993-05-19,1993-07-19 fa,fa
4 2 1993-05.17 fa
3.2.4. HAVING
Die vierte Komponente kann in gewissen Sinne mit der WHERE Komponente verglichen werden. Der Unterschied liegt darin, daß WHERE sich auf das Zwischenergbnis der FROM Komponete bezieht, während HAVING auf das gruppierte Zwischenergbnis der GROUP BY Komponente Bezug nimmt. Der Effekt ist jedoch der gleiche, auch in der HAVING-Komponente werden Reihen mit Hilfe einer Bedingung selektiert. In diesem Fall handelt es sich dabei um die Bedinung:
COUNT(RE#)>1
Das bedeutet: Alle Reihen, die mehr als eine Rechnungsnummer enthalten, genügen der Bedinung.
Zwischenerbnis:
RE# Kunden# Datum status
3,5 3 1993-05-19,1993-07-19 fa,fa
3.2.5. Select
In der SELECT Komponente wird angegeben welche Spalten im endgütigen Ergebnis wiedergeben werden müssen. Die Select-Kompontente wählt also die Spalten aus.
Kunden#
3
3.2.6. Order by
Hier wird am Inhalt des Zwischenerbnisses nichts mehr verändert. Die Ergbniszeilen werden lediglich noch in die angegeben Reihenfolge sortiert. Da aber Aufgrund der Beispieldaten nur eine Zeile überig bleibt, ist die Order by Komonente in diesem Fall belanglos
Die Where - Komponente
Die Where Komponente kann folgende Formen haben
* der einfache Vergleich
* Bedingungen mit AND, OR, oder NOT aneinanderkoppeln
* der BETWEEN - Operator
* der IN-Operator
* der LIKE Operator
* der NULL Operator
* der IN-Operator Unterabfrage (Subquery)
* der Vergleichsoperator mit Unterabfrage
Der einfache Vergleich
Ein einfacher Vergleich wird durch einen Ausdruck gebildet, auf den ein Operator und Wiederum ein Ausdruck folgt. Der Wert auf der linken Seite des Operators wird mit dem Ausdruck auf der rechten Seite verglichen. Vom Operator hängt es ab, ob die Bedingung WAHR, UNWAHR oder NULL ist
SQL kennt folgende Vergleichsopeatoren:
Vergleichsoperator Bedeutung
= gleich
< kleiner als
> größer als
= größer als oder gleich
nicht gleich
(Der Vergleichsoperator wird in einigen SQL-Implementierungen auch als -= oder != wiedergegeben.)
Beispiele
Gib die Kundennummer aller Kunden an, die in Perchtoldsdorf wohnen.
SELECT Kunden#
FROM Kunde
WHERE PLZ = 2380
Gib die Bezeichnung, den Preis, die Menge der einzelnen Artikel an wo der Lagerwert 1.000 S übersteigt
SELECT Bezeichnung, Preis, Bestand
FROM Artikel
WHERE Preis * Bestand > 1000
Bedingungen mit AND, OR, oder NOT aneinanderkoppeln
Eine WHERE - Komponente kann mehrere Bedingungen enthalten, wenn die Operatoren AND, OR und NOT verwendet werden.
Beispiele
Gib die Kundennummer aller Kunden an die in Wien wohnen oder deren Kundennummer kleiner 100 ist.
SELECT Kunden#
FROM Kunde
WHERE PLZ>=1010 AND PLZ1
Gib die Rechnungsnummen an, bei welchlen die größte menge die Eingekauft wurde 20 überstiegen hat.
SELECT re#
FROM pos
GROUP BY re#
HAVING max(Menge)>20;
Gib die Rechnungsnummern an, bei welchen die Summe der Menge die Gekauft wurde größer 100 war
SELECT re#
FROM pos
GROUP BY re#
HAVING SUM(MENGE)>100
Gib die Rechnungsnummern an, wo der durchschnitt der eingkauften ware kleiner 10 war
SELECT re#
FROM pos
GROUP BY re#
HAVING AVG(MENGE) |