系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > Mysql > 详细页面

mysql exists用法

时间:2019-11-30来源:系统城作者:电脑系统城

在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表的数据 

分享到:

相关信息

  • MySQL的核心查询语句详解

    一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...

    2023-10-30

  • Mysql中如何删除表重复数据

    Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...

    2023-10-30

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载