第4讲:多表联合查询
Posted xzxl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第4讲:多表联合查询相关的知识,希望对你有一定的参考价值。
当查询过程中涉及多个表时,在关系代数中可以通过连接运算(把若干个表连接成一个大表)来完成,而连接运算又可以通过广义笛卡儿积后再进行选择运算来实现。
一、select的多表联合检索语句
1. 最简单的形式:select 列名 [[, 列名] ... ] from 表名1, 表名2, ... where 检索条件;
①我们知道连接运算包含θ-连接、自然连接等,所以检索条件中要包含连接条件。
②通过不同的连接条件,可以实现各种θ-连接。
2. θ-连接之等值连接
【示例1】按"001"号课成绩由高到底顺序显示所有学生的姓名(二表连接):
- select Sname from Student, SC where Student.S# = SC.S# and SC.C# = ‘001‘ order by Score desc; // 注意连接条件
- 多表连接时,如两个表的属性名相同,则需采用表名.属性名的方式来限定该属性是属于哪一个表
【示例2】按“数据库”课成绩由高到低顺序显示所有同学姓名(三表连接):
- select Sname from Student, SC, Course where Student.S# = SC.S# and SC.C# = Course.C# and Cname = ‘数据库‘ order by Score desc;
3. 对同一个表进行连接操作:需使用表别名以便区分
①采用别名的格式:select 列名 as 列别名 [[, 列名 as 列别名] ... ] from 表名1 as 表别名1, 表名2 as 表别名2, ... where 检索条件;
②上述定义的as可以省略。
③当定义了别名后,在检索条件中可以使用别名来限定属性。
④有时表名很长时,为书写条件简便,也定义表别名,以简化书写。
【示例1】求有薪水差额的任意两位教师:
- select T1.Tname as Teacher1, T2.Tname as Teacher2 from Teacher T1, Teacher T2 where T1.Salary > T2.Salary;
【示例2】求年龄有差异的任意两位同学的姓名:
- select S1.Sname as Stud1, S2.Sname as Stud2 from Student S1, Student S2 where S1.Sage > S2.Sage;
【示例3】求既学过“001”号课又学过“002”号课程d的所有学生的学号:
- select S1.S# from SC S1, SC S2 where SC1.S# = SC2.S# and S1.C# = ‘001‘ and S2.C# = ‘002‘;
【示例4】求“001”号课成绩比“002”号课成绩高的所有学生的学号:
- select S1.S# from SC S1, SC S2 where SC1.S# = SC2.S# and S1.C# = ‘001‘ and S2.C# = ‘002‘ and S1.Score > S2.Score;
以上是关于第4讲:多表联合查询的主要内容,如果未能解决你的问题,请参考以下文章
Oracle曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询
MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积