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

news2024/12/23 20:21:46

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语句:

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);

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

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);

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

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);

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

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);

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

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);

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

三、在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);

执行结果:
在这里插入图片描述
结论:在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后面紧跟着的是需求中需要删除的表名的别名。

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

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:
在这里插入图片描述
执行前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 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);

执行结果:
在这里插入图片描述
结论:在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 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:
在这里插入图片描述
执行前TEST_TB02:
在这里插入图片描述
执行后TEST_TB01:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/636192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter非gui运行,jtl生成了,但是html报告没有生成

jmeter非gui运行,jtl生成了,但是html报告没有生成,查看log,内容如下: 22:45:00,913 ERROR o.a.j.JMeter: Error generating dashboard: org.apache.jmeter.report.dashboard.GenerationException: Error while proces…

谷歌的passkey是什么?

谷歌的passkey是什么? 谷歌正在研发一种名为“Passkey”的新技术,它将用于用户身份验证。Passkey不同于传统的密码,它采用了硬件加密密钥(如安全密钥或生物识别方式)以及双因素身份验证等技术,可以更好地保…

微信:把元宇宙装进小程序

作为月活13.09亿的国民级应用,微信的每次小升级都很容易形成现象级。2023开年,微信放大招,试图把元宇宙装进小程序。 微信小程序 XR-FRAME 不久前,微信官方在开放社区贴出了“XR-FRAME”开发指南,这是一套为小程序定制…

RocketMQ 快速入门教程,手把手教教你干代码

目录 RocketMQ定义为什么要用消息中间件?应用解耦流量削峰数据分发 RocketMQ各部分角色介绍NameServer主机(Broker)生产者(Producer)消费者(Consumer)消息(Message) 使用RocketMQ的核心概念主题(Topic)消息队列(Message Queue)分组(Group)标签(Tag)偏移量(Offset) 普…

企业级信息系统开发讲课笔记4.11 Spring Boot中Spring MVC的整合支持

文章目录 零、学习目标一、Spring MVC 自动配置(一)自动配置概述(二)Spring Boot整合Spring MVC 的自动化配置功能特性 二、Spring MVC 功能拓展实现(一)创建Spring Boot项目 - SpringMvcDemo2021&#xff…

老胡的周刊(第094期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 qrbtf[2] 艺术二维码生成器: qrb…

某学院校园网站的设计与实现(论文+源码)_kaic

摘 要 使用旧方法对冀中工程技师学院网站的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在冀中工程技师学院网站的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次…

ajax--XML、AJAX简介、express框架使用、AJAX操作的基本步骤

一、XML(可扩展标记语言) XML与HTML类似,不同的是HTML中都是预定义标签,而XML中没有预定义标签,全都是自定义标签,用来表示一些数据。 比如有一个学生数据:name“孙悟空”;age18;gender“男”&a…

数字图像处理期末复习习题 SCUEC part3 形态学图像处理专项

1.关于膨胀,腐蚀,开操作,闭操作的证明题 2.腐蚀和膨胀的定义 3.开操作与闭操作的定义 4.击中击不中变换

ubuntu驱动重装

卸载 进入命令行模式 sudo NVIDIA-Linux-x86_64-495.46.run --uninstall安装 进入命令行模式 sudo ./NVIDIA-Linux-x86_64-460.67.run –no-opengl-files –no-x-check –no-nouveau-check选continue installation。 ② 选 NO。 选NO。

源氏木语获得多少个奖项?答案 2023年天猫618淘宝大赢家今日答案与618天猫超级红包怎么领取?

2023年6月12日天猫618淘宝大赢家今日答案 问题:源氏木语获得多少个奖项? 答案:15 2023年淘宝天猫618超级红包怎么领取? 从2023年5月29日开始持续到6月20日,每天都可以打开手机淘宝或天猫,在首页搜索框内…

Open Inventor 2023.1.1 Crack 2022-06-08

Open Inventor 是一组高性能的三维软件开发包(SDK),用于医学、计算机辅助设计与工程、石油、天然气和采矿业这些领域中的专业应用。 其面向对象的应用程序编程接口、可拓展架构以及一整套先进庞大的组件为软件开发者提供一个完美的高级平台&…

教育系统和功能设计

慧享教育系统和功能设计 要求: 1. 在需求分析的基础上,确定项目详细功能; 2. 确定每个功能模块的子功能及详细内容并描述; 3. 完成事务设计和应用设计。 操作步骤: 1.系统结构设计及子系统划分 划分系…

基于html+css的图展示123

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【软考程序员学习笔记】——计算机组成与体系结构

目录 🍊一、进制之间的转换 🍊二、原码、反码、补码和移码 原码 反码 补码 移码 🍊三、浮点数表示法 (1)浮点数表示 (2)两浮点数进行运算的过程 🍊四、校验码 &#xff08…

Spring Boot + Vue3前后端分离实战wiki知识库系统八--分类管理功能开发二

接着上一次https://www.cnblogs.com/webor2006/p/17291405.html的分类功能继续完善。 分类编辑功能优化: 概述: 现在分类编辑时的界面长这样: 很明显目前的父分类的展现形式不太人性,这里需要指定父分类的id才可以,对于…

规范即治理函数:LLM 赋能的软件架构治理与架构设计

在我们设计架构治理平台 ArchGuard 2.0 的架构时,一直在强调的点是:基于规范 模式的工具化。简单来说,规范是架构设计的共时,也是架构知识的显性化。所以,在让 AI 设计架构时,规范是我们要考虑的第一要素&…

0 基础学脚本:给同事做一个排班表并每日通知「02」

Hello 小伙伴们早上、中午、下午、晚上、深夜好! 我是爱折腾的 jsliang~ 本系列文章和配套直播视频,面向金山文档的「轻维表」「表单」用户。 希望通过【自动化】和【脚本】等能力,让里面数据相互流转起来,从而提升工作效率。 序 …

企业级信息系统开发讲课笔记4.10 配置国际化页面

文章目录 零、学习目标一、使用Thymeleaf配置国际化页面(一)创建Spring Boot项目 - ThymeleafI18N(二)编写多语言国际化配置文件1、在resources下创建i18n目录2、在i18n目录里创建login.properties3、在i18n目录里创建login_zh_CN…

Prompt 用法大全!让 ChatGPT 更智能的六种策略(下)

上两篇介绍了 Pormpt 用法大全中前四种策略,本篇继续讲解后两种策略。‍‍‍‍‍ 点燃创作灵感:Prompt 实践指南揭秘!让 ChatGPT 更智能的六种策略(上) Prompt 用法大全!让 ChatGPT 更智能的六种策略&#…