2013-09-30 22 views
2

爲什麼如果我把=它帶給我正確的結果,當我把!=它給我帶來了完整的列表,而不是不同的。「!=」不是「=」的對立面嗎?

SELECT  * 
FROM  library, crime_data 
WHERE  crime_data.id=$oreo 
AND  crime_data.isbn != library.isbn 
AND  crime_data.visibility='0' 
GROUP BY library.isbn 

我在做什麼錯?

+3

使用'<>'代替 – Math

+2

SELECT * FROM library,crime_data是一個交叉連接。應用這個,看看自己=和!之間的區別= –

+1

嘗試用純文本描述你在以這種方式在連接中使用'!='時想要做什麼。 – bendataclear

回答

2

方式!==涉及很容易看到a simple example

SELECT 
    1=1, 
    1=2, 
    1=NULL, 
    NULL=NULL, 

    1<>1, 
    1<>2, 
    1<>NULL, 
    NULL<>NULL 

(我使用的是標準的<>運營商,而不是MySQL的具體一個!=,但they're equivalent)。

+-----+-----+--------+-----------+------+------+---------+------------+ 
| 1=1 | 1=2 | 1=NULL | NULL=NULL | 1<>1 | 1<>2 | 1<>NULL | NULL<>NULL | 
+-----+-----+--------+-----------+------+------+---------+------------+ 
| 1 | 0 | NULL |  NULL | 0 | 1 | NULL |  NULL | 
+-----+-----+--------+-----------+------+------+---------+------------+ 

那麼,crime_data.isbn = library.isbncrime_data.isbn != library.isbn不包含該行總行的結合;它排除了至少有一個運算符爲NULL的所有行。

8

您必須從概念上思考SQL從集合論角度出發的問題。當你連接兩個表時,這個概念是一個笛卡爾連接 - 表A的每一行都與表B的每一行連接在一起。所以如果你有10行的表和20行的表並加入它們,你會得到200行。

現在,當您選擇僅使用「=」行的值相等時,通常很少選中。當你使用「!=」時,選擇所有OTHER行。


編輯回答評論 「應該如何」。

Select * 
From library 
Where Not Exists 
    (
     Select 1 
     From crime_data 
     Where crime_data.isbn = library.isbn 
    ) 
+0

那麼,它應該怎麼樣? – Math

+1

+1我會建議介紹使用'加入'到Op –

+0

因此,我_think_你正在尋找表A中沒有匹配的行在表B中的行。爲此,請參閱答案中的編輯。在網上詳細閱讀SLQ加入意味着什麼也是不錯的。當你能夠描繪出有點奇怪的基本概念時,可以提供幫助。 – asantaballa