Seitenleiste

Community

SQL

Grundlagen

Datenbanksysteme

Client/Server

Eingebettet

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

Vergleich Multirow - Singlerow Operatoren

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


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')