2017-02-14 26 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') 

它們看起來和我一樣,因爲MAX(c2.age)大於或等於列年齡中的所有值,並且如果c.age大於MAX(c2.age),則它大於所有值。爲什麼下面的SQL查詢不等效?

+1

請標記dbms – McNets

回答

10

如果snowboard沒有匹配,則第一個返回所有行,第二個返回none。

第一種邏輯遵循「全部」的口語定義。如果沒有匹配,則任何值都大於子查詢中的(不存在的)值。注意:這在NULL(至少在SQL Server中)中也是如此。

當沒有匹配時,第二個查詢返回NULL。基本上,與NULL的比較永遠不會返回真實 - 好吧,有幾個例外。

提示未來的:如果兩個查詢看起來他們是相同的,但不返回相同的值,那麼兩件事情之一,通常是罪魁禍首:

  • NULL值涉及
  • 其中一個表是空的
+0

Ohhhh哈哈,明白了。我在中期得到了一個錯誤。我認爲,對於已經學習SQL一個月的學生來說,檢測這個問題的缺陷是非常困難的。 – daniel

+0

若要詳細說明您的聲明,任何與NULL的比較都會返回值UNKNOWN,因爲SQL使用三個值邏輯。 – daniel

+0

@丹尼爾。 。 。 。那是對的。顯然,'NULL'大於一個不存在的值。好奇的是,因爲'NULL> NULL'計算爲'NULL'。 –