Sql语句中IN和exists的区别及应用
来源:互联网 发布:海外网络推广靠谱的吗 编辑:程序博客网 时间:2024/05/16 06:20
表展示
首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下:
user表:
order表:
in
确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。
具体sql语句如下:
1 SELECT 2 * 3 FROM 4 `user` 5 WHERE 6 `user`.id IN ( 7 SELECT 8 `order`.user_id 9 FROM10 `order`11 )
这条语句很简单,通过子查询查到的user_id 的数据,去匹配user表中的id然后得到结果。该语句执行结果如下:
它的执行流程是什么样子的呢?让我们一起来看一下。
首先,在数据库内部,查询子查询,执行如下代码:
SELECT `order`.user_id FROM `order`
执行完毕后,得到结果如下:
此时,将查询到的结果和原有的user表做一个笛卡尔积,结果如下:
此时,再根据我们的user.id IN order.user_id的条件,将结果进行筛选(既比较id列和user_id 列的值是否相等,将不相等的删除)。最后,得到两条符合条件的数据。
exists
指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
具体sql语句如下:
1 SELECT 2 `user`.* 3 FROM 4 `user` 5 WHERE 6 EXISTS ( 7 SELECT 8 `order`.user_id 9 FROM10 `order`11 WHERE12 `user`.id = `order`.user_id13 )
这条sql语句的执行结果和上面的in的执行结果是一样的。
但是,不一样的是它们的执行流程完全不一样:
使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是:
SELECT `user`.* FROM `user`
得到的结果如下:
然后,根据表的每一条记录,执行以下语句,依次去判断where后面的条件是否成立:
EXISTS ( SELECT `order`.user_id FROM `order` WHERE `user`.id = `order`.user_id )
如果成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回。
区别及应用场景
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
- Sql语句中IN和exists的区别及应用
- Sql语句中IN和exists的区别及应用
- 【SQL】查询语句中in和exists的区别
- sql语句中in和exists的区别详解
- SQL语句中in和exists的区别
- sql语句 in和exists的区别
- SQL中exists和in的区别
- SQL中exists和in的区别
- SQL中exists和in的区别
- SQL中exists和in的区别
- SQL中exists和in的区别
- SQL中in和exists的区别
- SQL中IN和EXISTS用法的区别,sql中exists,not exists的用法
- SQL中IN和EXISTS用法的区别,sql中exists,not exists的用法
- sql语句中in与exists not in与not exists的区别
- sql查询语句中 in和 exists的区别与性能比较
- sql语句中exists和in用法的区分
- Select语句查询中in和exists的区别
- poj 1920 汉诺塔移动到某一种指定位置的最小步数
- java对象模型和内存参数
- Android:自定义组合控件
- C/C++ 学习常用--进行时
- Struts2拦截器的使用 (详解)
- Sql语句中IN和exists的区别及应用
- AAC ADTS格式分析
- Meteor Shower POJ
- 尝试 docker
- NYOJ WAJUEJI which home strong!
- 快学习使用Linux吧,避免勒索病毒大肆入侵
- 黑白点匹配问题
- 继承
- jQuery使用JSONP实现跨域获取数据的三种方法详解