mysql exists用法

在mysql中,有个关键字exists比较难理解,今天就来搞明白其含义和应用

exists的使用总是跟子查询关联起来,一种是不相关子查询,对于exists来说更常用的是相关子查询

不相关子查询:子查询和父查询没有直接的关系。只要子查询为真,则返回父查询的所有结果。否则返回空

select A.id from A where exists (select B.name from B where B.name = "hello world");

相关子查询:

select A.id from A where exists (select B.id from B where B.id = A.bid);

分析上面这句相关子查询的工作步骤:

  步骤1,首先从表A取出一条数据,然后其中把A.bid列数据带入到子查询中,

  步骤2,执行子查询,当子查询结果不为空时,返回true,否则返回false,

  步骤3,父查询根据子查询的结果,如果为true,则把该条数据加入返回结果集中,否则跳过

  遍历表A的所有数据,重复执行以上3个步骤,完成后把结果集返回

分析exists和in的使用场景。

原则:小表查询内嵌,大表查询外套

查询效率分析,从减少遍历查询次数角度优化:

  当父查询表的数据量大,子查询表数据量小时,使用in;因为使用in,子查询是嵌套在父查询里面的,因此需要遍历父查询,其次数为子查询返回结果的大小;

  当父查询表的数据量小,子查询表数据量大时,使用exists;使用exists,从结果来说其父查询是嵌套在子查询里面的,因此需要遍历子查询,次数为父查询的数据量。

例子

  假设有两个表A和B,并且A表的数据量远大于B表,A包含了B的主键,那么A就是父查询,因此使用in比较好

select A.* from A where A.bid in (select id from B where B.id = A.bid);

  同上假设,不过数据量关系相反,A表的数据量远小于B表的数据量

select A.* from A where exists (select id from B where B.id = A.bid);

从语义上来说,in和exists的意思是相近的,比如上面这两个例子,两个sql语句的意思都是:从A中筛选出bid存在于B表的数据

原文地址:https://www.cnblogs.com/zhangxuezhi/p/11963721.html

时间: 2024-11-08 21:28:02

mysql exists用法的相关文章

msql数据库in和exists用法比较

exists:用法:select * from table1 where exists (select * from table2 where table1.id = table2.id )返回table1中和table2中id相同的记录(双重循环)结果和in语法一样,思想不一样,in:select * from table1 where id in (select id from table2 ) 2者思路不一样:exists:先获得每一条table1的数据,然后获得id字段,去table2表

oracle中的exists 和not exists 用法详解

oracle中的exists 和not exists 用法详解 有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高. 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>

mysql学习之二:mysql基本用法

安装完mysql后我们可以进行sql语句的操作: 我们可以使用以下命令连接到MySQL服务: mysql -h localhost -u root -p -h参数指定要连接的MySQL服务器地址 -u参数指定连接所使用的用户 -p参数指定使用密码验证登陆 MySQL服务绝大多数功能使用SQL语言进行管理. SQL语言一般约定俗成使用大写,但是语言本身不限制大小写.几乎所有SQL语句都必须以";"结尾. 列出所有数据库: SHOW DATABASES; 创建一个数据库(linuxcast

SQL中if exists用法细节

用if exists建表[转] 1 判断数据库是否存在 Sql代码 if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名]  if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名] 2 判断表是否存在 Sql代码 if exists (select * from sysobjects w

MySQL:ONDUPLICATEKEYUPDATE用法

如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值列重复的问题,则插入新行.例如,如果列a被定义为UNIQUE,并且包含值1,则以下 两个语句具有相同的效果: 原本需要执行3条SQL语句,如下: 代码如下: IF (SELECT * FROM t_table WHERE id=1001') { UPDATE t_table SET cnt=cnt+

Mysql基本用法-02

left join #左连接又叫外连接 left join 返回左表中所有记录和右表中连接字段相等的记录  test_user表 phpcvs表 SQL: select * from test_user left join phpcvs on test_user.id=phpcvs.id 执行结果如下图: right join #右连接又叫外连接 right join返回右表中所有记录和左表中连接字段相等的记录  SQL: select * from test_user right join p

mysql 有报错  ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists

sh-4.1# /etc/init.d/mysqld status ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists sh-4.1# /etc/init.d/mysqld start Starting MySQL. ERROR! The server quit without updating PID file (/data1/mysql/mysql.pid). sh-4.1# rm mysql

mysql基本用法

最近项目使用mysql数据库,以前没接触过.所以找了些资料学习. 目前通过navicat for mysql工具进行mysql数据基本操作. 1.安装navicat for mysql后,建立连接. 2.导入需要创建的sql语句.通过选中库名称右键运行sql文件,加载需要导入的sql语句. 3.增加其中数据,注意增加的字段如果增加提示1306错误,需要修改字段的符号位utf8后即可增加 4.如果远程连接mysql服务器,需要在远程服务器mysql中对客户端访问进行授权语句 GRANT ALL P

mysql FIND_IN_SET 用法

mysql 中 FIND_IN_SET  是判断某个字符串是否在带逗号的字符串中 例如 SELECT t.group_id, COUNT(group_id) tsum FROM (SELECT group_id FROM xx WHERE FIND_IN_SET(openid,'qqqwqnfocFq5IL2sXB2Qu0I,oarwerrr-2KRah_TklJEomljhlKg,oaSiouEgtr5t5utLFU8-evmkn5BwQ3_c') AND user_uuid = 'xxxxx