多关系表的连接查询
内连接查询
1、查询刘伟老师所讲的课程,要求列出教师号、教师姓名和课程号。
1、SELECT TNo,TN,CNo
FROM T,TC
WHERE (T.TNo=TC.TNo)AND(TN='刘伟')
2、SELECT TNo,TN,CNo
FROM T INNER JOIN TC
ON T.TNo=TC.TNo
WHERE (TN='刘伟')
2、查询所有选课学生的学号、姓名、选课名称以及成绩
SELECT S.SNo,SN,CN,Score
FROM S,SC,C
WHERE (S.SNo=SC.SNo)AND(SC.CNo=C.CNo)
3、查询每门课程的课程号、课程名和选课人数
SELECT C.CNo,CN,COUNT(SC.SNo) as 选课人数
FROM SC,C
WHERE SC.CNo=C.CNo
GROUP BY C.CNo,CN
外连接查询
1、查询所有学生的学号、姓名、选课名称及成绩(没有选课的同学的选课信息显示为空)
SELECT S.SNo,SN,CN,Score
FROM S
LEFT OUTER JOIN SC
ON S.SNo=SC.SNo
LEFT OUTER JOIN C
ON C.CNo=SC.CNo
交叉查询
对学生表S和课程表C进行交叉查询
SELECT *
FROM S CROSS JOIN C
自连接查询
所谓自连接查询就是一个表与其自身连接后进行查询
1、查询所有比刘伟工资高的教师姓名、工资和刘伟的工资
由于要查询的内容均在同一表T内,可以将表T分别取两个别名,一个是X,一个是Y。将X、Y中满足比刘伟工资高的行进行连接起来。这实际上是同一表的大于连接。
SELECT X.TN,X.Sal AS Sal_a,Y.Sal AS Sal_b
FROM T AS X,T AS Y
WHERE X.Sal>Y.Sal AND Y.TN='刘伟'
子查询
查询与刘伟老师职称相同的教师号、姓名
SELECT TNo,TN
FROM T
WHERE Prof =
(
SELECT Prof
FROM T
WHERE TN= '刘伟'
)
在子查询中先执行的是子查询中的函数。
返回一组值的普通子查询(如果返回值的个数不止一个,而是一个集合时,则不能直接使用比较运算符,可以在比较运算符和子查询之间插入ALL或ANY)
使用ANY查询讲授课程号为C5的教师的姓名
SELECT TN FROM T
WHERE (TNo=ANY(SELECT TNo
FROM TC
WHERE CNo='C5'))
查询其他系中比计算机系某一教师工资高的教师的姓名和工资
SELECT TN,Sal
FROM T
WHERE (Sal>ANY(
SELECT MIN(Sal)
FROM T
WHERE Dept = '计算机')
)
AND Dept<>'计算机'
使用IN代替ANY查询教授课程号为C5的老师的姓名
SELECT TN
FROM T
WHERE (
TNO IN (
SELECT TNo
FROM TC
WHERE CNo='C5'))
相关子查询
查询不讲授课程号为’C5’的教师姓名
SELECT DISTINCT TN
FROM T
WHERE ('C5'<>ALL(
SELECT CNo
FROM TC
WHERE TNo=T.TNo))
其中<>ALL也可以用NOT IN代替
使用EXISTS或NOT EXISTS语句完成查询选修所有课程的学生姓名(该函数的功能是返回真或假的值来进行进一步查询)
SELECT SN
FROM S
WHERE (NOT EXISTS(
SELECT *
FROM C
WHERE NOT EXISTS(
SELECT *
FROM SC
WHERE SNo=S.SNo
AND CNo=C.CNo)))
本题也可以这样理解:选出这样一些学生的名单,在SC表中不存在他们没有选修课程的记录
集合运算查询
分别从SC表查询出S1和S2的同学的学号和总分并将两个查询结果合并成一个结果集
SELECT SNo AS 学号,SUM(Score) AS 总分
FROM SC
WHERE (SNo='S1')
GROUP BY SNo
UNION
SELECT SNo AS 学号,SUM(Score) AS 总分
FROM SC
WHERE (SNo='S5')
GROUP BY SNo
此外还有一个SELECT INTO 语句将查询结果放入一个临时表内