选读SQL经典实例笔记19_Any和All
1.选读SQL经典实例笔记23_读后总结与感想兼导读2.选读SQL经典实例笔记01_检索和排序3.选读SQL经典实例笔记02_多表查询4.选读SQL经典实例笔记03_DML和元数据5.选读SQL经典实例笔记04_日期运算(上)6.选读SQL经典实例笔记05_日期运算(下)7.选读SQL经典实例笔记06_日期处理(上)8.选读SQL经典实例笔记07_日期处理(下)9.选读SQL经典实例笔记08_区间查询10.选读SQL经典实例笔记09_数值处理11.选读SQL经典实例笔记10_高级查询12.选读SQL经典实例笔记11_结果集变换13.选读SQL经典实例笔记12_桶、图和小计14.选读SQL经典实例笔记13_case与聚合15.选读SQL经典实例笔记14_层次查询16.选读SQL经典实例笔记15_窗口函数17.选读SQL经典实例笔记16_逻辑否定18.选读SQL经典实例笔记17_最多和最少19.选读SQL经典实例笔记18_Exactly
20.选读SQL经典实例笔记19_Any和All
21.选读SQL经典实例笔记20_Oracle语法示例22.选读SQL经典实例笔记21_字符串处理23.选读SQL经典实例笔记22_2版增补1. Any
1.1. 任意一个
1.2. 选修了任意一门课程的学生
1.2.1. 找出选修了至少一门课程的学生
1.3. 比任何火车都快的飞机
1.3.1. 找出比所有火车都快的飞机
2. All
2.1. 全部
2.2. 吃所有蔬菜的人
2.2.1. 没有任何一种蔬菜他们不吃
3. 问题12
3.1. 选修了全部课程的学生
3.2. sql
select *
from student
where sno not in
( select s.sno
from student s, courses c
where (s.sno,c.cno) not in (select sno,cno from take) )
3.3. 针对每一个学生,找出他们没有选过的课程,最后如果有谁不在其中,则他必定选修了全部课程
3.3.1. 最内层的子查询会返回所有有效的SNO/CNO组合
3.3.2. 中间一层的子查询使用STUDENT表和COURSES表之间的笛卡儿积,返回(假设每一个学生都选修了全部课程)所有可能的SNO/CNO组合,进而过滤掉有效的SNO/CNO组合(只留下了实际上不存在的SNO/CNO组合)
3.3.3. 最外层的查询,只有当SNO不存在于中间一层子查询结果时,才会被保留下来
3.4. DB2
3.5. SQL Server
3.6. 窗口函数COUNT OVER,并使用外连接而不是子查询
3.6.1. sql
select sno,sname,age
from (
select s.sno,s.sname,s.age,
count(t.cno)
over (partition by s.sno) as cnt,
count(distinct c.title) over() as total,
row_number() over
(partition by s.sno order by c.cno) as rn
from courses c
left join take t on (c.cno = t.cno)
left join student s on (t.sno = s.sno)
) x
where cnt = total
and rn = 1
3.7. Oracle
3.7.1. sql
select sno,sname,age
from (
select s.sno,s.sname,s.age,
count(t.cno)
over (partition by s.sno) as cnt,
count(distinct c.title) over() as total,
row_number() over
(partition by s.sno order by c.cno) as rn
from courses c, take t, student s
where c.cno = t.cno (+)
and t.sno = s.sno (+)
)
where cnt = total
and rn = 1
3.8. 外连接到COURSES表,而不是子查询
3.9. PostgreSQL
3.10. MySQL
3.11. 聚合函数COUNT找出选修所有课程的学生
3.11.1. sql
select s.sno,s.sname,s.age
from student s, take t
where s.sno = t.sno
group by s.sno,s.sname,s.age
having count(t.cno) = (select count(*) from courses)
3.11.2. 使用子查询返回课程总数
3.11.3. 外层查询负责筛选出选修课程数量等于子查询返回值的学生
4. 问题13
4.1. 比任何其他学生年龄都大的学生
4.2. sql
select *
from student
where age not in (select a.age
from student a, student b
where a.age < b.age)
4.3. 子查询使用笛卡儿积找出A表中年龄小于B表的学生的年龄值
4.4. 唯一不会比其他年龄值小的就是最大年龄值
4.5. 外层查询使用NOT IN,从STUDENT表中筛选出所有AGE不存在于上述子查询返回结果集的行
4.6. DB2
4.7. Oracle
4.8. SQL Server
4.9. 窗口函数MAX OVER找出年龄最大的学生
4.9.1. sql
select sno,sname,age
from (
select s.*,
max(s.age)over() as oldest
from student s
) x
where age = oldest
4.10. PostgreSQL
4.11. MySQL
4.12. 聚合函数MAX找出年龄最大的学生
4.12.1. sql
select *
from student
where age = (select max(age) from student)
合集:
选读SQL经典实例
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 我与微信审核的“相爱相杀”看个人小程序副业