【例 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。