首页 > 数据库 >MySQL之in和exists的使用和区别

MySQL之in和exists的使用和区别

时间:2022-10-20 20:33:52浏览次数:58  
标签:06 exists 区别 28 2020 MySQL id select

 今天我们说下MySQL中in和exists的用法和区别:

   exists表示存在,经常和子查询配合使用。我们来举个例子:

mysql> select * from course;

+----+----------+

| id | name     |

+----+----------+

|  1 | 张三     |

|  2 | lucy     |

|  3 | jack     |

|  4 | Tom      |

|  5 | Shanshan |

|  6 | Liulang  |

|  7 | 胡扯     |

|  8 | 张三     |

|  9 | 李四     |

+----+----------+

9 rows in set (0.01 sec)


mysql> select * from teacher;

+----+---------------+------------+--------+

| id | name          | time       | scores |

+----+---------------+------------+--------+

|  1 | 张三          | 2020-06-28 |     77 |

|  2 | 李四          | 2020-06-28 |     88 |

|  3 | 王五          | 2020-06-28 |     66 |

|  4 | 赵六          | 2020-06-28 |     49 |

|  5 | 张三          | 2020-06-29 |     81 |

|  6 | 胡八          | 2020-06-29 |     92 |

|  7 | 柳九          | 2020-06-29 |    100 |

|  8 | 王五          | 2020-06-29 |     28 |

|  9 | thisisok      | 2020-07-02 |     75 |

| 10 | whoisthis     | 2020-07-02 |     16 |

| 11 | NULL          | NULL       |     92 |

| 12 | quickto22nick | 2020-07-02 |   NULL |

+----+---------------+------------+--------+

12 rows in set (0.01 sec)

我们来看下exists的用法

mysql> select * from course where exists(select * from teacher where teacher.id = course.id);

+----+----------+

| id | name     |

+----+----------+

|  1 | 张三     |

|  2 | lucy     |

|  3 | jack     |

|  4 | Tom      |

|  5 | Shanshan |

|  6 | Liulang  |

|  7 | 胡扯     |

|  8 | 张三     |

|  9 | 李四     |

+----+----------+

9 rows in set (0.00 sec)

exists用于检查子查询是否至少会返回一行数据,如果返回空集exists返回值就是false,否则就是true,该子查询实际不返回任何数据。

exists对外表用loop逐条查询,每次查询都会查看exists的条件语句

当子查询返回为真时,则外层查询语句将进行查询

当子查询返回为假时,外层查询语句将不进行查询或者查询不出任何记录。


not exists 与exists条件相反,就是当exists结果集有返回值时,条件为false否则为true

我们来看下实例:

mysql> select * from course where not exists(select * from teacher where course.id = teacher.id);

Empty set (0.01 sec)

可以看到如果以course表为基准,则不存在的没有,因为teacher表内容比course表多,那么如果我们将两个表倒过来呢


mysql> select * from teacher where not exists(select * from course where course.id = teacher.id);

+----+---------------+------------+--------+

| id | name          | time       | scores |

+----+---------------+------------+--------+

| 10 | whoisthis     | 2020-07-02 |     16 |

| 11 | NULL          | NULL       |     92 |

| 12 | quickto22nick | 2020-07-02 |   NULL |

+----+---------------+------------+--------+

3 rows in set (0.00 sec)

可以看出,teacher表有3条记录是course表中没有的


in查询

in查询相当于多个or条件的叠加,我们先来看下实例

查询tacher表id在1,2,3行的

mysql> select * from teacher th where th.id in (1,2,3);

+----+--------+------------+--------+

| id | name   | time       | scores |

+----+--------+------------+--------+

|  1 | 张三   | 2020-06-28 |     77 |

|  2 | 李四   | 2020-06-28 |     88 |

|  3 | 王五   | 2020-06-28 |     66 |

+----+--------+------------+--------+

3 rows in set (0.02 sec)

mysql> select * from teacher th where th.id!= 1 and th.id!=2 and th.id!=3;

+----+---------------+------------+--------+

| id | name          | time       | scores |

+----+---------------+------------+--------+

|  4 | 赵六          | 2020-06-28 |     49 |

|  5 | 张三          | 2020-06-29 |     81 |

|  6 | 胡八          | 2020-06-29 |     92 |

|  7 | 柳九          | 2020-06-29 |    100 |

|  8 | 王五          | 2020-06-29 |     28 |

|  9 | thisisok      | 2020-07-02 |     75 |

| 10 | whoisthis     | 2020-07-02 |     16 |

| 11 | NULL          | NULL       |     92 |

| 12 | quickto22nick | 2020-07-02 |   NULL |

+----+---------------+------------+--------+

9 rows in set (0.01 sec)


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

    in()语句只会执行一次,会将符合子查询条件的记录全都查出来,假设结果集为B,共有m条记录并且缓存起来,然后在将子查询条件的结果集分解成m个,再进行m次查询

select * from A where id in(select id from B)

我们来看下实例:

mysql> select * from teacher where id in(select id from course);

+----+----------+------------+--------+

| id | name     | time       | scores |

+----+----------+------------+--------+

|  1 | 张三     | 2020-06-28 |     77 |

|  2 | 李四     | 2020-06-28 |     88 |

|  3 | 王五     | 2020-06-28 |     66 |

|  4 | 赵六     | 2020-06-28 |     49 |

|  5 | 张三     | 2020-06-29 |     81 |

|  6 | 胡八     | 2020-06-29 |     92 |

|  7 | 柳九     | 2020-06-29 |    100 |

|  8 | 王五     | 2020-06-29 |     28 |

|  9 | thisisok | 2020-07-02 |     75 |

+----+----------+------------+--------+

9 rows in set (0.01 sec)

可以看出是要查找出teacher表中id和course表中id的交集对应的值

以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录


好了,今天先到这里吧

MySQL之in和exists的使用和区别_mysql

标签:06,exists,区别,28,2020,MySQL,id,select
From: https://blog.51cto.com/u_11894/5780521

相关文章

  • HTTP和HTTPS的区别
    httpHTTp什么是HTTP超文本传输协议(HTTP)是万维网的基础,用于使用超文本链接加载网页。HTTP是一种应用层协议,旨在在联网设备之间传输信息,并在网络协议栈的其他层之上......
  • MySQL制作图书目录表
    CreateDatabaseIfNotExistsnew_book;              //创建一个数据库usenew_book;            //选择数据库CreateTableuser(  ......
  • MySQL事务(InnoDB)
    MySQL事务(InnoDB)事务的概念事务就是一个不可分割的操作单元,其中的多个操作被认为是一个整体,要么全部执行成功,要么执行失败。事务的特性通常来说,我们一般认为事务具有......
  • SQL优化笔记(MySQL)
    SQL优化笔记(MySQL)目标减少IO次数降低CPU的计算基本原则1.尽量少joinMySQL的优势在于简单,但这在某些方面其实也是其劣势。MySQL优化器效率高,但是由于其统......
  • windows10安装MYSQL服务端
    一、下载安装包1.下载地址:点击mysql安装包下载链接:https://dev.mysql.com/downloads/mysql/,选择window版本,点击下载按钮2.解压缩到无中文字符的路径:二、配置环境变量1.......
  • Mysql慢sql优化
    Mysql慢sql优化index1.MySQL的执行过程2.索引的定义3.MySQL执行计划explainordesc4.索引使用/创建规则5.弊端6.设计规范7.SQL建议1.MySQL的执行过程 2.索引的定......
  • FTP文件上传 报错:451 No mapping for the Unicode character exists in the target mu
    前置:报错场景:文件上传至Ftp服务器报错条件:文件名中的中文个数为单数  解决办法: 1.打开控制面板-“Internet”-Web管理工具-IIS管理控制台的FTP设置界......
  • Mysql分区
    Mysql从5.1版本开始支持分区的功能,分区是指根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分,就访问数据库而言,逻辑上只有一个表或一个索引,但是实际上这个......
  • 对比传统自建数据库,华为云数据库 RDS for MySQL优势明显!
    对于数据库,想必大家都已经不再陌生,但若要解释它是什么,当下市场上的数据库又有着怎样的不同,相信不少小伙伴都处于一知半解的懵逼状态。今天,就让我们来系统的认识一下数据库。......
  • Mysql 系列 | 性能优化 - 紧急临时处理
    在实际开发过程中,业务高峰期常遇到Mysql响应变慢。为了不影响业务,要在短时间内临时提升性能。短链接原因分析短链接是连接数据库后,执行很少的SQL后就断开,下次需......