首页 > 数据库 >sql中 exists的用法

sql中 exists的用法

时间:2023-02-13 17:13:15浏览次数:37  
标签:exists 用法 ID sql c2 c1 where CLASS select

现有:班级表(A_CLASS) 

学生表( STUDENT)

注:学生表(STUDENT)的classId关联班级表(A_CLASS)的主键ID

 

 

代码:

select * from STUDENT s WHERE exists (select 1 from A_ClASS c where s.CLASS_ID=c.ID)

结果

 

 

 

 

【exists语句的执行顺序如下】:

1.首先会执行外循环(select * from student)

2.外循环返回的结果每一行都会拿着去内层循环执行(此时注意,内层也是循环查询的)

 

ps:select * from student查询的为 (c1,c1,c2,c3);此时执行顺序应该是(

第一次:select* from A_CLASS where c1=c1,第二次:select* from A_CLASS where c1=c2,

第三次:select* from A_CLASS where c1=c1,第四次:select* from A_CLASS where c1=c2,

第五次:select* from A_CLASS where c2=c1,第六次:select* from A_CLASS where c2=c2,

第七次:select* from A_CLASS where c3=c1,第八次:select* from A_CLASS where c3=c2)

 

注意:此时的内层子查询如果为true,则直接返回不会再继续执行本次循环;

综上所述:第二次和第四次是不会被执行的;  第一次和第三次还有第六次是符合条件的;

所以 STUDENT表中CLASS_ID字段为(c1,c2)的数据都会被查询出来;

 

 

 

 

如果将 上述语句的=换成!=会是什么效果?

select * from STUDENT s WHERE exists (select 1 from A_ClASS c where s.CLASS_ID!=c.ID)

 

结果如果所示: 

 

具体分析一下:此时的执行应该和第一次一模一样也是循环8次分别为:

第一次:select* from A_CLASS where c1!=c1,第二次:select* from A_CLASS where c1!=c2,

第三次:select* from A_CLASS where c1!=c1,第四次:select* from A_CLASS where c1!=c2,

第五次:select* from A_CLASS where c2!=c1,第六次:select* from A_CLASS where c2!=c2,

第七次:select* from A_CLASS where c3!=c1,第八次:select* from A_CLASS where c3!=c2

 

但是=换成了!=;这次是第六次和第八次没有被执行,其余的全被执行,s.CLASS_ID涉及到(c1,c2,c3)并且语句都返回了true;

所以STUDENT表中CLASS_ID字段为(c1,c2,c3)的数据都会被查询出来;

 

总结:

1.exists执行外循环后,会拿着外循环的值,去内层查询,如果查询到就直接返回true,并且终止本次循环,如果是false,则会一直执行,直至循环完成还为false,则本次内循环不符合条件;

2.内层的判断条件不要写!=;查询的结果会不尽人意;

 

标签:exists,用法,ID,sql,c2,c1,where,CLASS,select
From: https://www.cnblogs.com/sexintercourse/p/17116994.html

相关文章

  • mysql怎么删除重复数据并且保留其中一条
    现在有张加班表,一个人同一天只允许申请一次加班,就是加班日期和userid相同的数据应该只有一条,但是现在由于之前没有做限制,导致很多数据重复怎么通过sql删掉重复数据思路:......
  • SQL执行慢的原因分析以及调优手段
    目录开发规范※谨慎使用MySQL分区表※经常一起使用的列放到一个表中※禁止在数据库中存储文件(比如图片)这类大的二进制数据所有表必须使用InnoDB存储引擎数据库和表的字......
  • 数据库导出excel信息(mysql数据库已经验证)
    导出表信息1SELECT2TABLE_NAME表名,3REPLACE(4REPLACE(TABLE_COMMENT,CHAR(10),''),5CHAR(13),6','7......
  • mysql中判断一个字段是否为纯数字
    今天线上,某些数据的行政区划展示成数字了,应该是这个字段存了中文的名字而不是行政区划代码需求:查出表中某个字段不是纯数字,因为行政区划代码是纯数字,哪怕有一个汉字......
  • docker搭建mysql主从复制
    docker搭建mysql主从复制​​1、主从复制搭建步骤​​​​1.1新建主服务器容器实例3307​​​​1.2新建my.cnf​​​​1.3重启master实例​​​​1.4进入mysql-master容......
  • docker安装mysql:5.7(利用数据卷挂载方式启动)
    docker安装mysql:5.7​​1、DockerHub上面查找mysql镜像​​​​2、拉取镜像​​​​3、新建mysql容器实例​​​​4、新建my.cnf文件​​​​5、重新启动mysql容器实例再......
  • 运维工程师监控工作之Mysql数据库监控
    目前互联网公司、金融公司信创建设最常用的数据库是Mysql,由于外部流量压力往往最终落到数据库层面,因此对Mysql数据库的监控几乎是运维工程师的看家本领。数据库监控通常分......
  • mysql带条件的插入语句
    文章目录​​一、数据库表结构​​​​1、moduleRole(中间表)​​​​2、roleInfo表​​​​3、moduleInfo表​​​​二、带条件插入的代码如下:​​一、数据库表结构1、modu......
  • mysql按照日期字段分组统计表数据
    问题描述测试表如下:上面的日期是精确到日的,我现在要按照年月来将上表的数据分组统计,并求出number的平均值。例:查出wellid='001’每月的number平均值sql语句关键词:日期字......
  • this用法
    简易的类属性调用的类名替换(仅在类内部适用)eg:一般格式:A类的内部的B属性调用为:A->B用this替换:A类的内部的B属性调用:this->B 反之,如果在A类之外不可用此方法调......