SQL

SELECT-FROM

9. 06. 2012

„SELECT“ dient dazu, aus einer vorhandenen Datenbank bestimmte Spalten und Zeilen auszugeben – es handelt sich also um eine Auswahlabfrage.

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 0 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

image_print
1 Stern2 Sterne3 Sterne4 Sterne5 Sterne
Loading...

Author

Related Posts