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


Posted in MySQL onJune 25, 2022

前言

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

需求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数据:

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

查看TEST_TB02数据:

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

查看TEST_TB03数据:

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

 1.在SQL中使用EXISTS

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

SQL语句:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id);

执行结果:

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

 2.在SQL中使用NOT EXISTS

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

SQL语句:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE NOT EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id);

执行结果:

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

 3.在SQL中使用多个NOT EXISTS

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

SQL语句:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE NOT EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id)
  AND NOT EXISTS
  (SELECT 1 FROM
    TEST_TB03 cc
  WHERE aa.sensor_id = cc.sensor_id);

执行结果:

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

 4.在SQL中使用多个EXISTS

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

SQL语句:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE  EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id)
  AND  EXISTS
  (SELECT 1 FROM
    TEST_TB03 cc
  WHERE aa.sensor_id = cc.sensor_id);

执行结果:

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

 5.在SQL中使用NOT EXISTS和EXISTS

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

SQL语句:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE  EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id)
  AND NOT EXISTS
  (SELECT 1 FROM
    TEST_TB03 cc
  WHERE aa.sensor_id = cc.sensor_id);

执行结果:

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

三、在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 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id);

执行结果:

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

 结论:在MySQL中是不支持在DELETE的SQL语句中使用EXISTS和NOT EXISTS这种句法。(本例版本:MySQL 5.7.33)。

解决此需求

SQL语句:

DELETE
  aa
FROM
  TEST_TB01 aa
 INNER JOIN TEST_TB02 bb
    ON aa.sensor_id = bb.sensor_id;

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

如果不使用别名会报错:

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

 2.在Oracle中使用

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

SQL语句:

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

执行结果:

执行前TEST_TB01:

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

 执行前TEST_TB02:

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

 执行后TEST_TB01:

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

四、在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 aa
   SET (aa.part_id, aa.flag) =
       (SELECT bb.part_id, bb.flag
          FROM TEST_TB02 bb
         WHERE aa.sensor_id = bb.sensor_id)
 WHERE EXISTS
 (SELECT 1 FROM TEST_TB02 cc 
       WHERE aa.sensor_id = cc.sensor_id);

执行结果:

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

 结论:在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:

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

 执行前TEST_TB02:

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

 执行后TEST_TB01:

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

 2.在Oracle中使用

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

SQL语句:

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

执行结果:

执行前TEST_TB01:

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

 执行前TEST_TB02:

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

 执行后TEST_TB01:

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

 以上,感谢。

总结

到此这篇关于SQL语句中EXISTS用法的文章就介绍到这了,更多相关SQL语句EXISTS用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
为什么mysql字段要使用NOT NULL
May 13 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
MySQL 存储过程的优缺点分析
May 20 MySQL
MySQL触发器的使用
May 24 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
MySQL创建定时任务
Jan 22 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 #MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 #MySQL
MySQL数据库表约束讲解
Jun 21 #MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 #MySQL
MySQL transaction事务安全示例讲解
Jun 21 #MySQL
MySQL详细讲解变量variables的用法
Jun 21 #MySQL
mysql sql常用语句大全
Jun 21 #MySQL
You might like
php生成随机密码的几种方法
2011/01/17 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
JavaScript中的排序算法代码
2011/02/22 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python使用requests发送POST请求实例代码
2018/01/25 Python
python构建深度神经网络(续)
2018/03/10 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
python打开使用的方法
2019/09/30 Python
Python list运算操作代码实例解析
2020/01/20 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
关于人生的感言
2014/01/17 职场文书
小学生自我评价范文
2014/01/25 职场文书
实习老师离校感言
2014/02/03 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
防火标语大全
2014/10/06 职场文书
幼儿园辞职书
2015/02/26 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
解决golang 关于全局变量的坑
2021/05/06 Golang
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android
MySQL修炼之联结与集合浅析
2021/10/05 MySQL