记录:258

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

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

以上,感谢。

SQL语句中EXISTS的用法相关推荐

  1. 判断sql语句中exists的用法

    update demo_order a set order_name='橘子' where exists ( select 1 from demo_table b where a.order_id=b ...

  2. sql语句中exists用法详解

    文章目录 一.语法说明 exists: not exists: 二.常用示例说明 1.查询a表在b表中存在数据 2.查询a表在b表中不存在数据 3.查询时间最新记录 4.exists替代distinc ...

  3. sql语句中的in用法示例_示例中JavaScript in操作符

    sql语句中的in用法示例 One of the first topics you'll come across when learning JavaScript (or any other prog ...

  4. IsNull 和 SQL语句中CASE WHEN用法

    [转]IsNull 和 SQL语句中CASE WHEN用法收藏   [转]IsNull 和 SQL语句中CASE WHEN用法 1.ISNULL     使用指定的替换值替换   NULL.      ...

  5. sql语句中的in用法示例_PHP中的循环语句和示例

    sql语句中的in用法示例 循环 (Loops) Imagine that we need a program that says "hello world" 100 times. ...

  6. 【MySQL】sql语句中exists和in有何区别?

    1.概述 sql语句中exists和in有何区别? SQL语句优化有哪些方法? sq|语句中exists和in有何区别如下: exists是用循环( loop )的方式,由outer表的记录数决定循环 ...

  7. mysql语句中limt_mysql sql语句中的limit用法

    mysql sql语句中的limit用法 1.select * from tablename limit 100,15 从100条记录后开始(不包括第100条记录)取出15条记录 (实际取出的是第 1 ...

  8. sql语句中的limit用法

    sql语句中的limit用法 limit 用于限制查询结果返回. 用法: limit a,b 其中a表示查询数据的起始位置,b表示返回的数量. (MySQL数据库中的记录是从0开始的) 举例: SEL ...

  9. SQL语句中JOIN的用法

    记录:257 写SQL最高境界:SELECT * FROM 表名.当然这是一句自嘲.探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟. 一.场景 把关系型数据库A中表TEST_ ...

最新文章

  1. 15. Python 函数
  2. 时间序列数据的预处理
  3. Android 使用ORMLite 操作数据库
  4. mapreduce编程初级实践_涨姿势!2020最好的 10 大国外编程学习网站
  5. mysql blob key length_mysql – 没有密钥长度的密钥规范中使用的BLOB / TEXT列’bestilling’...
  6. Codeforces 786B Legacy (线段树优化建图)
  7. 用startSmoothScroll实现RecyclerView滚动到指定位置并置顶,含有动画。
  8. android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法](转)
  9. 反向传播算法的详细解释(下)
  10. 一本好书-《精益创业》
  11. TensorFlow发布语音识别入门教程,附1GB数据集代码
  12. 10.24 cv方向3DMM必备环境——Windows10/11下pytorch3d[完美安装版]
  13. ltspice滑动变阻器在哪_NB物理创新课堂|变阻器
  14. dvwa安装教程(LNMP一套Linux+Nginx+MariaDB+PHP)
  15. PAT Deepest Root
  16. 一套成熟的BPM系统应该有的功能
  17. 计算个人所得税(老版)
  18. 安卓 OpenGLES 魔方
  19. 《Python数学之美》第一节、一切还是要从函数说起
  20. 2023年,“新一代”固定资产管理平台——支持低代码平台

热门文章

  1. 如何利用笔记本自带读卡器放入存储卡+ReadyBoost加快笔记本电脑的速度
  2. 用HL2模拟多米诺骨牌效应(视频)
  3. mysql反引号作用
  4. WPF 控件专题 Lable 控件详解
  5. gnome2 卷起_GNOME 2 粉丝喜欢 Mate Linux 桌面的什么?
  6. HTML5 article元素的使用
  7. 2022最全的软件测试面试题及答案,不给答案的面试题都是耍流氓
  8. 论文理解【RL - Episodic Control】 ——【MFEC】Model Free Episodic Control
  9. ValidateRequest=quot;falsequot; 无效
  10. 阿里云盘-网页版登录地址