2012-07-16 74 views
32

這是我最後一個關於MySQL中表連接問題的後續問題。我需要能夠從左連接表中選擇NULL值。MYSQL左加入如何選擇NULL值?

這是我加盟:

table1.id | table1.name | table2.id | table2.surname 
     1 |  John |   1 |   Doe 
     2 |  Michael |   2 |  Anderson 
     3 |  Anna |  NULL |   NULL 
     4 |   Sue |  NULL |   NULL 

我希望選擇WHERE table2.surname = NULL,但這樣行不通的查詢

SELECT table1.*,table2.* 
FROM table1 
LEFT JOIN table2 
    ON table1.id=table2.id 
WHERE table2.surname=NULL 

我可以有所瞭解它背後的邏輯不給我任何結果,但必須有辦法抓住他們的結果?

感謝所有幫助

回答

39

比較NULL值,您必須使用IS NULL斷言,這樣的:

SELECT table1.*, table2.* 
FROM table1 
LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL 
+0

與問題沒有直接關係,但是您必須使用'WHERE'子句,而不是連接中的'AND'子句來獲取有意義的值。這讓我沮喪。 – HartleySan 2018-02-18 19:56:29

4

嘗試:

SELECT table1.*,table2.* 
FROM table1 
    LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL 
12

你必須使用IS NULL代替= NULL

WHERE table2.surname IS NULL 

你之所以不能簡單地做= NULL是因爲NULL本質上是一個「未知」,不能等於不等於任何東西(甚至沒有自己),所以試圖比較它,好像它應該是完全匹配,只會返回NULL而不是預期的布爾值01,這正是您的查詢返回空結果的原因。

「未知」「等於未知」有明顯區別。你一定能測試某未知或未知的,但如果事情「等於」你不能測試未知的,因爲未知的未知,一下子就沒有意義。另外,由於您使用的是MySQL,所以另一種選擇是使用table2.surname <=> NULL,其中<=>是一個MySQL專用的NULL安全比較運算符,但儘量不要使用它,只是堅持使用標準SQL方式(IS NULL/IS NOT NULL

1

根據MySQL specification你應該使用「IS NULL」而不是「= NULL」。 它說「(NULL = NULL)等於NULL」。但是,當它用作布爾值時,NULL等於False。