爲什麼如果我把=它帶給我正確的結果,當我把!=它給我帶來了完整的列表,而不是不同的。「!=」不是「=」的對立面嗎?
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
我在做什麼錯?
爲什麼如果我把=它帶給我正確的結果,當我把!=它給我帶來了完整的列表,而不是不同的。「!=」不是「=」的對立面嗎?
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
我在做什麼錯?
方式!=
和=
涉及很容易看到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.isbn
和crime_data.isbn != library.isbn
不包含該行總行的結合;它排除了至少有一個運算符爲NULL
的所有行。
您必須從概念上思考SQL從集合論角度出發的問題。當你連接兩個表時,這個概念是一個笛卡爾連接 - 表A的每一行都與表B的每一行連接在一起。所以如果你有10行的表和20行的表並加入它們,你會得到200行。
現在,當您選擇僅使用「=」行的值相等時,通常很少選中。當你使用「!=」時,選擇所有OTHER行。
編輯回答評論 「應該如何」。
Select *
From library
Where Not Exists
(
Select 1
From crime_data
Where crime_data.isbn = library.isbn
)
那麼,它應該怎麼樣? – Math
+1我會建議介紹使用'加入'到Op –
因此,我_think_你正在尋找表A中沒有匹配的行在表B中的行。爲此,請參閱答案中的編輯。在網上詳細閱讀SLQ加入意味着什麼也是不錯的。當你能夠描繪出有點奇怪的基本概念時,可以提供幫助。 – asantaballa
使用'<>'代替 – Math
SELECT * FROM library,crime_data是一個交叉連接。應用這個,看看自己=和!之間的區別= –
嘗試用純文本描述你在以這種方式在連接中使用'!='時想要做什麼。 – bendataclear