zoukankan      html  css  js  c++  java
  • 第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;
  • 相关阅读:
    sed中求公共前缀
    DB9 公头母头引脚定义及连接
    J2SE基础:4.面向对象的特性一
    Android APK反编译具体解释(附图)
    wxWidgets刚開始学习的人导引(1)——前言
    使用Visual Studio 2010 创建简单的Silverlight应用程序
    MyEclipse下XFire开发Webservice实例
    实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序
    素数推断算法(高效率)
    Ansi,UTF8,Unicode,ASCII编码的差别
  • 原文地址:https://www.cnblogs.com/xzxl/p/10739210.html
Copyright © 2011-2022 走看看