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

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

在mysql中,exists用于检查子查询是否将返回至少一行数据。子查询实际上不返回任何数据,而是返回true或false。下面这篇文章主要介绍mysql中关于关键字exists用法的相关信息,有需要的可以参考一下。

目录

前言语法解释语法描述用例环境准备常用查询;exists与in的效率比较;循环嵌套查询的执行原理;循环优化策略;exists和in查询原则的区别;结论摘要

前言

在日常开发中,使用mysql进行查询时,有一个罕见的关键字存在。今天,我们就来学习一下这个已有的sql关键字的用法,以便在工作中遇到一些具体的业务场景时,能够有更加多样化的解决方案。

语法解释

语法

从t1中选择[条件]且存在的列1(从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/ref man/8.0/en/exists-and-not-exists-queries . html;喜欢看英文原版说明书的可以来这里看看。

使用案例

环境准备

Mysql版本:8.0.28

数据库表设计:

学生形式:t_student

创建表“t_student ”(

` id ' int unsigned NOT NULL AUTO _ INCREMENT,

` name` varchar (100)字符集utf8mb 4 collate utf8mb 4 _ 0900 _ ai _ cidefault ' '注释'学生姓名',

` age`int not null注释' age ',

主键(` id `)

)engine=innod auto _ increment=37 default charset=ut F8 MB 4 collate=ut F8 MB 4 _ 0900 _ ai _ ci comment=' student table ';

导入部分数据

插入到` t_student` (`id `,` name `,` age `)

价值观念

(1,《张》,10),

(2,《雪尼尔》,13),

(3,《小王》,15),

(4,'小米',11),

(五,《董》卷十三),

(6,《xi》,12),

(7,《雪尼尔》,13),

(8,《小王的住处》,15),

(9,《米莱》,11),

(10,《董》,13),

(11,'呵呵',12),

(12,“雪尼尔”,13),

(13,《小昭》,15),

(14,'小米-0 ',11),

(15,《北》,13),

(16,“xi-xx”,12),

(17,《雪尼尔》,13),

(18,《小王——呵呵》,15),

(19,《小米-钱》,11),

(20,《董》,13),

(21,《xi》,12),

(22,“雪尼尔”,13),

(23,《小王-1》,15),

(24,'小米-2 ',11),

(25,《东三》,13),

(26,“xi-0”,12),

(27,《雪尼尔-4》,13),

(28,《小王-4》,15),

(29,'小米-7 ',11),

(30,《东-1》,13),

(31,“xi-5”,12),

(32,'勇敢',10),

(33,《老年》,12),

(34,“饕餮”,9),

(35,《龙族》,13),

(36,《青牛》,12);

班级表:t_class_student

创建表“t_class_student `(

` id ' int unsigned NOT NULL AUTO _ INCREMENT,

` student_ID` int NOT NULL注释'学生ID ',

` class _ id`int not null注释'类号',

` class _ name ` varchar(100)default ' ' comment '类名',

主键(` id `)

)engine=innod auto _ increment=32 defaultcharset=ut F8 MB 4 collate=ut F8 MB 4 _ 0900 _ ai _ ci comment=' class student table ';

导入部分数据

插入到` t_class_student` (`id `,` student_id `,` class_id `,` class_name `)

价值观念

(1,1,1,'一年级一班'),

(二,二,一,“一年级一班”),

(三,三,一,'一年级一班'),

(四,四,一,'一年级一班'),

(五,五,一,'一年级一班'),

(6,6,1,'一年级一班'),

(7,7,1,'一年级一班'),

(八,八,一,'一年级一班'),

(9,9,1,'一年级一班'),

(10,10,1,'一年级一班'),

(11,11,2,'一年级二班'),

(12,12,2,'一年级二班'),

(13,13,2,'一年级二班'),

(14,14,2,'一年级二班'),

(15,15,2,'一年级二班'),

(16,16,2,'一年级二班'),

(17,17,2,'一年级二班'),

(18,18,2,'一年级二班'),

(19,19,2,'一年级二班'),

(20,20,2,'一年级二班'),

(21,21,3,'二年级二班'),

(22,22,3,'二年级二班'),

(23,23,3,'二年级二班'),

(24,24,3,'二年级二班'),

(25,25,3,'二年级二班'),

(26,26,3,'二年级二班'),

(27,27,3,'二年级二班'),

(28,28,3,'二年级二班'),

(29,29,3,'二年级二班'),

(30,30,3,'二年级二班'),

(31,31,4,'三年级一班');

(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 exist(select student _ id from t _ class _ student where student _ id=s . id);

被分配到三年级一班的学生名单

select * from t _ student as s where exists(select student _ id from t _ class _ student其中student_id=s.id,class _ id=4);

已分配的学生名单,班级为一年级一班和二班。

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));

查询的字段为空,但子查询返回的结果为真。

select * from t _ student as s where exists(select class _ name from t _ class _ student其中student_id=s.id,class _ id=4);

检查所有学生的名单。

select * from t _ student as s where exists(select student _ id from t _ class _ student where 1=1);

被分到三年级一班的10岁以上学生名单。

select * from t_student as s其中年龄10且存在(select student _ id from t _ class _ student其中student_id=s.id,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关键字。通过一些例子,基本可以了解它的用法。在以后的日常工作中,当我们遇到一些查询问题时,这个时候我们会有更加多样化的选择。

关于关键字exists在mysql中的用法的文章到此结束。有关mysqlexists用法的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 使用php连接mysql数据库,php连接数据库的方法
  • 使用php连接mysql数据库,php连接数据库的方法,一文详解PHP连接MySQL数据库的三种方式
  • pymysql菜鸟教程,pymysql 使用
  • pymysql菜鸟教程,pymysql 使用,pymysql模块使用简介与示例
  • mysql锁实现,mysql锁算法
  • mysql锁实现,mysql锁算法,MySQL锁机制与用法分析
  • mysql连接报错10061,mysql连接错误10060
  • mysql连接报错10061,mysql连接错误10060,MYSQL无法连接 提示10055错误的解决方法
  • mysql连接报10060错误,mysql连接报错10055
  • mysql连接报10060错误,mysql连接报错10055,MySQL连接异常报10061错误问题解决
  • mysql辅助索引和主键索引,mysql 主键 外键 索引
  • mysql辅助索引和主键索引,mysql 主键 外键 索引,MySQL索引之主键索引
  • MySQL语句大全,mysql常见语句总结
  • MySQL语句大全,mysql常见语句总结,MySQL语句整理及汇总介绍
  • mysql触发器的使用方法实验报告,mysql中触发器的使用
  • 留言与评论(共有 条评论)
       
    验证码: