VC中文网-VC-MFC编程论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 522|回复: 6
打印 上一主题 下一主题

MySql中exists和in的区别

[复制链接]

13

主题

54

帖子

27

金币

连长

Rank: 7Rank: 7Rank: 7

积分
162
跳转到指定楼层
楼主
发表于 2018-12-3 09:05:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
exists介绍

exists对外表用loop逐条查询,每次查询城市查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的几多,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不克不及返回记录行,则当前loop到的这条记录被抛弃,exists的条件就像一个bool条件,当能返回结果集则为true,不克不及返回结果集则为 false

如下:

select * from user where exists (select 1);

对user表的记录逐条取出,由于子条件中的select 1永远能返回记录行,那么user表的所有记录都将被加入结果集,所以与 select * from user;是一样的

又如下:

select * from user where exists (select * from user where userId = 0);

可以知道对user表进行loop时,检查条件语句(select * from user where userId = 0),由于userId永远不为0,所以条件语句永远返回空集,条件永远为false,那么user表的所有记录都将被抛弃

not exists与exists相反,也就是当exists条件有结果集返回时,loop到的记录将被抛弃,不然将loop到的记录加入结果集

总的来说,如果A表有n条记录,那么exists查询就是将这n条记录逐条取出,然后判断n遍exists条件

in介绍

in查询相当于多个or条件的叠加,这个比较好理解,好比下面的查询

select * from user where userId in (1, 2, 3);

等效于

select * from user where userId = 1 or userId = 2 or userId = 3;

总的来说,in查询就是先将子查询条件的记录全都查出来,假设结果集为B,共有m条记录,然后在将子查询条件的结果集分化成m个,再进行m次查询

注意

in查询的子条件返回结果必须只有一个字段,例如

select * from user where userId in (select id from B);

而不克不及是

select * from user where userId in (select id, age from B);

而exists就没有这个限制

查询效率

一直巨匠都认为exists比in语句的效率要高,这种说法其实是禁绝确的。这个是要区分环境的

如果查询的两个表巨细相当,那么用in和exists不同不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

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

1:

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列的索引。

2:

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列的索引。

同时not in 和not exists,如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引,而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
<div class="pgc-img">



更多内容回复查看:
游客,如果您要查看本帖隐藏内容请回复
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

16

主题

48

帖子

35

金币

连长

Rank: 7Rank: 7Rank: 7

积分
129

新兵

沙发
发表于 2018-12-3 09:06:04 | 只看该作者
怎么不说版本,5.7对in查询做了优化,会重写为内连接,所以不存在你说的那种问题了
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

11

主题

39

帖子

24

金币

连长

Rank: 7Rank: 7Rank: 7

积分
111

新兵

板凳
发表于 2018-12-3 09:06:20 | 只看该作者
Mark
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

13

主题

42

帖子

28

金币

连长

Rank: 7Rank: 7Rank: 7

积分
117

新兵

地板
发表于 2018-12-3 09:07:15 | 只看该作者
转发了
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

13

主题

50

帖子

29

金币

连长

Rank: 7Rank: 7Rank: 7

积分
141
5#
发表于 2018-12-3 09:07:45 | 只看该作者
转发了
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

10

主题

46

帖子

21

金币

连长

Rank: 7Rank: 7Rank: 7

积分
132
6#
发表于 2018-12-3 09:08:07 | 只看该作者
转发了
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VC中文网 - 豫ICP备14012807号|小黑屋|联系客服|金币冲值|VC中文网

GMT+8, 2019-11-20 06:48 , Processed in 0.781250 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表
pk10投注技巧分享