码迷,mamicode.com
首页 > 其他好文 > 详细

第4讲:多表联合查询

时间:2019-04-19 22:41:23      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:sele   src   rom   年龄   des   ext   关系   select   from   

当查询过程中涉及多个表时,在关系代数中可以通过连接运算(把若干个表连接成一个大表)来完成,而连接运算又可以通过广义笛卡儿积后再进行选择运算来实现。

 

一、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讲:多表联合查询

标签:sele   src   rom   年龄   des   ext   关系   select   from   

原文地址:https://www.cnblogs.com/xzxl/p/10739210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!