第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 联合查询 如何查询从表的最后一条记录

sql如何一对多联合查询

mysql 多表联合查询啥用

Django怎么多表联合查询

MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积