SQL EXISTS谓词

embedded/2024/11/14 2:13:33/

 谓词时返回值为真值(true、false或unknown)的函数。EXISTS与其他谓词不同,它接受的参数是行的集合。

输入值为一行的谓词叫做“一阶谓词”(例如>、<、= 及 LIKE等);输入值为行的集合的谓词叫做“二阶谓词”(例如EXISTS);输入值为集合的集合的谓词叫做“三阶谓词”。SQL并不会出现三阶以上的情况。

1 实践

1.1 查找表中“不”存在的数据

图 参会信息t_meeting_records 表

需求:查找出每次会议中没有参与的人。

SELECT DISTINCT m1.meeting,m2.person
FROM t_meeting_records m1 CROSS JOIN t_meeting_records m2
WHERE NOT EXISTS
(SELECT *FROM t_meeting_records WHERE meeting = m1.meeting AND person = m2.person
)

1.1.1 SQL 的集合运算

执行SQL的集合运算,需要满足下面的条件:

  1. 所有查询中的列数和列的顺序必须相同。
  2. 两个查询结果集中对应的列数据类型可以不同,但必须兼容。
  3. 两个查询结果集中的列不能包含不可比较的数据类型(例如text、blog等)。
  4. 返回的结果集的列名与操作符左侧的查询相同,ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名。
  5. 不能与COMPUTE 和COMPUTE BY子句一起使用。
  6. 通过比较行来确定非重复值时,两个NULL值被视为相等。

EXCEPT

获取在左侧的集合存在,但是不存在于右侧集合中的数据。

会去重。

INTERSECT

交集,会去重。

UNION

并集,UNION会去重,UNION ALL 不会去重。

表 SQL 的集合运算

SELECT  m1.meeting,m2.person
FROM t_meeting_records m1 CROSS JOIN t_meeting_records m2
EXCEPT 
SELECT meeting,person
FROM t_meeting_records 

1.2 肯定与双重否定转换

图 学生成绩信息t_student_grade 表

需求:查询出科目分数都在50分以上的学生。

SELECT *
FROM t_student_grade g1 
WHERE NOT EXISTS 
(SELECT *FROM t_student_grade g2 WHERE g2.student_id = g1.student_id AND g2.score < 50
)

需求:查处满足下列条件的学生,1)数学分数在80分以上。2)语文分数在50分以上。

SELECT student_id
FROM t_student_grade g1 
WHERE g1.`subject` IN ("数学","语文") AND NOT EXISTS 
(SELECT *FROM t_student_grade g2WHERE g2.student_id = g1.student_id AND 1 = CASE WHEN g2.`subject` = '数学' AND g2.score < 80 THEN 1WHEN g2.`subject` = '语文' AND g2.score < 50 THEN 1 ELSE 0 END 
)
GROUP BY g1.student_id
HAVING COUNT(*) = 2

1.3 EXISTS 与 HAVING

图 工程进展记录信息t_project_info 表

需求:查询哪些项目已经完成到了工程1。

SELECT *
FROM t_project_info p1 
WHERE NOT EXISTS 
(SELECT *FROM t_project_info p2 WHERE p2.project_id = p1.project_id AND p2.status != CASE WHEN p2.step_number = 0 THEN '完成'WHEN p2.step_number = 1 THEN '完成'ELSE '等待' END 
)
-- HAVING
SELECT project_id
FROM t_project_info 
GROUP BY project_id
HAVING COUNT(*) = SUM(CASE WHEN step_number <= 1 AND `status` = '完成'	THEN 1WHEN step_number > 1 AND `status` = '等待' THEN 1ELSE 0 END 		 
)

ESISTS 代码看起来不那么容易理解,但是性能好,而且结果包含的信息量更大。

2 练习

2.1 行结构

图 行结构表t_key_val

需求:查出value 全为1的key。

SELECT *
FROM t_key_val k1 
WHERE NOT EXISTS(SELECT * FROM t_key_val k2 WHERE k2.`key` = k1.`key`AND (k2.value != 1 OR k2.`value` IS NULL)
);
-- HAVING
SELECT `key`
FROM t_key_val 
GROUP BY `key`
HAVING 
COUNT(*) = SUM(CASE WHEN `value` = 1 THEN 1 ELSE 0 END 
);
-- ALL
SELECT DISTINCT `key`
FROM t_key_val k1
WHERE 
1 = ALL (SELECT `value` FROM t_key_val k2 WHERE k2.`key` = k1.`key`
)

2.2 全称量化 ALL

需求:用ALL 完成1.3的需求。

需求:用ALL 完成1.3的需求。
-- ALL
SELECT * 
FROM t_project_info p1
WHERE 1= ALL (SELECT CASE WHEN p2.step_number <= 1 AND p2.`status` = '完成' THEN 1WHEN p2.step_number > 1 AND p2.`status` = '等待' THEN 1ELSE 0 ENDFROM t_project_info p2 WHERE p2.project_id = p1.project_id
)

2.3 求质数

图 数字集t_number 表

SELECT *
FROM t_number n1
WHERE num > 1
AND NOT EXISTS (SELECT *FROM t_number n2WHERE n2.num <= (n1.num / 2) AND n2.num > 1 AND MOD(n1.num,n2.num) = 0
)

http://www.ppmy.cn/embedded/136880.html

相关文章

【Android】轮播图——Banner

引言 Banner轮播图是一种在网页和移动应用界面设计中常见的元素&#xff0c;主要用于在一个固定的区域内自动或手动切换一系列图片&#xff0c;以展示不同的内容或信息。这个控件在软件当中经常看到&#xff0c;商品促销、热门歌单、头像新闻等等。它不同于ViewPgaer在于无需手…

Python学习------第四天

Python的判断语句 一、布尔类型和比较运算符 二、 if语句的基本格式 if语句注意空格缩进&#xff01;&#xff01;&#xff01; if else python判断语句的嵌套用法&#xff1a;

【系统架构设计师】高分论文:论企业应用系统的分层架构风格

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 摘要正文摘要 2021 年 12 月,本人所在的公司承担了 “某国际贸易综合服务及经济案事件预警平台”(下文简称 “预答平台”)的升级改造工作。我担任本项目的系统架构师,负责该预答平台开发的管理、规划、设计工作…

使用 Flutter 绘制一个棋盘

在这篇博客中&#xff0c;我们将使用 Flutter 的 CustomPainter 来绘制一个简单的棋盘。我们将实现一个 8x8 的棋盘&#xff0c;每个方格的大小和颜色都能根据需求进行自定义。除了代码部分&#xff0c;我们还会详细解释每个步骤和背后的设计理念。 1. 创建 Flutter 项目 首先…

Redis生产问题(缓存穿透、击穿、雪崩)——针对实习面试

目录 Redis生产问题什么是缓存穿透&#xff1f;如何解决缓存穿透&#xff1f;什么是缓存击穿&#xff1f;如何解决缓存击穿&#xff1f;缓存穿透和缓存击穿有什么区别&#xff1f;什么是缓存雪崩&#xff1f;如何解决缓存雪崩&#xff1f; Redis生产问题 什么是缓存穿透&#x…

关系数据的可视化——Python大数据可视化

一、实验名称 关系数据的可视化 二、实验目的 1.掌握关系数据在大数据中的应用 2.掌握关系数据可视化方法 3. python程序实现图表 三、实验原理 在传统的观念里面,一般都是致力于寻找一切事情发生的背后的原因。现在要做的是尝试着探索事物的相关关系,而不再关注难以捉摸的…

十四:java web(6)-- Spring Spring MVC

目录 Spring MVC 1.1 Spring MVC 概述 1.1.1 什么是 MVC 模式 1.1.2 Spring MVC 工作原理 1.2 Spring MVC 核心组件 1.2.1 DispatcherServlet 1.2.2 控制器&#xff08;Controller&#xff09; 1.2.3 请求映射&#xff08;RequestMapping&#xff09; 1.2.4 视图解析器…

计算用户订购率梧桐数据库和oracle数据库sql分析

一、背景说明 移动运营商平台提供多种类型的产品权益&#xff0c;用户可以通过订购来使用。平台需要定期统计各个产品的用户订购情况&#xff0c;以便了解各个产品的受欢迎程度。这些统计数据将用于优化产品、提升用户体验和制定市场推广策略。 二、表结构说明 梧桐数据库建…