为什么如果我把=它给我带来了正确的结果,当我把它放在!=它给我带来了完整的列表而不是不同的列表。
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
我做错了什么?
答案 0 :(得分:8)
您必须从概念上从集合论的角度思考SQL正在做什么。当您连接两个表时,概念是笛卡尔连接 - 表A的每一行与表B的每一行连接。因此,如果您有10行的表和20行的表并加入它们,您将得到一个连接200行。
现在,当您选择使用“=”时,只选择值相等的行,通常很少。当您使用“!=”时,它会选择所有其他行。
编辑以回答评论“应该如何”。
Select *
From library
Where Not Exists
(
Select 1
From crime_data
Where crime_data.isbn = library.isbn
)
答案 1 :(得分: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.isbn
和crime_data.isbn != library.isbn
不包含行总数的行的并集;它排除了至少有一个NULL
运算符的所有行。