MySQL关键字OR/IN/NOT IN/EXISTS/NOT EXISTS的区别

IN 和 OR 的区别:

如果in和or所在列有索引或者主键的话,or和in没啥差别,执行计划和执行时间都几乎一样。

如果in和or所在列没有 索引的话,性能差别就很大了。在没有索引的情况下,随着in或者or后面的数据量越多,in的效率不会有太大的下降,但是or会随着记录越多的话性能下降 非常厉害。

因此在给in和or的效率下定义的时候,应该再加上一个条件,就是所在的列是否有索引或者是否是主键。如果有索引或者主键性能没啥差别,如果没有索引,性能差别不是一点点!

IN 和 EXISTS 的区别:

EXISTS代表存在量词∃。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或者逻辑假值“false”。

IN是把外表和内表作hash连接;
而EXISTS是对外表进行便利,每次取外表的一条记录去结合内层查询(子查询)结果,若内层查询结果为非空,则外层的WHERE子句返回值为真,否则返回值为假。

如果查询的两个表大小相当,那么用IN和EXISTS差别不大;如果两个表中一个较小一个较大,则子查询表大的用EXISTS,子查询表小的用IN;

例如:表A(小表),表B(大表)

select * from A where cc in(select cc from B);  
--效率低,用到了A表上cc列的索引
select * from A where exists(select cc from B where cc=A.cc);  
--效率高,用到了B表上cc列的索引

相反的:

select * from B where cc in(select cc from A)  
--效率高,用到了B表上cc列的索引
select * from B where exists(select cc from A where cc=B.cc)  
--效率低,用到了A表上cc列的索引

考虑性能的话,就按子表大主表小用EXISTS,子表小主表大用IN的原则就可以

写法的不同,
EXISTS的where条件是: “… where EXISTS (… where a.id=b.id)”
IN的where条件是:" … where id IN ( select id … where a.id=b.id)"

NOT IN 和NOT EXISTS的区别

如果查询语句使用了NOT IN 那么内外表都进行全表扫描,没有用到索引;
而NOT EXISTS的子查询依然能用到表上的索引;
所以无论那个表大,用NOT EXISTS都比NOT IN要快。

一个简单例子,有两张表。一张用户表,一张订单表(包含有用户ID),需要查询没有下过订单的用户。
在这里插入图片描述
在这里插入图片描述

采用NOT EXISTS和NOT IN分别查出未下过订单的用户

NOT IN 查询SQL语句如下:

SELECT * from ttt_user u WHERE u.user_id not in (SELECT user_id from 
ttt_order o WHERE o.user_id = u.user_id)

NOT IN 查询执行计划如下:
在这里插入图片描述

NOT EXISTS 查询SQL语句如下:

SELECT * from ttt_user u WHERE not EXISTS (SELECT user_id from 
ttt_order o WHERE o.user_id = u.user_id)

NOT EXISTS 查询执行计划如下:
在这里插入图片描述

同时也贴一下IN 和EXISTS的查询计划:

IN 查询执行计划如下:
在这里插入图片描述

EXISTS 查询执行计划如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL中的exists和not exists是用于判断子查询中是否存在数据的关键字exists表示子查询中存在数据时返回true,否则返回false。 not exists表示子查询中不存在数据时返回true,否则返回false。 例如: SELECT * FROM table1 WHERE EXISTS (SELECT * FROM table2 WHERE table1.id = table2.id); 上述语句表示如果table2中存在与table1中id相同的数据,则返回table1中所有数据。 SELECT * FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.id = table2.id); 上述语句表示如果table2中不存在与table1中id相同的数据,则返回table1中所有数据。 ### 回答2: MySQL的"EXISTS"和"NOT EXISTS"是用于检查子查询返回的结果是否为空。具体来说,"EXISTS"用于判断子查询的结果集是否存在,如果存在则返回"true",否则返回"false";"NOT EXISTS"则刚好相反,如果子查询的结果集不存在,则返回"true",否则返回"false"。 例如,我们有两个表:"orders"和"customers"。我们想要找出已经下过订单的顾客,可以使用"EXISTS"关键字来实现: ``` SELECT * FROM customers c WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id ); ``` 上述查询语句中,首先从"customers"表中选择所有的顾客记录,并在WHERE子句中使用一个子查询来判断是否存在该顾客的订单记录。如果存在,则返回该顾客记录。 相反地,如果我们想要找出没有下过订单的顾客,则可以使用"NOT EXISTS"关键字: ``` SELECT * FROM customers c WHERE NOT EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id ); ``` 上述查询语句中,使用"NOT EXISTS"来判断不存在顾客的订单记录,如果不存在,则返回该顾客记录。 总结来说,通过使用"EXISTS"和"NOT EXISTS"可以方便地检查子查询的结果是否为空,从而实现我们所需的条件判断。在实际应用中,这些关键字可以用于复杂的查询条件,帮助我们过滤和筛选数据。 ### 回答3: MySQL中的EXISTS和NOT EXISTS是两个用于子查询的谓词。它们用于判断一个子查询是否返回数据,并根据返回结果进行条件判断。 EXISTS谓词用于判断一个子查询是否返回任何结果。如果子查询返回了至少一条数据,则表达式返回TRUE;否则返回FALSE。我们可以使用EXISTS来进行关联查询,判断某个条件是否存在。 举个例子,我们可以使用EXISTS来判断是否有学生通过考试: ``` SELECT name, score FROM students WHERE EXISTS ( SELECT * FROM exam_results WHERE students.id = exam_results.student_id AND exam_results.score >= 60 ) ``` 上面的查询会返回通过考试的学生的姓名和分数。 NOT EXISTS则与EXISTS相反,用于判断子查询是否没有返回任何结果。如果子查询没有返回数据,则表达式返回TRUE;否则返回FALSE。我们可以使用NOT EXISTS来查询不存在某个条件的数据。 举个例子,我们可以使用NOT EXISTS来查询没有购买过商品的顾客: ``` SELECT name, address FROM customers WHERE NOT EXISTS ( SELECT * FROM orders WHERE customers.id = orders.customer_id ) ``` 上面的查询会返回没有购买过商品的顾客的姓名和地址。 总之,MySQL中的EXISTS用于判断子查询是否存在结果,而NOT EXISTS则用于判断子查询是否不存在结果。我们可以利用这两个谓词来进行更复杂的条件查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值