0
点赞
收藏
分享

微信扫一扫

多关系表的连接查询

和谐幸福的人生 2022-03-27 阅读 98
数据库

多关系表的连接查询

内连接查询

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 语句将查询结果放入一个临时表内

举报

相关推荐

0 条评论