SQL 基于派生表的查询

本文最后更新于:2024年3月18日 凌晨

SQL 基于派生表的查询

  • 子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表(derived table)成为主查询的查询对象,例如,例3.57找出每个学生超过他自己选修课程平均成绩的课程号,也可以用如下的查询完成:
1
2
3
4
5
6
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
  • 这里FROM子句中的子查询将生成一个派生表Avg_sc,该表avg_grade两个属性组成,记录了每个学生的学号及平均成绩,主查询将SC表与Avg_sc按学号相等进行连接,选出修课成绩大于其平均成绩的课程号。
  • 如果中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其默认属性,例如例3.60查询所有选修了1号课程的学生姓名,可以用如下查询完成:
1
2
3
4
5
6
SELECT Sname
FROM Student,(SELECT Sno
FROM SC
WHERE Cno='1')
AS SC1
WHERE Student.Sno=SC1.Sno;
  • 需要说明的是,通过FROM子句生成派生表时,AS关键字可以省略,但必须为派生关系指定一个别名,而对基本表,别名是可选择项。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!