Exkurs - Subselect

Eine typische Anfrage könnte sein: Welcher Ort hat die meisten Einwohner in Deutschland? Das Ergebnis kennst Du sicher...

SQL Fenster Eine einfache Lösung zur Überprüfung könnte folgender SQL-Befehl sein:

SELECT ort.Name, ort.Landesteil, ort.Einwohner
  FROM ort, land
 WHERE ort.LNR = land.LNR
   AND land.Name = 'Deutschland'
 ORDER BY Einwohner DESC
Kopf der Ergebnistabelle des Order-By-Befehls

Aus der Ergebnistabelle lässt sich leicht Berlin als größte Stadt Deutschlands herauslesen. Viel schöner wäre es ja allerdings, wenn nur ein Datensatz, also Berlin, angezeigt wurde. Das ist aber nicht so einfach möglich.

SQL Fenster Vielleicht hast du ja folgenden SQL-Befehl dafür im Sinn, er führt aber nicht zum gewünschten Ergebnis. Kannst du erklären warum?

SELECT ort.*, MAX(ort.Einwohner) AS "größte Einwohnerzahl"
  FROM ort, land
 WHERE ort.LNR = land.LNR
   AND land.Name = 'Deutschland'
falsches Ergebnis des MAX-Befehls ohne GROUP BY

Um wirklich den Ort mit den meisten Einwohnern herauszufinden, muss genau der Datensatz gefunden werden, der die meisten Einwohner besitzt. Dafür muss man diese Zahl erst einmal bestimmen:

SELECT MAX(ort.Einwohner) AS "größte Einwohnerzahl"
FROM  ort, land
WHERE ort.LNR = land.LNR
  AND land.Name = 'Deutschland'

-- Mit diesem Ergebnis kann man nun weitersuchen:
SELECT ort.*
FROM  ort, land
WHERE ort.LNR = land.LNR
  AND land.Name = 'Deutschland'
  AND ort.Einwohner =  	3469849  -- Einwohnerzahl von Berlin

Genau diese beiden Schritte lassen sich auch in einen SQL-Befehl zusammenfassen:

SELECT ort.*
  FROM ort, land
 WHERE ort.LNR = land.LNR
   AND land.Name = 'Deutschland'
   AND ort.Einwohner =
      (SELECT MAX(ort.Einwohner) 
         FROM ort, land 
        WHERE ort.LNR = land.LNR
		  AND land.Name = 'Deutschland')

Du erkennst sicherlich den SELECT-Befehl, der sich wiederum in der WHERE-Bedingung befindet.

Einzelne Werte für die WHERE-Bedingung oder auch Tabellen für den FROM-Teil können wiederum dem Ergebnis eines SELECT-Befehls entspringen. Man nennt solche geschachtelten SELECT-Befehle auch Subselect-Anweisungen.

X

Fehler melden

X

Suche