2017-02-14 37 views
7
SELECT c.cname 
FROM Customers c 
WHERE c.age > ALL (SELECT c2.age 
FROM Customers c2 
WHERE c2.type = 'snowboard'); 

SELECT c.cname 
FROM Customers c 
WHERE c.age > (SELECT MAX(c2.age) 
FROM Customers c2 
WHERE c2.type = 'snowboard') 

Wyglądają tak samo, ponieważ MAX (c2.age) jest większy lub równy niż wszystkie wartości w kolumnie wieku, a jeśli c.age jest większy niż MAX (c2.age), to jest większy niż wszystkie wartości.Dlaczego następujące zapytania SQL nie są równoważne?

+1

Proszę oznaczyć dbms – McNets

Odpowiedz

10

Jeśli nie ma dopasowań dla snowboard, to pierwszy zwraca wszystkie wiersze, a drugi zwraca brak.

Logika pierwszego odpowiada potocznej definicji "wszystkich". Jeśli nie ma dopasowań, każda wartość jest większa niż (nieistniejąca) wartość z podzapytania. Uwaga: Dotyczy to nawet NULL (przynajmniej w SQL Server).

Drugie zapytanie zwraca NULL, gdy nie ma dopasowań. Zasadniczo porównania z NULL nigdy nie zwracają wartości true - cóż, jest kilka wyjątków.

wskazówka na przyszłość: jeśli dwa zapytania wyglądają jak są one takie same, ale nie zwraca te same wartości, a następnie jeden z dwóch rzeczy jest zazwyczaj winowajcą:

  • NULL wartości jest zaangażowany
  • Jeden z tabel jest pusty
+0

Ohhhh lol, rozumiem. Mam jedno złe zdanie w średnim okresie. Myślę, że wykrycie wady tego pytania jest bardzo trudne dla studentów, którzy studiują SQL przez 1 miesiąc. – daniel

+0

Aby rozwinąć roszczenie, każde porównanie z wartością NULL zwraca wartość NIEZNANE, ponieważ SQL używa logiki o trzech wartościach. – daniel

+0

@ Daniel. . . .To jest poprawne. Wygląda jednak na to, że 'NULL' jest większe niż nieistniejąca wartość. Ciekawe, ponieważ 'NULL> NULL' zwraca wartość' NULL'. –