利用SQL语言进行多表联合查询

多表联合查询
多表联合检索可以通过连接运算来完成,而连接运算又可以通过广义笛卡尔积后再进
行选择运算来实现。
Select 的多表联合检索语句
Select 列名 [ [, 列名] … ]
From 表名1, 表名2, …
Where 检索条件 ;

相当于在这里插入图片描述
检索条件中要包含连接条件,通过不同的连接条件可以实现等值连接、不等值连接及各种θ-连接

多表联合查询之连接条件
θ-连接之等值连接
示例:按“001”号课成绩由高到低顺序显示所有学生的姓名(二表连接)
Select Sname From Student, SC
Where Student.S# = SC.S# and SC.C# = ‘001’
Order By Score DESC;

多表连接时,如两个表的属性名相同,则需采用表名. 属性名方式来限定该属性是属于哪一个表
示例:按‘数据库’课成绩由高到低顺序显示所有同学姓名(三表连接)
Select Sname From Student, SC, Course
Where Student.S# = SC.S# and SC.C# = Course.C# and Cname = ‘数据库’
Order By Score DESC;

表更名与表别名
重名之处理
连接运算涉及到重名的问题,如两个表中的属性重名,连接的两个表重名(同一表的连接)等,因此需要使用别名以便区分
select中采用别名的方式
Select 列名 as 列别名 [ [, 列名 as 列别名] … ]
From 表名1 as 表别名1, 表名2 as 表别名2, …
Where 检索条件 ;

上述定义中的as 可以省略
当定义了别名后,在检索条件中可以使用别名来限定属性

不等值连接
θ-连接之不等值连接
示例:求有薪水差额的任意两位教师
Select T1.Tname as Teacher1, T2.Tname as Teacher2
From Teacher T1, Teacher T2
Where T1.Salary > T2.Salary ;

示例:求年龄有差异的任意两位同学的姓名
Select S1.Sname as Stud1, S2.Sname as Stud2
From Student S1, Student S2
Where S1.Sage > S2.Sage ;

有时表名很长时,为书写条件简便,也定义表别名,以简化书写

多表联合查询训练
示例:求既学过“001”号课又学过 “002”号课的所有学生的学号
Select S1.S# From SC S1, SC S2
Where S1.S# = S2.S# and S1.C#=‘001’
and S2.C#=‘002 ;

示例:求“001”号课成绩比“002”号课成绩高的所有学生的学号
Select S1.S# From SC S1, SC S2
Where S1.S# = S2.S# and S1.C#=‘001’
and S2.C#=‘002’ and S1.Score > S2.Score;

(笔记整理自中国大学MOOC)

发布了38 篇原创文章 · 获赞 121 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/LoraRae/article/details/105447052
今日推荐