Unterabfrage

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen nur teilweise:

Korrektheit: 2
(teilweise überprüft)
Umfang: 1
(zu gering)
Quellenangaben: 2
(wichtige Quellen fehlen)
Quellenarten: 1
(ausreichend)
Konformität: 3
(gut)


Definition

Um in SQL eine verschachtelte SQL-Select-Abfrage zu machen, werden die sog. Sub-Querys dafür verwendet. Sie tragen dazu bei, das eine Anfrage komplexer wird. Ein anderes Wort für Subqueries wäre die Unterabfrage. Subqueries tragen dazu bei, dass man einen genauren Blick in die Datenstruktur einer Datenbank bekommt. Ein Subquerie kann mit den Befehlen SELECT, JOIN, WHERE und GROUP BY getätigt werden.

Beispiele

Mit den folgenden Beispielen soll klar gemacht werden, in welchen Situationen man einen Subquerie benützt.

Unterabfrage mit IN bzw. NOT IN

Es wird nach Artikeln gesucht, die keine Aufträge haben

Beispiel:

SELECT artikel_nr, bezeichnung
FROM artikel
WHERE artikel_nr not in
   (
   SELECT artikel_nr 
   FROM auftrag_pos
   );

Man kann hier sehr gut sehen, dass der Sub-Query die SELECT Abfrage in den Klammern nach dem NOT IN ist. In diesem Beispiel wird eine neue Zwischenmenge erzeugt für jede Zeile in "ARTIKEL" , die alle Artikelnummern (artikel_nr) aus der Tabelle "AUFTRAG_POS" enthält. Dann wird für jede Zeile geprüft, ob die Artikelnummer, in der Zwischenmenge enthalten ist. Man hätte diesen Sub-Querie auch noch mit einem WHERE erweitern können.

Problematisch ist die NOT IN Abfrage deshalb, weil die erzeugte Zwischenmenge unnötig groß wird und deshalb aus performance-technischen Gründen nicht ausgeführt werden sollte.

Unterabfrage mit EXISTS bzw. NOT EXISTS

Das selbe Beispiel noch einmal, nur dieses mal mit NOT EXSITS:

Beispiel:

SELECT artikel_nr, bezeichnung
FROM artikel a
WHERE not exists
   (
   SELECT artikel_nr 
   FROM auftrag_pos ap
   WHERE ap.artikel_nr = a.artikel_nr
   );

Diese Abfrage ist deutlich kleiner, da keine so große Zwischenmenge erzeugt wird. In diesem Beispeil werden die Artikelnummer (arikel_nr) der beiden Tabellen miteiander verglichen, um somit zu schauen ob es einen Auftrag zu finden, der mit keiner Artikelnummer verbunden ist.

Unterabfrage mit "="

Es wird nach Aufträge gesucht, welchen den höchsten Umsatz erzeugt haben:

Beispiel:

SELECT auftrag_nr
FROM auftrag_pos
WHERE anzahl * preis =
   (
   SELECT MAX(SUM(anzahl*preis))
   FROM auftrag_pos
   GROUP BY auftrag_nr
   );

Der "=" Operator kann auch für Unterabfragen verwendet werden. Im oberen Beispiel wird geschaut, welcher Auftrag den höchten Umsatz erzielt hat in dem durch MAX(SUM(anzahl*preis) die maximale höchste Summe eines Auftrags ermittelt wird.

Quellen