4 Stimmen

Wann gibt eine Abfrage/Nebenabfrage NULL zurück und wann überhaupt keinen Wert?

  1. Wenn eine Abfrage/ Unterabfrage keine übereinstimmenden Zeilen findet, gibt sie entweder NULL oder überhaupt keinen Wert zurück, also nicht einmal einen NULL-Wert. Nach welchen Kriterien gibt eine Abfrage/ Unterabfrage ein NULL zurück und wann gibt sie keine Ergebnisse zurück, nicht einmal einen NULL-Wert?

  2. Gibt eine skalare Unterabfrage immer NULL zurück, wenn keine übereinstimmenden Zeilen gefunden werden? Ich nehme an, dass auch die äußerste skalare Abfrage NULL zurückgibt, wenn keine Zeilen gefunden werden?

  3. SELECT Vorname, Nachname, YEAR(Geburtsdatum) FROM Personen WHERE YEAR(Geburtsdatum) IN (SELECT YearReleased FROM Alben);

    • Wenn die Unterabfrage keine Ergebnisse findet, wird die WHERE-Klausel der äußeren Abfrage dann in WHERE YEAR(Geburtsdatum) IN (null); übersetzt?

    • Wenn die WHERE-Klausel stattdessen in WHERE YEAR(Geburtsdatum) IN(); übersetzt wird, sollte das nicht ein Fehlerzustand sein, da wie kann der Wert von YEAR(Geburtsdatum) mit nichts verglichen werden?

5voto

Daniel DiPaolo Punkte 53359

Die Unterabfrage würde nur dann NULL zurückgeben, wenn YearReleased NULL war, ansonsten gäbe es einen leeren Datensatz, was den von Ihnen erwähnten Fall IN () darstellt.

Es ist sehr wichtig, zwischen den beiden zu unterscheiden, da sie völlig unterschiedliche Dinge bedeuten. NULL zeigt an, dass etwas ausgewählt werden sollte, obwohl dieser Wert ein "Mangel an Wert" anzeigt. Ein leerer Datensatz zeigt an, dass nichts ausgewählt wurde, das den angegebenen Kriterien entsprach.

EDIT: aktualisiert, um Beispielergebnisse anzuzeigen

Alternativtext

Die ersten beiden Abfragen dienen lediglich zur Anzeige dessen, was in den beiden Tabellen enthalten ist. Die dritte Abfrage ist Ihre Abfrage und die vierte Abfrage zeigt nur, dass sie ein äquivalentes Ergebnis (keine Zeilen) liefert, wenn Sie die Unterabfrage durch ein NULL ersetzen. Die letzte Abfrage dient nur dazu zu zeigen, dass die Unterabfrage selbst einfach eine lange Liste von NULLs zurückgibt.

2voto

David Punkte 33347

A. Wenn es keine übereinstimmenden Zeilen gibt, wird das Ergebnis immer leer sein. Es gibt keine spezielle Behandlung für den NULL-Wert.

b. Das stimmt nicht. Wenn es keine übereinstimmenden Zeilen gibt, ist das Ergebnisset per Definition immer leer. Das Ergebnis einer skalaren Funktion ist kein Ergebnisset, daher ist es entweder NULL oder ein anderer Wert.

c.1. Wenn die Unterabfrage keine Zeilen zurückgibt, wird der "IN"-Ausdruck immer falsch zurückgeben. Das Set wird nicht NULL sein.

c.2. Es ist gültig, JAHR(Geburtsdatum) mit einem leeren Set zu vergleichen. Es wird einfach immer falsch zurückgeben.

2voto

vladtepesh Punkte 21
SELECT Vorname, Nachname, YEAR(Geburtsdatum)
FROM Personen a
left join (SELECT Erscheinungsjahr FROM Alben) b on year(b.Erscheinungsjahr) = year(a.Geburtsdatum)
where year(b.Erscheinungsjahr) = year(a.Geburtsdatum)

1voto

Kevin Martin Punkte 94

Es gibt verschiedene Arten von Unterabfragen in SQL, und welche Sie erhalten (und das resultierende Verhalten) hängt vom Kontext ab. Wenn die Syntax (Unterabfrage) verwendet wird, z.B. als Operand in den meisten Ausdruckskontexten, handelt es sich um eine skalare Unterabfrage. Andererseits handelt es sich als rechter Operand des IN-Operators um eine Tabellenunterabfrage.

Für eine skalare Unterabfrage: Wenn die Unterabfrage keine Zeilen zurückgibt, ist das Ergebnis der skalaren Unterabfrage NULL. Wenn die Unterabfrage mehr als eine Zeile zurückgibt, liegt ein Fehler vor. Gibt die Unterabfrage eine Zeile zurück, ist das Ergebnis der Wert der (einzigen) Spalte der Abfrage für diese Zeile.

Für eine Tabellenunterabfrage: Wenn die Unterabfrage keine Zeilen zurückgibt, ist das Ergebnis ein leerer Wertesatz, sodass beispielsweise die IN-Operation immer falsch zurückgeben würde. Andernfalls ist das Ergebnis der Satz der Abfrage der Spalte für alle Zeilen.

Also um Ihre Fragen einzeln anzusprechen:

  1. Es hängt vom Kontext der Unterabfrage ab

  2. Ja, eine skalare Unterabfrage gibt immer NULL zurück, wenn keine Zeilen gefunden werden

  3. Im Kontext der IN-Operation handelt es sich um eine Tabellenunterabfrage und daher bedeutet kein Zeilen keine Werte zum Abgleichen. Beachten Sie jedoch, dass aufgrund der Semantik von IN Ihr Query eine Zeile zurückgibt, in der der Spaltenwert selbst NULL ist, haben Sie ein NULL in Ihrem Vergleichssatz. Die IN-Operation ist effektiv das OR von Gleichheitsvergleichen zwischen dem linken Operanden und jedem einzelnen Wert im rechten Wertesatz. Nullwerte im Satz ergeben "unbekannt" anstelle von wahr oder falsch, und die IN-Operation kann daher nur wahr zurückgeben (wenn es eine Übereinstimmung mit einem Nicht-Nullwert im Satz gibt) oder unbekannt (weil der Wert möglicherweise null entspricht oder auch nicht).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X