iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql中关键词exists的用法实例详解
  • 783
分享到

mysql中关键词exists的用法实例详解

2024-04-02 19:04:59 783人浏览 泡泡鱼
摘要

目录前言语法解释语法说明使用案例环境准备常用查询exists与in的效率比较循环嵌套查询执行原理循环优化策略exists和in查询原理的区别结论总结前言 在日常开发中,用Mysql进

前言

在日常开发中,用Mysql进行查询的时候,有一个比较少见的关键词exists,我们今天来学习了解一下这个exists这个sql关键词的用法,这样在工作中遇到一些特定的业务场景就可以有更加多样化的解决方案

语法解释

语法

SELECT column1 FROM t1 WHERE [conditions] and EXISTS (SELECT * FROM t2 );

说明

括号中的子查询并不会返回具体的查询到的数据,只是会返回true或者false,如果外层sql的字段在子查询中存在则返回true,不存在则返回false
即使子查询的查询结果是null,只要是对应的字段是存在的,子查询中则返回true,下面有具体的例子

执行过程

1、首先进行外层查询,在表t1中查询满足条件的column1

2、接下来进行内层查询,将满足条件的column1带入内层的表t2中进行查询,

3、如果内层的表t2满足查询条件,则返回true,该条数据保留

4、如果内层的表t2不满足查询条件,则返回false,则删除该条数据

5、最终将外层的所有满足条件的数据进行返回

贴个链接,mysql官方对于这个命令的说明: https://dev.mysql.com/doc/refman/8.0/en/exists-and-not-exists-subqueries.html;喜欢看英文原版说明的可以来这里看一下

使用案例

环境准备

? mysql版本: 8.0.28

? 数据库表设计:

学生表: t_student

CREATE TABLE `t_student` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '学生姓名',
  `age` int NOT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表';

导入部分数据

INSERT INTO `t_student` (`id`, `name`, `age`)
VALUES
   (1, '小张', 10),
   (2, 'chenille', 13),
   (3, '小王', 15),
   (4, '小米', 11),
   (5, 'dong', 13),
   (6, 'xi', 12),
   (7, 'chenille', 13),
   (8, '小王地方', 15),
   (9, '米来', 11),
   (10, 'dong', 13),
   (11, '呵呵', 12),
   (12, 'chenille', 13),
   (13, '小赵', 15),
   (14, '小米-0', 11),
   (15, 'bei', 13),
   (16, 'xi-xx', 12),
   (17, 'chenille', 13),
   (18, '小王-hehe', 15),
   (19, '小米-qian', 11),
   (20, 'dong', 13),
   (21, 'xi', 12),
   (22, 'chenille', 13),
   (23, '小王-1', 15),
   (24, '小米-2', 11),
   (25, 'dong-3', 13),
   (26, 'xi-0', 12),
   (27, 'chenille-4', 13),
   (28, '小王-4', 15),
   (29, '小米-7', 11),
   (30, 'dong-1', 13),
   (31, 'xi-5', 12),
   (32, '貔貅', 10),
   (33, '耄耋', 12),
   (34, '饕餮', 9),
   (35, '龙', 13),
   (36, '青牛', 12);

班级学生表:t_class_student

CREATE TABLE `t_class_student` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `student_id` int NOT NULL COMMENT '学生ID',
  `class_id` int NOT NULL COMMENT '班号',
  `class_name` varchar(100)  DEFAULT '' COMMENT '班级名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='班级学生表';

导入部分数据

 INSERT INTO `t_class_student` (`id`, `student_id`, `class_id`, `class_name`)
VALUES
    (1, 1, 1, '一年级1班'),
    (2, 2, 1, '一年级1班'),
    (3, 3, 1, '一年级1班'),
    (4, 4, 1, '一年级1班'),
    (5, 5, 1, '一年级1班'),
    (6, 6, 1, '一年级1班'),
    (7, 7, 1, '一年级1班'),
    (8, 8, 1, '一年级1班'),
    (9, 9, 1, '一年级1班'),
    (10, 10, 1, '一年级1班'),
    (11, 11, 2, '一年级2班'),
    (12, 12, 2, '一年级2班'),
    (13, 13, 2, '一年级2班'),
    (14, 14, 2, '一年级2班'),
    (15, 15, 2, '一年级2班'),
    (16, 16, 2, '一年级2班'),
    (17, 17, 2, '一年级2班'),
    (18, 18, 2, '一年级2班'),
    (19, 19, 2, '一年级2班'),
    (20, 20, 2, '一年级2班'),
    (21, 21, 3, '二年级2班'),
    (22, 22, 3, '二年级2班'),
    (23, 23, 3, '二年级2班'),
    (24, 24, 3, '二年级2班'),
    (25, 25, 3, '二年级2班'),
    (26, 26, 3, '二年级2班'),
    (27, 27, 3, '二年级2班'),
    (28, 28, 3, '二年级2班'),
    (29, 29, 3, '二年级2班'),
    (30, 30, 3, '二年级2班'),
    (31, 31, 4, '三年级1班');
    (32, 32, 4, null);

常用查询

已分配班级的学生名单 ?

select * from t_student as s where exists (select student_id from t_class_student where student_id = s.id);

未分配班级的学生名单 ?

select * from t_student as s where not exists (select student_id from t_class_student where student_id = s.id);

已分配 三年级1班 的学生名单 ?

select * from t_student as s where exists (select student_id from t_class_student where student_id = s.id and class_id = 4);

已分配 并且班级是 一年级1班 和 一年级2班 的学生名单 ?

select * from t_student as s where exists (select student_id from t_class_student where student_id = s.id and class_id in (1, 2) );

查询到的字段为null,但是子查询返回的结果为true ?

select * from t_student as s where exists (select class_name from t_class_student where student_id = s.id and class_id = 4);

查询全部学生名单 ?

select * from t_student as s where exists (select student_id from t_class_student where 1=1);

已分配 三年级1班 的并且年龄大于10岁的学生名单 ?

select * from t_student as s where age > 10 and exists (select student_id from t_class_student where student_id = s.id and class_id = 4);

exists与in的效率比较

上面的这些查询其实也可以通过 in 关键字来实现,下面我们写一下 in 关键字对应的查询语句,

通过 in 实现已分配班级的学生名单 ?

select * from t_student as s where id in (select student_id from t_class_student where student_id = s.id);

通过 in 实现未分配班级的学生名单 ?

select * from t_student as s where id not in (select student_id from t_class_student where student_id = s.id);

下面我们来分析一下这两个关键字使用效率到底那个更高呢?

循环嵌套查询执行原理

? 循环由外向内,外层循环执行一次,内层循环则需要完整的执行一次,内层执行执行完后返回执行结果,外层循环继续执行,直到外层循环完全执行完成

循环优化策略

? 有了上面的执行原理的说明,我们明白了一个道理:内层循环次数的多少不会影响到外层的次数,但是外层循环的次数直接会影响到内层循环的次数,外层循环每多一次,内层循环就需要多完整的一次循环,所以我们优化的目标其实就是使外层的循环次数尽量少,总结来说:小表驱动大表。小表就是外层循环,大表就是内层循环,也就是尽量减少外层循环的次数

exists和in查询原理的区别

? exists : 外表先进行循环查询,将查询结果放入exists的子查询中进行条件验证,确定外层查询数据是否保留

? in : 先查询内表,将内表的查询结果当做条件提供给外表查询语句进行比较

结论

通过上面的优化策略分析和exists和in的查询原理的分析,将这两块内容结合起来其实就得出了我们想要的一个结论:

外层小表,内层大表(或者将sql从左到由来看:左面小表,右边大表): exists 比 in 的效率高
外层大表,内层小表(或者将sql从左到由来看:左面大表,右边小表): in 比 exists 的效率高

参考资料

Https://www.bilibili.com/video/BV1V64y1q7yi?spm_id_from=333.337.search-card.all.click

总结

上面我们简单介绍了一下平时我们比较少用到的一个exists的关键字,通过一些使用的实例,大家也可以基本上了解了它的使用方法,在以后的日常工作中,我们在碰到一些查询问题的时候,这个时候就有了更加多样化的选择方案啦

到此这篇关于mysql中关键词exists用法的文章就介绍到这了,更多相关mysql exists用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: mysql中关键词exists的用法实例详解

本文链接: https://www.lsjlt.com/news/151072.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql中关键词exists的用法实例详解
    目录前言语法解释语法说明使用案例环境准备常用查询exists与in的效率比较循环嵌套查询执行原理循环优化策略exists和in查询原理的区别结论总结前言 在日常开发中,用mysql进...
    99+
    2022-11-13
  • mysql中关键词exists怎么使用
    这篇文章主要讲解了“mysql中关键词exists怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql中关键词exists怎么使用”吧!语法解释语法SELECT colu...
    99+
    2023-07-02
  • Verilog关键词的条件语句实例详解
    目录关键词:if,选择器条件语句关键词:if,选择器 条件语句 条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。 条件语句用关键字 if 和 else 来声明,条件表...
    99+
    2023-05-15
    Verilog关键词条件语句 Verilog条件语句
  • Verilog关键词的多分支语句实例详解
    目录关键词:case,选择器case 语句casex/casez 语句关键词:case,选择器 case 语句是一种多路条件分支的形式,可以解决 if 语句中有多个条件选项时使用不...
    99+
    2023-05-15
    Verilog关键词多分支语句 Verilog多分支语句
  • mysql中exists的用法详解
    前言 在日常开发中,用mysql进行查询的时候,有一个比较少见的关键词exists,我们今天来学习了解一下这个 exists这个sql关键词的用法,这样在工作中遇到一些特定的业务场景就可以有更加多样化的解决方案 语法解释 语法 SELEC&...
    99+
    2023-08-16
    mysql 数据库 database exists in
  • MySQL中ESCAPE关键字的用法详解
    MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义。 MySQL中,转义字符以“\”开头,编程中常见的转义字符,在M...
    99+
    2022-05-30
    MySQL ESCAPE关键字 MySQL ESCAPE
  • oracle中的exists 和not exists 用法详解
    在Oracle中,EXISTS和NOT EXISTS是用来检查子查询是否返回任何行的条件运算符。- EXISTS:当子查询返回至少一...
    99+
    2023-09-12
    Oracle
  • JavaScript中的this关键词指向实例分析
    这篇文章主要讲解了“JavaScript中的this关键词指向实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中的this关键词指向实例分析”吧!1、es5中的th...
    99+
    2023-06-30
  • Kotlinthis关键字的使用实例详解
    目录this可以用来访问类的成员使用this访问类实例二级构造函数的委托在 Kotlin 中,this 关键字允许我们引用一个类的实例,该类的函数恰好正在运行。此外,还有其他方式可以...
    99+
    2023-02-17
    Kotlin this关键字 Kotlin this的使用
  • C#CLR中学习C++关键词extern使用详解
    目录一:背景extern1. 变量定义和变量引用2. extern "C"一:背景 在 CLR 源码中有很多的 extern 和 e...
    99+
    2022-11-13
  • java中构造方法及this关键字的用法实例详解(超详细)
    目录初识构造方法 构造方法的使用 初识this this.xx的用法this()用于构造函数的调用总结初识构造方法  我们上篇讲了java中类...
    99+
    2022-11-13
  • Java中的final关键字详解及实例
    Java中的final关键字1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。 上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 如果修...
    99+
    2023-05-31
    java final 关键字
  • java之assert关键字用法案例详解
    Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion)。,它的语法形式有如下所示的两种形式: 1、assert con...
    99+
    2022-11-12
  • js词法作用域与this实例详解
    目录前言实践总结前言 静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区...
    99+
    2022-11-13
  • MySQL 外键(FOREIGN KEY)用法案例详解
    引子:把所有数据都存放于一张表的弊端 表的组织结构复杂不清晰 浪费空间 扩展性极差 为了解决上述的问题,就需要用多张表来存放数据。 表与表的记录之间存在着三种关系:一对多、多对多、一对一的...
    99+
    2022-05-18
    MySQL 外键 MySQL FOREIGN KEY
  • mysql使用正则匹配查询关键词的方法
    我们在查询某个字段的时候,有时候只想匹配某段数据,比如想查询这篇文章的所有关键词是否存在某个关键词,我们往往需要匹配,我们下面来讲解一下如何匹配查询某个关键词值SQL模糊查询的语法为“SELECT ...
    99+
    2022-10-18
  • MySQL 中MATCH 全文搜索关键字示例详解
    MATCH()函数是mysql中专门用于全文搜索的函数。该函数的作用是在一个文本列上执行全文搜索,并且返回一个匹配度的得分。MATCH()函数可以接收一个或多个搜索词,可以支持Boolean、Natural Langua...
    99+
    2023-09-26
    mysql match全文搜索 mysql match关键字
  • JavaScript中的this关键字用法详解
    目录this的绑定call与apply当方法失去主语的时候,this不再有?不可见的调用总结先举一个生活例子: 小明正在跑步,他看起来很开心 这里的小明是主语,如果没有这个主语,那么...
    99+
    2023-05-19
    JavaScript this关键字 JavaScript 关键字 JavaScript this
  • Javasuper关键字的用法详解
    目录super关键字的三种用法:1. super.成员变量2. super.成员方法3. super():调用父类中的构造方法3.1.1 隐式调用父类无参数构造方法super()3....
    99+
    2022-11-12
  • Java线程中的关键字和方法示例详解
    目录一、volatile关键字1,volatile 能保证内存可见性2,编译器优化问题二、wait 和 notify1,wait()方法2,notify()方法 3,not...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作