SQL谓词指的是返回真值的函数
EXISTS与其他谓词不同,接受的参数是集合
因此EXISTS可以看出一种高阶的函数
SQL中没有与全称量词相当的谓词,可以使用not exists代替

1、存在量化

-- 建表
create table meetings(meeting varchar(10),person  varchar(10)
);
insert into meetings values ('第一次', '伊藤');
insert into meetings values ('第一次', '水岛');
insert into meetings values ('第一次', '坂东');
insert into meetings values ('第二次', '伊藤');
insert into meetings values ('第二次', '宫田');
insert into meetings values ('第三次', '坂东');
insert into meetings values ('第三次', '水岛');
insert into meetings values ('第三次', '宫田');

求缺席者

-- 存在量化的应用
select DISTINCT m1.meeting, m2.personfrom meetings m1 cross join meetings m2 where not EXISTS   (select *from meetings m3 where m1.meeting = m3.meetingand m2.person = m3.person)
;-- 使用差集运算
select m1.meeting , m2.personfrom meetings m1,meetings m2
minus
select meeting, personfrom meetings
;

结果(oracle)

MEETING    PERSON
---------- ----------
第二次     水岛
第二次     坂东
第三次     伊藤
第一次     宫田

2、全称量化

用双重否定

-- 创表
create table testscores(student_id INTEGER,subject1    varchar(10),score       INTEGER
);
insert into testscores values(100, '数学', 100);
insert into testscores values(100, '语文', 80);
insert into testscores values(100, '理化', 80);
insert into testscores values(200, '数学', 80);
insert into testscores values(200, '语文', 95);
insert into testscores values(300, '数学', 40);
insert into testscores values(300, '语文', 90);
insert into testscores values(300, '社会', 55);
insert into testscores values(400, '数学', 80);

数学分数在80分以上及语文分数在50分以上的学生

select distinct a.student_idfrom testscores a where a.subject1 in ('数学', '语文')and not EXISTS(select * from testscores bwhere b.student_id = a.student_idand 1 = case when b.subject1 = '数学' and b.score < 80 then 1when b.subject1 = '语文' and b.score < 50 then 1else 0 end )group by a.student_id
having count(*) >= 2
;

结果(oracle)

STUDENT_ID
----------
       100
       200

3、集合和谓词比较

-- 创表
drop table projects_1_8;
create table projects_1_8(project_id varchar(10),step_nbr   INTEGER,status1    varchar(10)
)
;insert into projects_1_8 values('AA100', 0, '完成');
insert into projects_1_8 values('AA100', 1, '等待');
insert into projects_1_8 values('AA100', 2, '等待');
insert into projects_1_8 values('B200', 0, '等待');
insert into projects_1_8 values('B200', 1, '等待');
insert into projects_1_8 values('CS300', 0, '完成');
insert into projects_1_8 values('CS300', 1, '完成');
insert into projects_1_8 values('CS300', 2, '等待');
insert into projects_1_8 values('CS300', 3, '等待');
insert into projects_1_8 values('DY400', 0, '完成');
insert into projects_1_8 values('DY400', 1, '完成');
insert into projects_1_8 values('DY400', 2, '完成');

查询完成到了工程1的项目
面向集合的解法

select project_idfrom projects_1_8group by project_id
having count(*) = sum(case when step_nbr <= 1 and status1 = '完成' then 1when step_nbr >= 2 and status1 = '等待' then 1else 0 end)
;

面向集合的解法——结果(oracle)

PROJECT_ID
----------
CS300

谓语逻辑的解法


-- 谓语逻辑的解法 (双重否定)
select * from projects_1_8 Awhere not EXISTS(select status1from projects_1_8 bwhere a.project_id = b.project_id -- 以项目为单位进行条件判断and status1 <> case when step_nbr <= 1 then '完成'else '等待' end)
;

谓语逻辑的解法——结果(oracle)

PROJECT_ID   STEP_NBR STATUS1
---------- ---------- ----------
CS300               3 等待
CS300               2 等待
CS300               1 完成
CS300               0 完成

4、集合和谓词的优缺点

谓词的优点

1、性能好,只要有一行满足条件就停止,不一定需要查询所有行的数据
2、结果中包含的信息量大。如果用having 会被聚合

谓词的缺点

1、使用了双重否定不容易被理解

>

内容多来自 《SQL进阶教材》,仅做笔记。

SQL进阶--EXISTS谓词的用法相关推荐

  1. SQL进阶之EXISTS谓词的用法

    SQL进阶之EXISTS谓词的用法 EXISTS谓词的用法 越前须知(雾) 概述 具体用法 查询表中"不存在的数据" 全称量化:肯定 <=> 双重否定 对行.列进行量化 ...

  2. SQL进阶之自连接的用法

    SQL进阶之自连接的用法 自连接 越前须知(雾) 具体用法 可重排列.排列.组合 查询局部不一致的记录 排序 不分组排序 分组排序 自连接 越前须知(雾) 本系列参考<SQL进阶教程>1, ...

  3. SQL进阶教程——EXISTS谓词的用法(第八章)

    1. 前言 支撑SQL和关系数据库的基础理论主要有两个:一个是数学领域的集合论:另一个是作为现代逻辑学标准体系的谓词逻辑.本节将重点介绍EXISTS谓词,EXISTS不仅可以将多行数据作为整体来表达高 ...

  4. SQL进阶-exists函数

    exists函数使用问题 exists 和not exists使用过程中,出现exists为A表的全部值(not exists 出现的是空值) 举例如下: SELECT a1.* FROM a a1 ...

  5. SQL中exists关键字的用法

    exists用于检查一个子查询是否至少会返回一行数据(即检测行的存在),返回值为true或false.         语法: exists subquery         参数: subquery ...

  6. SQL进阶教程——自连接的用法(第二章)

    1. 什么是自连接 针对相同的表进行的连接被称为"自连接",一旦熟练掌握自连接技术,我们便能快速的解决很多问题.但是,其处理过程不太容易想象,以至于常常被人们敬而远之. 理解自连接 ...

  7. 你真的了解SQL中的EXISTS谓词吗?

    EXISTS 谓词的用法 支撑 SQL 和关系数据库的基础理论主要有两个:一个是数学领域的集合论,另一个是作为现代逻辑学标准体系的谓词逻辑(predicate logic),准确地说是"一阶 ...

  8. 【SQL进阶MICK读书笔记】

    此篇文章,主要总结中级阶段的SQL高级用法,通过普通的技术不同侧面的阐述,让技术渣渣的我感受到了SQL牛逼的一面(呜呜呜~~) 一.CASE表达式 1.CASE  表达式又称条件分支,case类似于1 ...

  9. SQL进阶随笔--case用法(一)

    SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...

最新文章

  1. 图解 HTTP 笔记(四)——HTTP 状态码
  2. #1413 : Rikka with String 后缀自动机 + 二级差分
  3. go语言接收html上传的文件,html5原生js拖拽上传(golang版)
  4. Zabbix3.0 安装Graphtree
  5. 【渝粤教育】国家开放大学2018年秋季 0551-22T素描(二) 参考试题
  6. Power BI连接MySQL 提示错误......未能加载文件或程序集......或它的某一个依赖项
  7. highlight.js 语法高亮,让你的页面更美观~
  8. 在系统启动时至少有一个服务或驱动程序产生错误_Cassandra Java驱动程序
  9. Arcgis Licensemanager 不能启动的原因之一(转载)
  10. IE8的样式兼容性适应方法【转】
  11. SSH三大框架的整合(实例)
  12. java 仿百度文库源码_Java模拟实现百度文档在线浏览
  13. 如何调用WebService
  14. 服务器上系统使用排行,服务器操作系统使用排行榜
  15. i7 9750h和r7 5800h差距大不大
  16. easyrp-java_EasyPR-Java
  17. 同期收治患者住院天数_速看!二级公立中医医院绩效考核指标发布(附34个指标)...
  18. CentOS7安装K8S V1.23.3
  19. 清云小程序教程十五:主轴与交叉轴一
  20. 虚拟机+Ubuntu18.04+ORB_SLAM3+ROS环境配置(配置环境的过程以及途中出现的错误,解决方法)

热门文章

  1. HDFS常用命令hdfs dfs
  2. SAP中输出采购订单和内部订单对应关系清单
  3. 【百度飞桨Paddle】11类食品分类项目
  4. 测量平均值,残差,标准列误差,算术平均测量列误差数据可视化
  5. nats服务器状态未启用,NATS服务器配置的详细介绍
  6. Python-20:解析行政区域Python版
  7. 新的一年总结与展望,分享公众号文章/读者/广告/生活的点点滴滴
  8. 艰难的一年!2020年计算机考研年度总结!
  9. JavaEE复习资料
  10. 圣城家园影视论坛触犯版权网站负责人被警方一锅端