====== Sub-Select ======
Ein Subselect ist eine Selectanweisung die in der WHERE, HAVING oder FROM Klausel einer anderen SELECT-Anweisung eingebettet wird. Je nach Anzahl der Ergebniszeilen der Subselectanweisung wird zwischen Singlerow-Subselect und Multirow-Subselect unterschieden. Beide Arten unterscheiden sich in den erlaubten Operatoren die auf das Ergebnis angewendet werden dürfen.
===== Richtlinien =====
* Sub-Select immer in Klammern
* kein ORDER BY
* Singlerow bzw. Multirow benötigen spezielle Operatoren
* Spaltenanzahl muss übereinstimmen
* Sub-Select kann auf andere Tabellen als Haupt-Select zugreifen
* Mehrere Subselects innerhalb eines Hauptselects erlaubt
* Schachtelung ebenfalls erlaubt
* Joins in Subselects
* Set-Operatoren
===== Singlerow-Subselects =====
Bei diesen Subselects wird immer nur genau 1 Ergebniszeile zurückgeliefert welche mit Vergleichsoperatoren (<, >, =, ...) kontrolliert werden kann. Das Subselect ist fehlerhaft, wenn keine bzw. mehrere Ergebniszeilen zurückgeliefert werden.
===== Multirow-Subselects =====
* Liefert 1 oder mehrere Ergebniszeilen
* Fehler bei 0 Ergebniszeilen
* Benötigt spezielle Operatoren als Zusatz zu den Vergleichsoperatoren
===== Multirow-Operatoren =====
{{:dbs:sql:multirow_operatoren.png?direct&|}}
===== Vergleich Multirow - Singlerow Operatoren =====
{{:dbs:sql:multi_single_vergl2.png?direct&|}}
===== Sub-Selects die mehrere Spalten liefern =====
Bei diesen Subselects muss die Reihenfolge und der Datentyp der Spalten zwischen Unter- und Hauptabfrage beachtet werden. Es wird immer paarweise verglichen (A1 mit B1, A2 mit B2, ...)
===== Beispiele =====
==== Normales Sub-Select ====
{{:dbs:sql:mitarbeitertabelle_violett.png?direct&|}}
Aufgabe: Zeige Name und Gehalt aller Mitarbeiter, die in der gleichen Abteilung wie der Mitarbeiter mit der Nummer 1 arbeiten.
SELECT Name, Gehalt
FROM Mitarbeiter
WHERE Abteilungsnummer = (SELECT Abteilungsnummer
FROM Mitglied
WHERE Mitarbeiternummer = 1)
==== Sub-Select mit Multirow-Operator ====
Aufgabe: Erstelle eine Abfrage die alle Mitarbeiternamen anzeigt, deren Gehalt höher ist als der Abteilungsdurchschnitt aller Abteilungen.
SELECT Name
FROM Mitarbeiter
WHERE Gehalt >ALL (SELECT AVG(Gehalt)
FROM Mitarbeiter
GROUP BY Abteilungsnummer)
===== Sub-Select mit mehreren Spalten =====
Aufgabe: Zeige Name, Abteilungsnummer und Gehalt aller Mitarbeiter an, die gleich viel verdienen wie Smith und noch dazu in der gleichen Abteilung arbeiten.
SELECT Name, Abteilungsnummer, Gehalt
FROM Mitarbeiter
WHERE (Abteilungsnummer, Gehalt) IN (SELECT Abteilungsnummer, Gehalt
FROM Mitarbeiter
WHERE Name = 'Smith')