Mysql “之间的区别”=&引用;及;在“中”&引用;不在「;及;减;

Mysql “之间的区别”=&引用;及;在“中”&引用;不在「;及;减;,mysql,sql,Mysql,Sql,分行(分行名称、分行城市、资产) 客户(客户名称、客户街道、客户城市) 贷款(贷款编号、分行名称、金额) 借款人(客户名称、贷款编号) 账户(账号、分行名称、余额) 存款人(客户名称、账号) 中的“=”和“IN”以及“notin”和“减号”是怎样的 及 彼此不同?它们应该完成相同的任务=用于与单个值进行比较,而中的用于与多个值进行比较则正好相反,即它等于除这些值集之外的任何值,减去实际上是从第一个子查询中减去第二个子查询中的每个结果 您可以在此处找到有关减号的更多信息:其中。。。在…中,允

分行(分行名称、分行城市、资产)
客户(客户名称、客户街道、客户城市)
贷款(贷款编号、分行名称、金额)
借款人(客户名称、贷款编号)
账户(账号、分行名称、余额)
存款人(客户名称、账号)

中的“=”和“IN”以及“notin”和“减号”是怎样的


彼此不同?它们应该完成相同的任务

=
用于与单个值进行比较,而中的
用于与多个值进行比较<不在
中的code>则正好相反,即它等于除这些值集之外的任何值,
减去
实际上是从第一个子查询中减去第二个子查询中的每个结果


您可以在此处找到有关减号的更多信息:

其中。。。在…
中,允许您搜索值列表,例如:

SELECT * FROM `orders` WHERE `status` IN("placed", "processed", "fulfilled")
SELECT * FROM `orders_items` WHERE `order_id` IN (
    SELECT `order_id` FROM `orders` WHERE `status` IN ("processed", "fulfilled")
)
这比写这个容易:

SELECT * FROM `orders` WHERE `status` = "placed" OR `status` = "processed" OR `status` = "fulfilled"
特别是当您不知道可能值的“范围”时,或者您希望将该条件与其他条件相结合时(有很多附加条件会变得很糟糕)。例如:

SELECT * FROM `orders` WHERE `status` IN("placed", "processed", "fulfilled")
SELECT * FROM `orders_items` WHERE `order_id` IN (
    SELECT `order_id` FROM `orders` WHERE `status` IN ("processed", "fulfilled")
)
很多时候,
JOIN
更合适(如上一个示例),但是
WHERE。。。如果您有一个
ENUM
列,或者一个预定义的可能过滤器列表,那么IN…
很好

其中。。。不在…
中是相同的,但被否定


为了回答你的实际问题,老实说,我没有时间去看这些查询有什么不同。如果只是为了可读性,我更喜欢前者而不是后者。在处理主键引用(即INT列)时,我几乎总是倾向于使用
JOIN
s而不是
WHERE IN
WHERE NOT IN

SQL的“乐趣”之一是可以使用各种等价的SQL构造编写相同的关系运算符(相交、差异等)(这部分解释了为什么SQL优化器不总是在没有用户帮助的情况下选择最佳计划)

使用以下简单示例表:

WITH A AS (SELECT * FROM (VALUES (1), (2), (3)) AS T (n)), 
     B AS (SELECT * FROM (VALUES (3), (4), (5)) AS T (n))

使用()中的
交叉口

使用量化比较的交叉口

SELECT n
  FROM A
 WHERE n = ANY ( SELECT n FROM B ) ; 
SELECT n
  FROM A
 WHERE n <> ALL ( SELECT n FROM B ) ; 
使用
INTERSECT

SELECT n
  FROM A
INTERSECT
SELECT n
  FROM B;
交叉使用
交叉
,替代语法:

TABLE A 
INTERSECT 
TABLE B;
TABLE A 
EXCEPT 
TABLE B;
存在使用
的交叉口()

使用连接的交叉点

SELECT n
  FROM A NATURAL JOIN B; 
SELECT A.n
  FROM A LEFT OUTER JOIN B ON A.n = B.n
 WHERE B.n IS NULL;
使用
MATCH()


使用
不在()中的差异

使用量化比较的差异

SELECT n
  FROM A
 WHERE n = ANY ( SELECT n FROM B ) ; 
SELECT n
  FROM A
 WHERE n <> ALL ( SELECT n FROM B ) ; 
使用除
之外的
的差异,替代语法:

TABLE A 
INTERSECT 
TABLE B;
TABLE A 
EXCEPT 
TABLE B;
使用
的差异不存在()

使用连接的差异

SELECT n
  FROM A NATURAL JOIN B; 
SELECT A.n
  FROM A LEFT OUTER JOIN B ON A.n = B.n
 WHERE B.n IS NULL;

[SQL没有
不匹配的
运算符!]

通常…=运算符用于单值检查,其中as In用于执行多值检查。您在第一个查询中缺少
b
的声明,可能需要添加该声明,以便人们知道您从何处获得它……令人惊讶的是……或者不是……这些都包含在自何时起MySQL支持
减号
中>运算符?我只是在5.5中尝试了一下,得到了一个错误(它也不支持标准,除非我没有弄错运算符)“=用于与单个值进行比较”--我不确定这是否正确:请看一下“使用量化比较的交叉点”我的答案中有一个例子。这是一个漂亮的答案!有这样的东西吗?我想读更多关于以不同方式重写查询的内容。