sql in与exists的区别,on 与 where的区别

一,in
确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

具体sql语句如下
SELECT
*
FROM
user
WHERE
user.id IN (
SELECT
order.user_id
FROM
order
)
它的执行流程是什么样子的呢?让我们一起来看一下。
1, SELECT
order.user_id
FROM
order
2,将查询到的结果和原有的user表做一个笛卡尔积

二,exists
指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

具体sql语句如下:
SELECT
user.*
FROM
user
WHERE
EXISTS (
SELECT
order.user_id
FROM
order
WHERE
user.id = order.user_id
)
首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是:
1,SELECT user.* FROM user
2,EXISTS (
SELECT
order.user_id
FROM
order
WHERE
user.id = order.user_id
)
三,区别及应用场景
 in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

四,on与where
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,402评论 2 89
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 10,237评论 0 44
  • 这是三十五年来第一做洋葱炒鸡蛋,也没什么特别的原因,就是五岁的大女儿说她前几天在朋友家吃到了超级甜的洋葱,难得听她...
    茂ET阅读 413评论 0 0
  • 可能是母胎solo至今,单身太久了。来到了大洋彼岸,荷尔蒙便开始不受控制,对身边一个又一个小哥哥开始犯花痴。 第一...
    福啦啦啦啦啦啦阅读 399评论 0 0
  • 万物为空哉,四野茫茫。往事随风哉,流襟徜徉。行路从序哉,各有所安。两都奔波哉,心系远方。...
    绿酒红炉阅读 384评论 0 2

友情链接更多精彩内容