SQL进阶--EXISTS谓词的用法
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谓词的用法相关推荐
- SQL进阶之EXISTS谓词的用法
SQL进阶之EXISTS谓词的用法 EXISTS谓词的用法 越前须知(雾) 概述 具体用法 查询表中"不存在的数据" 全称量化:肯定 <=> 双重否定 对行.列进行量化 ...
- SQL进阶之自连接的用法
SQL进阶之自连接的用法 自连接 越前须知(雾) 具体用法 可重排列.排列.组合 查询局部不一致的记录 排序 不分组排序 分组排序 自连接 越前须知(雾) 本系列参考<SQL进阶教程>1, ...
- SQL进阶教程——EXISTS谓词的用法(第八章)
1. 前言 支撑SQL和关系数据库的基础理论主要有两个:一个是数学领域的集合论:另一个是作为现代逻辑学标准体系的谓词逻辑.本节将重点介绍EXISTS谓词,EXISTS不仅可以将多行数据作为整体来表达高 ...
- SQL进阶-exists函数
exists函数使用问题 exists 和not exists使用过程中,出现exists为A表的全部值(not exists 出现的是空值) 举例如下: SELECT a1.* FROM a a1 ...
- SQL中exists关键字的用法
exists用于检查一个子查询是否至少会返回一行数据(即检测行的存在),返回值为true或false. 语法: exists subquery 参数: subquery ...
- SQL进阶教程——自连接的用法(第二章)
1. 什么是自连接 针对相同的表进行的连接被称为"自连接",一旦熟练掌握自连接技术,我们便能快速的解决很多问题.但是,其处理过程不太容易想象,以至于常常被人们敬而远之. 理解自连接 ...
- 你真的了解SQL中的EXISTS谓词吗?
EXISTS 谓词的用法 支撑 SQL 和关系数据库的基础理论主要有两个:一个是数学领域的集合论,另一个是作为现代逻辑学标准体系的谓词逻辑(predicate logic),准确地说是"一阶 ...
- 【SQL进阶MICK读书笔记】
此篇文章,主要总结中级阶段的SQL高级用法,通过普通的技术不同侧面的阐述,让技术渣渣的我感受到了SQL牛逼的一面(呜呜呜~~) 一.CASE表达式 1.CASE 表达式又称条件分支,case类似于1 ...
- SQL进阶随笔--case用法(一)
SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...
最新文章
- 图解 HTTP 笔记(四)——HTTP 状态码
- #1413 : Rikka with String 后缀自动机 + 二级差分
- go语言接收html上传的文件,html5原生js拖拽上传(golang版)
- Zabbix3.0 安装Graphtree
- 【渝粤教育】国家开放大学2018年秋季 0551-22T素描(二) 参考试题
- Power BI连接MySQL 提示错误......未能加载文件或程序集......或它的某一个依赖项
- highlight.js 语法高亮,让你的页面更美观~
- 在系统启动时至少有一个服务或驱动程序产生错误_Cassandra Java驱动程序
- Arcgis Licensemanager 不能启动的原因之一(转载)
- IE8的样式兼容性适应方法【转】
- SSH三大框架的整合(实例)
- java 仿百度文库源码_Java模拟实现百度文档在线浏览
- 如何调用WebService
- 服务器上系统使用排行,服务器操作系统使用排行榜
- i7 9750h和r7 5800h差距大不大
- easyrp-java_EasyPR-Java
- 同期收治患者住院天数_速看!二级公立中医医院绩效考核指标发布(附34个指标)...
- CentOS7安装K8S V1.23.3
- 清云小程序教程十五:主轴与交叉轴一
- 虚拟机+Ubuntu18.04+ORB_SLAM3+ROS环境配置(配置环境的过程以及途中出现的错误,解决方法)