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

我究竟做错了什么?

4

2 回答 2

8

您必须从集合论的角度从概念上考虑 SQL 正在做什么。当你连接两个表时,这个概念是笛卡尔连接——表 A 的每一行与表 B 的每一行连接。所以如果你有 10 行的表和 20 行的表并连接它们,你会得到一个连接200 行。

现在,当您使用“=”进行选择时,只会选择值相等的行,通常很少。当您使用“!=”时,它会选择所有其他行。


编辑以回答评论“应该如何”。

Select *
From library
Where Not Exists 
    (
        Select 1 
        From  crime_data 
        Where crime_data.isbn = library.isbn 
    )
于 2013-09-30T11:16:21.230 回答
2

通过一个简单的示例很容易看出方式!=和关联:=

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

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

(我使用的是标准<>运算符而不是 MySQL 特定的运算符!=,但它们是等效的)。

+-----+-----+--------+-----------+------+------+---------+------------+
| 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运算符的所有行。

于 2013-09-30T11:30:02.987 回答