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

作者:zhangbeizhen18 时间:2024-01-22 11:09:11 

前言

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

需求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的详细用法大全

 以上,感谢。

来源:https://blog.csdn.net/zhangbeizhen18/article/details/119060431

标签:sql,exists,数据库
0
投稿

猜你喜欢

  • 详解Angular 中 ngOnInit 和 constructor 使用场景

    2024-05-11 09:18:05
  • Python利用装饰器click处理解析命令行参数

    2023-12-23 20:49:05
  • python编写脚本之pyautogui的安装和使用教程

    2021-06-17 09:48:11
  • python实现图书借阅系统

    2022-03-26 07:46:32
  • 一文掌握MySQL表的创建和约束

    2024-01-25 18:36:53
  • 如何利用python实现列表嵌套字典取值

    2023-07-08 02:16:50
  • SQLSERVER2008中CTE的Split与CLR的性能比较

    2024-01-28 06:56:04
  • Django实现简单分页功能的方法详解

    2021-02-07 01:54:23
  • Python简单格式化时间的方法【strftime函数】

    2023-03-29 11:30:16
  • docker django无法访问redis容器的解决方法

    2021-10-05 05:48:22
  • javascript使用正则表达式检测IP地址

    2024-03-15 11:06:52
  • 小白教程|一小时上手最流行的前端框架vue(推荐)

    2024-04-30 10:34:20
  • sql 查询本年、本月、本日记录的语句,附SQL日期函数

    2024-01-25 01:00:55
  • python 使用cycle构造无限循环迭代器

    2022-08-19 13:09:10
  • perl的cgi高级编程介绍

    2022-10-04 23:41:28
  • Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解

    2024-04-26 17:20:16
  • SQL Server 2005中的CLR集成

    2009-03-10 15:07:00
  • Python数据结构之图的应用示例

    2021-06-02 21:59:27
  • Oracle9iPL/SQL编程的经验小结

    2010-07-23 12:49:00
  • 使用MySQL数据库的23个注意事项

    2010-03-18 15:46:00
  • asp之家 网络编程 m.aspxhome.com