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

news/2024/10/30 15:34:27/

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

  • 前言
  • 一、建表
    • 1.在MySQL数据库建表语句
    • 2.在ORACLE数据库建表语句
  • 二、在SELECT语句中使用EXISTS
    • 1.在SQL中使用EXISTS
    • 2.在SQL中使用NOT EXISTS
    • 3.在SQL中使用多个NOT EXISTS
    • 4.在SQL中使用多个EXISTS
    • 5.在SQL中使用NOT EXISTS和EXISTS
  • 三、在DELETE语句中使用EXISTS
    • 1.在MySQL中使用
    • 2.在Oracle中使用
  • 四、在UPDATE语句中使用EXISTS
    • 1.在MySQL中使用
    • 2.在Oracle中使用

前言

在业务开展中,会遇到类似需求。

需求1:UPDATE表TEST_TB01中的记录;满足条件:这些记录不在TEST_TB02中。

需求2:UPDATE表TEST_TB01中的记录;满足条件:这些记录在TEST_TB02中。

在SQL语句中EXISTS的用法,能够比较简洁的去解决这类需求。

一、建表

1.在MySQL数据库建表语句

CREATE TABLE TEST_TB01
(sensor_id   BIGINT,part_id     BIGINT,flag        VARCHAR(64))
COMMENT '数据表一';
CREATE TABLE TEST_TB02
(sensor_id   BIGINT,part_id     BIGINT,flag        VARCHAR(64))
COMMENT '数据表二';
CREATE TABLE TEST_TB03
(sensor_id   BIGINT,part_id     BIGINT,flag        VARCHAR(64))
COMMENT '数据表三';

2.在ORACLE数据库建表语句

CREATE TABLE TEST_TB01
(sensor_id  NUMBER(16),part_id    NUMBER(16),flag       VARCHAR(64));
CREATE TABLE TEST_TB02
(sensor_id  NUMBER(16),part_id    NUMBER(16),flag       VARCHAR(64));

二、在SELECT语句中使用EXISTS

在SELECT的SQL语句中使用EXISTS。

在TEST_TB01插入数据:

INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'杭州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'深圳');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

在TEST_TB02插入数据:

INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

在TEST_TB03插入数据:

INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

查看TEST_TB01数据:
在这里插入图片描述
查看TEST_TB02数据:
在这里插入图片描述
查看TEST_TB03数据:
在这里插入图片描述

1.在SQL中使用EXISTS

需求:从TEST_TB01中查询出在TEST_TB02中存在的记录,关联条件是两个表的sensor_id相等。

SQL语句:

SELECTaa.sensor_id,aa.part_id,aa.flag
FROMTEST_TB01 aa
WHERE EXISTS(SELECT 1 FROMTEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id);

执行结果:
在这里插入图片描述

2.在SQL中使用NOT EXISTS

需求:从TEST_TB01中查询出在TEST_TB02中不存在的记录,关联条件是两个表的sensor_id相等。

SQL语句:

SELECTaa.sensor_id,aa.part_id,aa.flag
FROMTEST_TB01 aa
WHERE NOT EXISTS(SELECT 1 FROMTEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id);

执行结果:
在这里插入图片描述

3.在SQL中使用多个NOT EXISTS

需求:从TEST_TB01中查询出在TEST_TB02和TEST_TB03中都不存在的记录,关联条件是表的sensor_id相等。

SQL语句:

SELECTaa.sensor_id,aa.part_id,aa.flag
FROMTEST_TB01 aa
WHERE NOT EXISTS(SELECT 1 FROMTEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id)AND NOT EXISTS(SELECT 1 FROMTEST_TB03 ccWHERE aa.sensor_id = cc.sensor_id);

执行结果:
在这里插入图片描述

4.在SQL中使用多个EXISTS

需求:从TEST_TB01中查询出在TEST_TB02和TEST_TB03中都存在的记录,关联条件是表的sensor_id相等。

SQL语句:

SELECTaa.sensor_id,aa.part_id,aa.flag
FROMTEST_TB01 aa
WHERE  EXISTS(SELECT 1 FROMTEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id)AND  EXISTS(SELECT 1 FROMTEST_TB03 ccWHERE aa.sensor_id = cc.sensor_id);

执行结果:
在这里插入图片描述

5.在SQL中使用NOT EXISTS和EXISTS

需求:从TEST_TB01中查询出在TEST_TB02存在但是TEST_TB03中不存在的记录,关联条件是表的sensor_id相等。

SQL语句:

SELECTaa.sensor_id,aa.part_id,aa.flag
FROMTEST_TB01 aa
WHERE  EXISTS(SELECT 1 FROMTEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id)AND NOT EXISTS(SELECT 1 FROMTEST_TB03 ccWHERE aa.sensor_id = cc.sensor_id);

执行结果:
在这里插入图片描述

三、在DELETE语句中使用EXISTS

在DELETE的SQL语句中使用EXISTS和NOT EXISTS。

在TEST_TB01插入数据:

INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'杭州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'深圳');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

在TEST_TB02插入数据:

INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

1.在MySQL中使用

需求:从TEST_TB01中删除在TEST_TB02中存在的记录,关联条件是两个表的sensor_id相等。

注意:本例使用MySQL版本:MySQL 5.7.33。

SQL语句:

DELETE  FROM 
TEST_TB01 aa
WHERE EXISTS(SELECT 1 FROMTEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id);

执行结果:
在这里插入图片描述
结论:在MySQL中是不支持在DELETE的SQL语句中使用EXISTS和NOT EXISTS这种句法。(本例版本:MySQL 5.7.33)。

解决此需求:
SQL语句:

DELETEaa
FROMTEST_TB01 aaINNER JOIN TEST_TB02 bbON aa.sensor_id = bb.sensor_id;

注意:在SQL中DELETE后面紧跟着的是需求中需要删除的表名的别名。

如果不使用别名会报错:
在这里插入图片描述

2.在Oracle中使用

需求:从TEST_TB01中删除在TEST_TB02中存在的记录,关联条件是两个表的sensor_id相等。

SQL语句:

DELETE  FROM 
TEST_TB01 aa
WHERE EXISTS(SELECT 1 FROMTEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id);

执行结果:

执行前TEST_TB01:
在这里插入图片描述
执行前TEST_TB02:
在这里插入图片描述
执行后TEST_TB01:
在这里插入图片描述

四、在UPDATE语句中使用EXISTS

在UPDATE的SQL语句中使用EXISTS。

在TEST_TB01插入数据:

INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'城市');

在TEST_TB02插入数据:

INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

1.在MySQL中使用

需求:在TEST_TB01中更新,在TEST_TB02中存在的记录,关联条件是两个表的sensor_id相等。

注意:本例使用MySQL版本:MySQL 5.7.33。

SQL语句:

UPDATE TEST_TB01 aaSET (aa.part_id, aa.flag) =(SELECT bb.part_id, bb.flagFROM TEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id)WHERE EXISTS(SELECT 1 FROM TEST_TB02 cc WHERE aa.sensor_id = cc.sensor_id);

执行结果:
在这里插入图片描述
结论:在MySQL中是不支持在UPDATE的SQL语句中使用EXISTS和NOT EXISTS这种句法。(本例版本:MySQL 5.7.33)。

解决此需求:

SQL语句:

UPDATE TEST_TB01 aa ,TEST_TB02 bb
SET aa.part_id=bb.part_id,aa.flag=bb.flag
WHERE aa.sensor_id = bb.sensor_id;

执行结果:

执行前TEST_TB01:
在这里插入图片描述
执行前TEST_TB02:
在这里插入图片描述
执行后TEST_TB01:
在这里插入图片描述

2.在Oracle中使用

需求:在TEST_TB01中更新,在TEST_TB02中存在的记录,关联条件是两个表的sensor_id相等。

SQL语句:

UPDATE TEST_TB01 aaSET (aa.part_id, aa.flag) =(SELECT bb.part_id, bb.flagFROM TEST_TB02 bbWHERE aa.sensor_id = bb.sensor_id)WHERE EXISTS(SELECT 1 FROM TEST_TB02 cc WHERE aa.sensor_id = cc.sensor_id);

执行结果:

执行前TEST_TB01:
在这里插入图片描述
执行前TEST_TB02:
在这里插入图片描述
执行后TEST_TB01:
在这里插入图片描述


http://www.ppmy.cn/news/341942.html

相关文章

Arcgis根据经纬度获得点的地理信息/行政区划信息

步骤可以总结为: 导入shp文件(面数据,也就是行政区划的依据) 导入栅格数据 将栅格数据落入到坐标系中 将导入的栅格点导出为shp图层 栅格点与面数据连接对齐 导出结果 1、导入shp文件(面数据,也就是行…

Oracle表分区知识整理

一、 Oracle表分区的概念 Oracle 分区功能可以提高许多应用程序的可管理性、性能与可用性。通过分区功能,可以将表、索引和索引组织表进一步细分为段,从而能够更精确地管理和访问这些数据库对象。Oracle 提供了种类繁多的分区方案以满足每种业务要求。 …

oracle表分区

一、 Oracle表分区的概念 Oracle 分区功能可以提高许多应用程序的可管理性、性能与可用性。通过分区功能,可以将表、索引和索引组织表进一步细分为段,从而能够更精确地管理和访问这些数据库对象。Oracle 提供了种类繁多的分区方案以满足每种业务要求。 …

逐浪软件六周年大型有奖征文启动

原文:http://zoomla.cn/Article/news/1294.shtml 07.jpg(27.29 K) 2011-2-26 10:25:23 从相识, 到相知, 到相爱。逐浪软件六年的历程, 是不断跋涉与践行大道的历程。 Zoomla!这个响亮的字符, 始终刻在每一个逐浪人的心…

redhat 7 手册

序 1994年,Young和Mark Ewing创建了Red Hat公司,并创造了全球使用最广泛的Red Hat Linux套件,为Linux的普及立下了汗马功劳,笔者也是跟随着Red Hat的带领下走进Linux世界的。Red Hat取得了辉煌的成绩,甚至许多Linux发行…

刚买的win8.1电脑 求常用的软件推荐?

知乎链接 回到了学校,因为学习工作,还是换回了win8.1 with update 3,然后更新一下,分享一下自己使用到的软件 -------------------------------------11:08 2015/3/16更新------------------------------------------- 1、浏览器…

7.Mysql 事务底层

一、事务的基础知识 mysql中的事务 分为 显式事务 和 隐式事务。 1.1 显式事务 显式事务就是我们手动开启事务,并且提交事务比如: -- 开启事务 begin; -- 执行查询语句 select *from where id = 1 for update ; -- 提交事务 commit;1.2 隐式事务 在 MySQL 中,隐式事务是…

易基因:NAR:ChIP-seq等揭示蛋白质酰基化与c-di-GMP协同调控放线菌发育与抗生素合成机制|项目文章

易基因细菌ChIP-seq测序分析结果见刊《Nucleic Acids Research》 大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 2023年06月07日,华东理工大学生物工程学院和生物反应器工程国家重点实验室叶邦策教授和尤迪副教授为共同通…