第三种写法(使用存在量词的嵌套查询):
SELECT S#,SNAME
FROM S
WHERE EXISTS(SELECT *
FROM SC
WHERE SC.S#=S.S# AND C#=’C2’)
例:对于教学数据库中四个基本表T、C、S、SC,用SELECT语句表示下面查询。
1)检索学习课程号为C2课程的学生学号与成绩。
SELECT S#,SCORE
FROM SC
WHERE C#=‘C2’
2)检索学习课程号为C2课程的学生学号和姓名。
见上例
3)检索至少选修LIU老师所授课程中一门课程的学生学号与姓名。
SELECT S.S#,SNAME
FROM S,SC,C,T
WHERE S.S#=SC.S# AND SC.C#=C.C#
AND C.T#=T.T# AND TNAME=’LIU’
4)检索选修课程号为C2或C4课程的学生学号。
SELECT S#
FROM SC
WHERE C#=’C2’ OR C#=’C4’
5)检索至少选修课程号为C2和C4课程的学生学号。
SELECT X.S#
FROM SC AS X,SC AS Y
WHERE X.S#=Y.S# AND X.C#=’C2’ AND Y.C#=’C4’
6)检索不学C2课程的学生姓名与年龄。
SELECT SNAME,AGE
FROM S
WHERE S# NOT IN(SELECT S#
FROM SC
WHERE C#=’C2’)
7)检索学习全部课程的学生姓名。(在表S中找学生,在C中不存在一门课程,这个学生没有学。)
SELECT SNAME
FROM S
WHERE NOT EXISTS
(SELECT *
FROM C
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE SC.S#=S.S# AND SC.C#=C.C#))
8)检索所学课程包含学号为S3学生所学课程的学生学号。(在SC表中找一个学生,不存在S3学的一门课,该学生没有学。)
SELECT DISTINCT S#
FROM SC AS X
WHERE NOT EXISTS
(SELECT *
FROM SC AS Y
WHERE Y.S#=’S3’
AND NOT EXISTS
(SELECT *
FROM SC AS Z
WHERE Z.S#=X.S# AND Z.C#=Y.C#))
注:DISTINCT表示去掉重复值。
3.聚合函数
COUNT(*):计算元组个数
COUNT(<列名>) 对一列中的值计算个数
SUM(<列名>) 求某一列值的总和(此列值为数值型)
AVG(<列名>) 求某一列值的平均值(此列值为数值型)
MAX(<列名>) 求某一列值的最大值
MIN(<列名>) 求某一列值的最小值
说明:列名前均可加DISTINCT,表示去掉重复值。
例1:求男生的总人数和平均年龄。
SELECT COUNT(*),AVG(AGE)
FROM S
WHERE SEX=‘男’
例2:统计选修了课程的学生人数。
SELECT COUNT(DISTINCT S#)
FROM SC