SELECT-FROM SELECT dient dazu, aus einer vorhandenen Datenbank bestimmte Spalten und Zeilen auszugeben es handelt sich also um eine Auswahlabfrage. Inhaltsverzeichnis 1 Der grundlegende Aufbau 2 Doppelte Werte 3 WHERE-Teil 4 FROM-Teil 5 Sortieren 6 Umbenennen 7 Verbinden von Relationen 8 NULL-Werte 9 Geschachtelte Anweisungen 10 Gruppieren der Ergebnisse 11 Quelle Der grundlegende Aufbau SELECT Attribut1, Attribut2 FROM Relation1, Relation2 wobei es sich bei den Attributen vereinfacht gesagt um Spalten handelt und bei den Relationen um Tabellen. Um alle vorhandenen Attribute ausgeben, kann man den Operator * verwenden: SELECT * FROM Relation1, Relation2 Doppelte Werte Um doppelte Werte zu vermeiden, ergänzt man das Schlüsselwort DISTINCT :
SELECT DISTINCT Attribut1, Attribut2 FROM Relation1, Relation2 Das Gegenteil bewirkt das Schlüsselwort ALL, welches aber nicht angegeben werden muss, da es sich um die Standardeinstellung handelt. WHERE-Teil Dieser Teil gibt Bedingungen an, die das Ergebnis erfüllen muss, z. B.: SELECT kontonr FROM konto WHERE kontostand > 1000 AND filialname="josefstadt" Es können Bedingungen durch folgende logische Ausdrücke kombiniert werden: AND, OR, NOT, BETWEEN SELECT kontonr FROM konto WHERE kontostand BETWEEN AND 1000 Um nach Zeichenketten zu filtern, bietet SQL u. a. folgende spezielle Operanten: Prozent ( % ): eine beliebige Anzahl von Zeichen Unterstrich ( _ ): ein beliebiges Zeichen Außerdem wird bei String-Abfragen das Wort Like anstelle des = verwendet. Dies würde dann z. B. so aussehen: SELECT kundenname FROM kontoinhaber WHERE kundenname LIKE "%Huber%" Um wirklich nach dem Prozent-Zeichen zu suchen, geht man wie folgt vor:...like "Huber\%" ESCAPE "\" FROM-Teil Der FROM-Teil listet alle Relationen (meist Tabellen) auf, die in die Abfrage
involviert sind. Diese Tabellen müssen über den WHERE-Teil verknüpft werden! Bei gleichlautenden Attributnamen müssen diese durch Vorstellen des Relationsnamens und einem Punkt qualifiziert werden (Also z. B. anstelle von kontonr dann konto.kontonr ). SELECT kundenname, kontoinhaber.kontonr, kontostand FROM konto, kontoinhaber WHERE konto.kontonr = kontoinhaber.kontonr AND filialname="neubau" Sortieren Die Ergebnisse können mit ORDER BY sortiert werden. Das Schlüsselwort ASC (Default-Wert) bewirkt eine aufsteigende, DESC eine absteigende Sortierung: SELECT kundenname, kontoinhaber.kontonr, kontostand FROM konto, kontoinhaber WHERE konto.kontonr = kontoinhaber.kontonr AND filialname="neubau" ORDER BY kundenname ASC Umbenennen Sowohl Attribute (Spalten) als auch Relationen (Tabellen) können unbenannt werden. Dazu verwendet man das Schlüsselwort AS : SELECT kundenname AS kunde, kundenliste.kontonr, kontostand FROM kontoinhaber AS kundenliste, konto AS K WHERE K.kontonr = kundenliste.kontonr Dies ist auch ein Weg, um Abfragen auf sich selbst durchzuführen man verwendet im FROM-Teil zwei mal die gleiche Tabelle, benennt diese allerdings anders.
Verbinden von Relationen Mit Mengen-Operatoren kann man Ergebnisse mehrerer Relationen zusammen fassen. Hier gibt es folgende Varianten: UNION: Entspricht einem logischen OR, z. B.: Alle Kunden, die ein Konto, einen Kredit oder beides haben : (SELECT kundenname FROM kontoinhaber) UNION (SELECT kundenname FROM kreditnehmer) INTERSECT: Entspricht einem logischen AND, z. B.: Alle Kunden, die ein Konto und einen Kredit haben : (SELECT kundenname FROM kontoinhaber) INTERSECT (SELECT kundenname FROM kreditnehmer) EXCEPT: Alle Ergebnisse der 1. Relation, die nicht in der 2. Relation vorkommen, z. B.: Alle Kunden, die ein Konto aber keinen Kredit haben : (SELECT kundenname FROM kontoinhaber) EXCEPT (SELECT kundenname FROM kreditnehmer) NULL-Werte Wenn eine Information in einem Datensatz in einer Spalte fehlt, hat dieses Feld einen speziellen Wert, den NULL-Wert. Diese sind speziell zu behandeln: Arithmetische Ausdrücke, die NULL beinhalten, liefern als Ergebnis immer NULL (NULL + 3 = NULL) und in Aggregatfunktionen (z. B. Anzahl der Datensätze) wird NULL nicht mitgezählt. Auch die Behandlung in Vergleichsausdrücken ist anders, z. B.: SELECT kundenname FROM kontoinhaber WHERE betrag IS NULL
Geschachtelte Anweisungen Man kann auch Unter-Abfragen verwenden, um z. B. Mengen-Mitgliedschaften zu testen. Wenn man eine Unter-Abfrage (also ein SELECT-FROM) in einer Abfrage verwendet, nennt man dies Nested Subquery. Mögliche Schlüsselwörter zum Verknüpfen sind IN und NOT IN : z. B.: Alle Kunden, die ein Konto aber keinen Kredit haben : SELECT kundenname FROM kontoinhaber NOT IN (SELECT kundenname FROM kreditinhaber) Gruppieren der Ergebnisse Um Ergebnisse zu aggregieren, gibt es u. a. folgende Möglichkeiten: AVG: Durchschnittswert MIN: Minimum-Wert MAX: Maximum-Wert SUM: Summe der Werte COUNT: Anzahl der Werte Das jeweilige Schlüsselwort stellt man nach SELECT. Z. B. Die Anzahl aller Konten der Bankfiliale mit dem Namen Josefstadt' : SELECT COUNT (kontonummer) FROM konto WHERE filialname = "Josefstadt" Um doppelte Ergebnisse auszuschließen, verwendet man wiederum das Schlüsselwort DISTINCT. Z. B. Die Anzahl der Kunden der Filiale Josefstadt' : SELECT COUNT (DISTINCT kundennummer) FROM kunde WHERE filialname = "Josefstadt"
Um die Ergebnisse zu gruppieren, verwendet man das Schlüsselwort GROUP BY. Wichtig ist, dass die Attribute der SELECT-Anweisung, die nicht in der Aggregat-Funktion verwendet werden, in der GROUP BY-Anweisung auftauchen müssen (denn entweder in aggregiere diese oder es ist ein Attribut, nach welchem ich gruppiere). Z. B. Die Anzahl der Kontoinhaber für jede Filiale : SELECT filialname, COUNT (kontonummer) FROM konto GROUP BY filialname Falls man im Falle einer Aggregatsfunktion diese danach noch filtern möchte, verwendet man Ausdruck HAVING: Z. B. Die Anzahl der Kontoinhaber für jede Filiale; allerdings nur die Filialen, die mehr als 1000 Kontoinhaber haben : SELECT filialname, COUNT (kontonummer) FROM konto GROUP BY filialname HAVING COUNT (kontonummer) > 1000 Quelle Schikuta, Erich: Datenmodellierung und Datenbanksysteme, FFH, 2008