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. Beta冲刺 (1/7)
  2. 动态SLAM:关于语义分割时间效率的讨论
  3. Java的二十三种设计模式(建造者模式(Builder))
  4. oracle 次月,Oracle日期查询:季度、月份、星期等时间信息
  5. linux-U盘的识别-卸载-挂载操作
  6. apm飞控制作_传统直接转矩控制
  7. 1777亿重罚,苹果瑟瑟发抖!
  8. linux php错误日志在哪里,宝塔的php错误日志在哪
  9. 输入某年某月某日,Java判断这一天是这一年的第几天?
  10. DataGridView添加右键菜单等技巧
  11. 哨兵2号L1C数据下载及预处理
  12. srs流媒体服务器拉流的流程
  13. 表白墙微信小程序源码
  14. (已解决)win10重装后无法开启双显示屏
  15. 火影忍者“背后的故事”
  16. 2020寒假【gmoj2417】【Loan Repayment】【二分】
  17. 笔试题之——栈问题(列车车厢编组问题)
  18. 手机进水开机android,手机进水后开机只有启动画面进不了桌面怎么处理?
  19. 发现细分赛道:费控SaaS跨越资本寒冬
  20. 量子计算机相干性,量子计算机面世不遥远,量子计算机面世不遥远 量子 计算机 相干性 固态 动力学 - 滚动新闻 - 温州网...

热门文章

  1. 如何用python爬视频_使用Python爬取视频
  2. Java-POI替换Word模板文档中的变量,生成Word文档
  3. 超文本传输协议 -- HTTP/1.1(二)
  4. 创客教育实验室的作用
  5. 使用代理连接外网服务器
  6. Attention的汇总与辨析_Additive、Multiplication、Scaled dot-product、Self Attention、Multi-head Self-Attention
  7. 单点登录和第三方登录
  8. kernel logo到开机卡通片之间闪现黑屏(android 5.X)
  9. 计算器界面网格布局java,安卓案例:网格布局实现计算器界面
  10. 蓝牙beacon打造智慧停车场