MySQL SQL语句EXISTS

article/2025/9/2 9:12:28

MySQL中EXITS语句用于查明表中是否存在特定的行。普遍情况下EXITS与子查询一起使用,并返回与子查询返回的结果相等或匹配的行。如果行在表中存在,则返回true,否则返回false。在MySQL中使用EXISTS是低效的,因为EXISTS对查理表中的每一行都要重新运行。


1. 常用方式

通过例子,了解EXISTS返回的两种情况:TRUE(1), FLASE(0)

mysql> CREATE TABLE students(id int PRIMARY KEY,firstName varchar(255) DEFAULT NULL,lastName varchar(255) DEFAULT NULL
);
INSERT INTO students(id,firstName,lastName) VALUES(1,"Preet","Sanghavi"), (2,"Rich","John"), (3,"Veron","Brow"), (4,"Geo","Jos"), (5,"Hash","Shah"), (6,"Sachin","Parker"), (7,"David","Miller");mysql> SELECT *FROM STUDENTS;
+----+-----------+----------+
| id | firstName | lastName |
+----+-----------+----------+
|  1 | Preet     | Sanghavi |
|  2 | Rich      | John     |
|  3 | Veron     | Brow     |
|  4 | Geo       | Jos      |
|  5 | Hash      | Shah     |
|  6 | Sachin    | Parker   |
|  7 | David     | Miller   |
+----+-----------+----------+
7 rows in set (0.00 sec)#查询id
mysql> SELECT EXISTS(SELECT * from students WHERE id=4) as RESULT;
+--------+
| RESULT |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)#查询不存在数据
mysql> SELECT EXISTS(SELECT * from students WHERE id=11) as RESULT;
+--------+
| RESULT |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)#执行计划
mysql> EXPLAIN SELECT EXISTS(SELECT * from students WHERE id=4) as RESULT;
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+----------------+
| id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra          |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+----------------+
|  1 | PRIMARY     | NULL     | NULL       | NULL  | NULL          | NULL    | NULL    | NULL  | NULL |     NULL | No tables used |
|  2 | SUBQUERY    | students | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | Using index    |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+----------------+

2.往往容易误写用法


没有条件限制,扫描所有行,最终结果只返回一条TRUE(1),不管是不是NULL

mysql > SELECT EXISTS(SELECT * from students ) as RESULT;
+--------+
| RESULT |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)
CREATE TABLE `course` (`id` int unsigned NOT NULL AUTO_INCREMENT,`stu_id` int NOT NULL,`course_name` varchar(20)  NOT NULL,`st_couse` int NOT NULL,PRIMARY KEY (`id`),KEY `idx_stu` (`stu_id`)
);
INSERT INTO  course(stu_id,course_name,st_couse) VALUES(1,'语文',98),(2,'数学',89),(3,'英语',92);mysql> SELECT st.* FROM students stWHERE EXISTS (SELECT cs.stu_id FROM course cs  );
+----+-----------+----------+------+
| id | firstName | lastName | age  |
+----+-----------+----------+------+
|  1 | Preet     | Sanghavi | NULL |
|  2 | Rich      | John     | NULL |
|  3 | Veron     | Brow     | NULL |
|  4 | Geo       | Jos      | NULL |
|  5 | Hash      | Shah     | NULL |
|  6 | Sachin    | Parker   | NULL |
|  7 | David     | Miller   | NULL |
+----+-----------+----------+------+
7 rows in set (0.00 sec)mysql> SELECT st.* FROM students stWHERE EXISTS (SELECT cs.stu_id FROM course cs WHERE cs.stu_id = st.id  );
+----+-----------+----------+------+
| id | firstName | lastName | age  |
+----+-----------+----------+------+
|  1 | Preet     | Sanghavi | NULL |
|  2 | Rich      | John     | NULL |
|  3 | Veron     | Brow     | NULL |
+----+-----------+----------+------+
3 rows in set (0.00 sec)

注意:两次查询结果不一样,仔细对比上面两条 sql 语句,where 语句后面直接跟了exists ,并没有指定关联条件。这里EXISTS 只在乎WHERE里的数据能不能查找出来,是否存在这样的记录。
其运行方式是先运行主查询一次,再去子查询里查询与其对应的结果 如果存在返回ture则输出,反之返回false则不输出,再根据主查询中的每一行去子查询里去查询。适合外查询表小,子查询表大的情况,毕竟要一行抽取进行匹配。


3.优化SQL语句

EXISTS是否可以改写进行优化,下面是改写成内连接方式:

mysql> SELECT st.* FROM students st  INNER JOIN course cs  ON   cs.stu_id = st.id ;

执行计划对比:

image.png


Semi Join-LooseScan: 把数据基于索引进行分组,取每组数据进行匹配

EXPLAIN ANAYLZE实际执行:

image.png


从上诉对比中可以看出,在少量的数据中也存在明显的差异。


4. DDL中EXISTS

在DDL语句创建或删除中添加EXISTS,还是有很多好处的。
如果没有IF EXISTS,语句将失败,并出现一个错误,表明无法删除哪些不存在的表,并且不会进行任何更改。

使用IF EXISTS时,对于不存在的表不会发生错误。该语句删除所有确实存在的已命名表,并为每个不存在的表生成一个NOTE诊断。这些注释可以通过SHOW WARNINGS显示

image.png

  • 如果在数据字典中有一个条目,但存储引擎没有管理表的特殊情况下,IF EXISTS也可以用于删除表。(例如,在从存储引擎中删除表之后,在删除数据字典条目之前,服务器异常退出。有一定的效果,但有时未必可行)
2021-11-24T11:33:54.885641Z 0 [ERROR] InnoDB: Cannot open datafile for read-only: './db9/t1.ibd' OS error: 71
2021-11-24T11:33:54.885645Z 0 [ERROR] InnoDB: Operating system error number 2 in a file operation.
2021-11-24T11:33:54.885648Z 0 [ERROR] InnoDB: The error means the system cannot find the path specified.
2021-11-24T11:33:54.885651Z 0 [ERROR] InnoDB: If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
2021-11-24T11:33:54.885656Z 0 [ERROR] InnoDB: Could not find a valid tablespace file for `db9/t1`. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html for how to resolve the issue.

EXIST删除操作:

mysql> DROP DATABASE db9;
ERROR 3679 (HY000): Schema directory './db9/' does not exist
mysql> DROP DATABASE IF EXISTS db9;
Query OK, 0 rows affected, 1 warning (0.03 sec)
  • EXIST 存储过程适用:

    image.png

  • 与EXISTS相对的是NOT EXISTS。使用NOT EXISTS后,若对应查询结果为空,则外层的WHERE子语句返回值为真值,否则返回假值。

  • 在MySQL 8.0.19及以后版本中,也可以在子查询中使用NOT EXISTS或NOT EXISTS嵌套


4.总结

MySQL中EXISTS这些没有特殊的要求,主要考虑性能方面的问题。可以尽量用INNER JOIN。必须用到EXISTS时外查询表小,子查询表大原则,可以有效减少总的循环次数来提升速度。
有时DDL中系统突然宕机,可以用IF EXISTS进行处理也能启动妙用。 


http://chatgpt.dhexx.cn/article/J9sIujNo.shtml

相关文章

SQL语句中EXISTS的用法

SQL萌新一个,在这里记录一下自学过程中遇到的问题。 exists:强调的是,是否有返回集,不需要知道具体返回的是什么 比如这两个表: 输入查询语句: select * from customer c where not exists( select * from…

sql中 exists的用法

现有:班级表(A_CLASS) 学生表( STUDENT) 注:学生表(STUDENT)的classId关联班级表(A_CLASS)的主键ID 代码: select * from STUDENT s WHERE exists (select 1 from A_ClASS c where s.CLASS_…

SQL语句中EXISTS的详细用法大全

SQL语句中EXISTS的详细用法大全 前言一、建表1.在MySQL数据库建表语句2.在ORACLE数据库建表语句 二、在SELECT语句中使用EXISTS1.在SQL中使用EXISTS2.在SQL中使用NOT EXISTS3.在SQL中使用多个NOT EXISTS4.在SQL中使用多个EXISTS5.在SQL中使用NOT EXISTS和EXISTS 三、在DELETE语…

DNS服务器解析问题

DNS服务器解析问题 前言 重点: 本文摘选链接:https://www.ancii.com/aazeaa674/ 正文 问题 域名状态异常会导致网站不能访问吗? 刚修改过域名解析,为什么不生效呢? 如何查看解析是否生效呢? 刚在注…

dns服务器怎么设置

dns服务器怎么设置 在修改DNS之前需要先知道你的大DNS服务器地址是什么,那么怎么来查询DNS服务器地址呢?直接按住键盘上的“winR”,调出运行框。在输入框中输入“cmd”,点击“确定”或者回车。在管理员界面中输入命令:…

手机显示DNS服务器异常,手机dns服务器异常怎么设置

手机dns服务器异常怎么设置 内容精选 换一换 华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。 本章节介绍如何通过控制台重启服务器。重启服务器时,可以批量更换云手机…

小米路由器显示DNS服务器设置错误,小米路由器dns地址怎么设置

小米路由器与日常所有的路由器一样,在默认情况下都是路由器的地址作为无线设备获取的 DNS 地址。如果你想手动修改小米路由器的DNS地址,也是可以的,下面是学习啦小编给大家整理的一些有关小米路由器dns地址设置方法,希望对大家有帮…

如何设置正确的dns服务器地址,dns服务器地址如何设置

dns服务器地址如何设置 (Windows 2000、Windows XP操作系统): 1、 开机后在桌面上选定图标"网上邻居", 点击鼠标右键, 在弹出的菜单上选择"属性"项,打开"网络和拔号连接"窗口, 如图 2、…

北京联通dns服务器位置,联通DNS服务器地址怎么设置

联通DNS服务器地址怎么设置 如电脑Win7系统,以下方法设置DNS:您右键点击电脑桌“网络”图标 ,“属性” >选择“控制面板” >在“网络和共享中心”中可看到当前的网络状况,点击左边的“更改适配器设置” >右键单击“本地连接”择“属性” >选择“internet协议版本4(TCP/…

路由器显示DNS服务器设置错误,路由器dns设置错误怎么处理

一般都给家里配上了无线路由器,但是在用了无线路由器后,很容易导致电脑断网,大家一般用软件检测后上面会显示是DNS地址出现了异常,那么应该怎么解决这个问题,不让电脑频繁断网呢?下面是学习啦小编给大家整理的一些有关…

无线路由dns服务器地址,tplink无线路由器怎么设置DNS服务器地址

作为不同网络之间互相连接的枢纽,路由器系统构成了基于TCP/IP 的国际互联网络Internet 的主体脉络,也可以说,路由器构成了Internet的骨架。在设置路由器的时候,很多用户不知道该怎么手动设置路由器的DNS服务器地址,下面我们就来看看详细的设置教程,需要的朋友可以参考下 …

Ros系统配置DNS服务器,ros设置dns服务器

ros设置dns服务器 内容精选 换一换 域名的DNS服务器定义了域名用于解析的权威DNS服务器。通过华为云注册成功的域名默认使用华为云DNS进行解析,详细内容,请参见华为云DNS对用户提供域名服务的DNS是什么?。若您选择非华为云DNS进行域名解析,可以修改域名的DNS服务器。域名注…

无线网首选dns服务器怎么设置,dns服务器设置(192.168.1.1的首选dns)

我们知道影响上网速度的因素有很多,硬件、软件等都是高速上网的基础,每个人都希望自家的网速越来快,在相同的硬件、带宽固定的情况下,如何来择优选择上网参数中的DNS服务器呢? DNS服务是网络参数必不少的一项&#xff…

dhcp服务器修改dns设置方法,dhcp服务器的dns设置方法

dhcp服务器的dns设置方法 内容精选 换一换 文件系统与服务器的连接断开,需要重新挂载。没有配置自动挂载,重启服务器后会自动断开。参考自动挂载文件系统,在云服务器设置重启时进行自动挂载。如果上述方法均不能解决您的疑问,请提交工单寻求更多帮助。 “包年/包月”计费模…

电脑系统里如何设置dns服务器

在大多数的时候,我们的电脑都是使用的静态ip,给电脑开机就默认获取了ip地址,但有些时候我们要访问一个网页时需要使用固定的ip地址和dns服务器该怎么办呢?下面就和大家分享一下电脑系统里如何设置dns服务器吧。 这些重装系统的方…

dns简单说明及配置

dns IP地址与dns的关系 dns协议是用来将域名转换为IP地址的协议 IP地址是面向主机的 域名是面向用户的 域名和IP的对应关系保存在hosts文件中 dns系统 1、一个系统管理,维护系统内每个主机IP和主机名的对应关系 2、如果新计算机接入网络,要将这个…

笔记本查看WIFI密码

查看密码四步走 第一步 右键WIFi图标,打开“网络与Internet设置” 第二步 打开网络共享中心 第三步 点击连接WIFI -->> 选择无限属性 第四步 查看密码

如何在计算机修改wifi密码,wifi修改密码,教您电脑怎么修改wifi密码

使用wifi的用户都晓得,经过第一次密码验证后,之后电脑、手机在打开wifi时,经常会自动连接wifi,当再一次连接wifi需要输入密码的时候却忘记密码了。那么我们就需要改WIFI密码,那么电脑怎么修改wifi密码?下面…

电脑查看连接过的WiFi密码

WiFi连接之后后面一般都是自动连接,时间久了难免会忘记WiFi密码,当不方便登录路由器后台查看WiFi密码时候,可以使用连接过该WiFi的电脑查看 1、在window运行窗口输入"cmd"命令,进行命令行终端 2、在命令行终端中输入“…

wifi密码公式计算机,求一些高数公式,做wifi密码用?

满意答案 thyk7283 2018.06.08 采纳率:55% 等级:13 已帮助:8612人 1)∫kdxkxc 2)∫x^udx(x^(u1))/(u c 3)∫1/xdxln|x|c 4) ∫a^xdx(a^x)/lnac 5)∫e^xdxe^xc 6)∫sinxdx-cosxc 7)∫cosxdxsinxc 8)∫1/(cosx)^2dxtanxc 9)∫1/(sinx)^2dx-c…