数据库作业8:SQL练习5 - SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)

本文通过一系列实例介绍了SQL中的嵌套查询(EXISTS, NOT EXISTS)和集合查询(UNION, INTERSECT, EXCEPT),包括查询选修特定课程的学生、选修所有课程的学生、不同集合的交集与差集等操作,同时探讨了WHERE子句、GROUP BY子句和HAVING子句的使用场景和区别。" 113517851,10296969,Python调用WMS与WMTS服务示例,"['GIS开发', 'Python编程', '地图可视化', 'Web服务', '数据集成']
摘要由CSDN通过智能技术生成

【例 3.60】查询所有选修了1号课程的学生姓名
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno=‘1’);
先从Student中取一个Sno,若在SC中并且Cno=1,则取该元组的Sname送入结果表
【例 3.61]】查询没有选修1号课程的学生姓名
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno=‘1’);
将上例EXISTS换成NOT EXISTS即可
【例 3.62】查询选修了全部课程的学生姓名

SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno
)
);
指的是没有一门课程他不选修
【例 3.63】查询至少选修了学生201215122选修的全部课程的学生号码
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno = ‘201215122’ AND
NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno)
);
思路:查询学号为x的学生,对所有的课程y,只要201215122学生选修了课程y,则x也选修了y。**
【3.64】 查询计算机科学系的学生及年龄不大于19岁的学生****
SELECT *
FROM Student
WHERE Sdept= ‘CS’
UNION
SELECT *
FROM Student
WHERE Sage<=19;

【例 3.65]】查询选修了课程1或者选修了课程2的学生
SELECT Sno
FROM SC
WHERE Cno=‘1’
UNION
SELECT Sno
FROM SC
WHERE Cno= ‘2’;

【例3.66】查询计算机科学系的学生与年龄不大于19岁的学生的交集
查询计算机科学系中年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept=‘CS’
INTERSECT
SELECT * FROM Student WHERE Sage<=19
按连接查询:
SELECT *
FROM Student
WHERE Sdept='CS’AND Sage<=19;
【例 3.67】查询既选修了课程1又选修了课程2的学生
SELECT Sno FROM SC WHERE Cno=‘1’
INTERSECT
SELECT Sno FROM SC WHERE Cno=‘2’;
按嵌套查询:
SELECT Sno
FROM SC
WHERE Cno=‘1’ AND Sno IN
(SELECT Sno
FROM SC
WHERE Cno=‘2’);
【例 3.68】 查询计算机科学系的学生与年龄不大于19岁的学生的差集
SELECT *
FROM Student
WHERE Sdept=‘CS’
EXCEPT
SELECT *
FROM Student WHERE Sage <=19;
只要求计算机科学系中大于19岁的学生就好
【例3.57】找出每个学生超过他自己选修课程平均成绩的课程号
改写后:
SELECT Sno,Cno
FROM SC,(SELECT Sno, Avg(Grade)
FROM SC
GROUP BY Sno)
AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno
AND SC.Grade >=Avg_sc.avg_grade
【例3.60】查询所有选修了1号课程的学生姓名,可以用如下查询完成:
改写后
SELECT Sname
FROM Student,(SELECT Sno FROM SC WHERE Cno=‘1’)AS SC1
WHERE Student.Sno=SC1.Sno;

SELECT 总结:

DISTINCT:消除取值重复的行。如果没有指定DISTINCT关键词,则缺省为ALL。
目标列表达式:指定要显示的属性列。查询全部列(*)。可以是算术表达式、字符串常量、函数等。
FROM子句:指定查询对象。
基于派生表的查询AS
WHERE子句:指定查询条件。逻辑运算符AND和 OR连接多个查询条件。比较大小、确定范围 (BETWEEN AND)、确定集合 IN ()、 字符匹配([NOT] LIKE)。
连接查询:WHERE子句中用来连接两个表的条件,格式:[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>。自身连接FROM必须使用“别名”。
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:只有满足指定条件的组才予以输出。
聚集函数只能用于SELECT子句和GROUP BY子句中的HAVING子句。如果未对查询结果分组,聚集函数将作用于整个查询结果。对查询结果分组后,聚集函数将分别作用于每个组 。按指定的一列或多列值分组,值相等的为一组。
HAVING短语与WHERE子句的区别:作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组;
HAVING短语作用于组,从中选择满足条件的组。
嵌套查询:将查询块嵌套在WHERE子句或HAVING短语的条件中。(带IN谓词、带比较运算符、带有ANY或ALL谓词的子查询)
ORDER BY子句:只对最终查询结果按一个或多个属性列排序。缺省值为升序ASC;降序DESC。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值