exists关键字介绍

exists强调的是 是否返回结果集,不要求知道返回什么,比如:

SELECT * FROM AM_USER WHERE EXISTS (SELECT 1 FROM AM_ROLE WHERE NAME = 'admin')

只要exists引导的子句有结果集返回,那么exist的条件就成立。SELECT 1 FROM AM_ROLE 返回的数字没有意义,exists子句不在乎返回什么,而是在乎有没有结果返回。

而exists与in最大的区别在于in引导的子句只能返回一个字段,比如:

SELECT * FROM AM_USER WHERE USERNAME IN (SELECT 1,2,3 from AM_ROLE WHERE NAME = 'admin') 

in子句返回了三个字段,这是不正确的,但exists允许。而in只允许有一个字段返回,在1,2,3中随意取出两个即可。

而not exists和not in分别是exists和in的对立面

exists返回结果集为真
not exists 不返回结果集为真

举个例子,现在有两个表

表A

ID NAME
1 A1
2 A2
3 A3

表B

ID AID NAME
1 1 B1
2 2 B2
3 2 B3

表A和表B是一对多的关系A.ID => B.AID

执行语句

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)

执行结果为

ID NAME
1 A1
2 A2

原因如下分析

原因可以按照如下分析

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
--->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据

如果是not exists则反过来

SELECT ID,NAME FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.ID=B.AID)

执行结果为

ID NAME
3 A3

有时候会遇到要选出某一列不重复,某一列作为选择条件的情况,比如表food:

ID NAME CLASS DATE
1 苹果 水果 2020-10-14
1 橘子 水果 2020-10-15
1 香蕉 水果 2020-10-16
2 白菜 蔬菜 2020-10-14
2 青菜 蔬菜 2020-10-15

如果想要得到如下结果:(ID唯一,DATE选最近的一次)

ID NAME CLASS DATE
1 香蕉 水果 2020-10-16
2 青菜 蔬菜 2020-10-15

这里不能使用distinct,因为如下使用sql语句,会作用于所有字段,会查出来所有数据

SELECT DISTINCT ID, NAME, CLASS, DATE FROM food

正确的sql语句是:

SELECT
ID,NAME,CLASS,DATE
FROM
food f
WHERE
NOT EXISTS ( SELECT ID, NAME, CLASS, DATE FROM food WHERE ID = f.ID AND DATE > f.DATE )

sql中exists用法的更多相关文章

  1. sql 中 exists用法

    SQL中EXISTS的用法   比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(S ...

  2. SQL中EXISTS和IN用法

    SQL中EXISTS的用法  指定一个子查询,检测行的存在. 语法:EXISTS subquery 参数:subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INT ...

  3. sql中exists和not exists的用法

    该文转载自:http://www.cnblogs.com/mytechblog/articles/2105785.html sql中exists,not exists的用法 exists : 强调的是 ...

  4. 十、SQL中EXISTS的用法 十三、sql server not exists

    十.SQL中EXISTS的用法 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False EXISTS 指定一个子查询,检测 行 的存在. 语法 ...

  5. sql语句exists 用法

    参考:SQL语句exists用法,Sql语句中IN和exists的区别及应用 现在有三张表 学生表S: sno ,sname 课程表C:cno ,cname 学生选课表SC: sno ,cno 查询选 ...

  6. SQL中EXISTS怎么用[转]

    SQL中EXISTS怎么用 1 2 3 4 分步阅读 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 方法/步骤 1 EXISTS用于 ...

  7. SQL 中ROLLUP 用法

    SQL 中ROLLUP 用法 ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集. 下面是 CUBE 和 ROLLUP 之间的具体区别: CUBE 生成的结果集显示了所选列中值的所有 ...

  8. sql中exists和notexists用法总结(并和in的比较)

    首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如 ...

  9. SQL语句exists用法

    首先头脑中有三点概念: 1 .  EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2 . 建立程序循环的概念,这是一个动态的查 ...

  10. Sql 中Collate用法

    今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法. collate在sql中是用来定义排序规则的.排序规则其实就是当比较两个 ...

随机推荐

  1. 【Frida】启动手机上的Frida插件

    运行以下命令可以保证Frida一直在手机上运行,不关机,Frida就不关 adb shell su -c "./data/local/frida-server-15.2.2-android- ...

  2. CTF学习笔记(三)php部分

    三.常见PHP用法与漏洞 (〇)php的备份文件与phps php的备份文件一般是*.php.bak,在根目录下输入/index.php.bak, 下载 备份文件. phps文件就是php的源代码文件 ...

  3. springboot上传图片

    springboot上传图片 新建一个springboot项目: 在java/main/com/ljx 创建一个controller.fileController类 内容如下: package com ...

  4. vue重置data数据为初始状态

    vue中: this.$data 获取当前状态下的data this.$options.data() 获取该组件初始状态下的data 所以,下面就可以将初始状态的data复制到当前状态的data,实现 ...

  5. 网络协议及osi模型

    osi模型:由高到底 应用层:最高一层,是用户与网络的接口 表示层: 会话层: 传输层:作用是为上层协议提供端到端的可靠和透明的数据传输服务 网络层: 数据链路层: 物理层:它利用传输介质为数据链路层 ...

  6. vue项目埋点实践,使用img发送埋点数据

    埋点数据种类:1.按钮点击2.页面切换(具体数据内容根据实际需求再定义)埋点数据交互:采用img的默认下载功能,发送get请求,带上埋点数据(此处后期需要加上加密)发送频率:1.固定时间2.固定数据量 ...

  7. Linux中 cat查询文件指定内容-并输入到指定文件内

    常用: ① cat xxx.log | grep -C 20 "查询关键字" ② grep -E '1805|1905' CloudPayment.log > out.log ...

  8. js之new的原理和源码

    new的原理即作用: function Student(name,age){ this.name=name; this.age=age; } var stu=new Student("小明& ...

  9. 【EBS】总账YTD\PTD等概念

    PTD 余额是指给定期间账户中的净活动.周期通常等于一个月. YTD 余额是指账户从时间开始到给定期间结束的净活动. 例如 假设您在 1 月 15 日声明了一项业务.您在 1 月 15 日从现金账户中 ...

  10. ubuntu20.04系统中扩展swap分区

    1.首先停止/swapfile #swapon /swapfile 2.删除以前的/swapfile #rm -rf swapfile 3.创建新的/swapfile(以2G为例) #dd if=/d ...