【sql】深入理解 mysql的EXISTS 语法

相关文章:
【sql】深入理解 mysql的EXISTS 语法
【sql】初识 where EXISTS

1. 使用格式如下:

select * from a where exists ( 任何子查询 )

代码根据颜色分成两段,前面的是主查询,后面红色的是子查询,先主后子,主查询里面的属性可以放到子查询使用。

2. 使用含义:

该子查询如果“有数据结果”, 查询只要返回了结果行数,则该exists()的结果为“true”

该子查询如果“没有数据结果”,查询没有返回结果行数,则该exists()的结果为“false”

2.1 这里说一下什么叫有数据结果?

1.有数据结果

(1)查询全部的数据:SELECT * FROM studen
在这里插入图片描述
(2)查询全部的数据条数:SELECT COUNT(1) FROM student
在这里插入图片描述
(3)查询一个不存在的数据,显示数量:SELECT COUNT(1) FROM student WHERE id=888;
在这里插入图片描述

2.没有数据结果

查询不存在的数据记录:SELECT * FROM student WHERE id=888;
在这里插入图片描述

如上,只要返回的有数据结果,exists()的结果为“true”,否则就是false。

3.使用demo演示一下where exists的用法

(1)建表语句如下

SET FOREIGN_KEY_CHECKS=0;
 
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT '名字',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
 
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', 'zhangsan', '18');
INSERT INTO `student` VALUES ('2', 'lisi', '19');
INSERT INTO `student` VALUES ('3', 'wangwu', '20');

(2) 建表结果如下

student表
在这里插入图片描述

前提:id=1存在记录,id=111不存在记录

(3)这三种都是返回全部记录,因为where exists子查询存在数据结果,所以返回true

SELECT * FROM student st WHERE EXISTS (SELECT * FROM student);
SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student);
SELECT * FROM student st WHERE EXISTS (SELECT COUNT(1) FROM student);

结果一二三相同:
在这里插入图片描述
(4)这两种,上面的那个不返回数据,下面的这个返回全部数据

SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=111);
SELECT * FROM student st WHERE EXISTS (SELECT COUNT(1) FROM student dd where dd.id=111);

结果一不返回数据:
在这里插入图片描述
结果二返回数据:
在这里插入图片描述

(5)以下四种

SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=1);
SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=111);
SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where st.id=1);
SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where st.id=111);

结果一:
在这里插入图片描述
结果二:
在这里插入图片描述
结果三:
在这里插入图片描述
结果四:
在这里插入图片描述

总结:(1)整体查询分为主子,前面是主查询,where exists后面是子查询,先主后子

EXPLAIN SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=1);
在这里插入图片描述
(2)子查询,有结果exists返回为true,无结果exists返回false。exists子查询返回true,主查询就正常返回全部内容,exists子查询返回false,主查询的内容就全部不返回。

(3)子查询count(1)一直有结果。即使count(1)返回0,也是有结果返回,所以where exists使用count(1)一直返回true.

(4)exists子查询使用select 1,有返回结果,子查询就返回true,没有返回结果,子查询就返回false。

(5)针对子查询使用select *,select 1,select count(1)都行,子查询返回的结果内容不重要,只要有结果就返回true,无结果返回false。

(6)子查询可以使用主查询的字段。如下:

第一个语句没有使用主查询的字段,只需要正常判断WHERE EXISTS是否有结果返回就好了。

SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=1);

第二个语句st.id=1使用的是主查询的st表字段,将会限制主查询的内容。

SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where st.id=1);

这个语句等同于

SELECT * FROM student st where st.id=1;

参考

https://blog.csdn.net/Mint6/article/details/105084644

相关推荐

  1. 深入理解 MySQL SQL_NO_CACHE 关键字

    2024-03-23 14:18:01       38 阅读
  2. Mysql深入理解MySQL执行计划

    2024-03-23 14:18:01       35 阅读
  3. mysql exists 和not exists 联合使用bug

    2024-03-23 14:18:01       38 阅读
  4. 深入理解MySQLInnoDB存储引擎

    2024-03-23 14:18:01       33 阅读
  5. 深入理解MySQL二进制日志(Binlog)

    2024-03-23 14:18:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 14:18:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 14:18:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 14:18:01       87 阅读
  4. Python语言-面向对象

    2024-03-23 14:18:01       96 阅读

热门阅读

  1. 自动化提取Python项目中的第三方库及其版本信息

    2024-03-23 14:18:01       46 阅读
  2. 01 mybatis

    2024-03-23 14:18:01       37 阅读
  3. leetcode 402.移掉k位数字

    2024-03-23 14:18:01       39 阅读
  4. k8s通过编排文件,实现服务的滚动更新

    2024-03-23 14:18:01       40 阅读
  5. Kali linux基本命令大全

    2024-03-23 14:18:01       37 阅读
  6. WSL的ubuntu中如何安装node.js

    2024-03-23 14:18:01       40 阅读
  7. centos7 配置ip

    2024-03-23 14:18:01       47 阅读
  8. Android开发之CardView概述与分析

    2024-03-23 14:18:01       42 阅读