zoukankan      html  css  js  c++  java
  • 第10讲:利用SQL语言实现关系代数操作

    一、实现并、交、差运算

    1. 基本语法形式:子查询 [union [all] | intersect [all] | except [all] 子查询]

        ①意义:将关系代数中的∪、∩、- 分别用union、intersect、except来代替

        ②不带all:删除重复的元组

        ③带all:保留重复的元组

    【示例】假设子查询1的一个元组出现m次,子查询2的一个元组出现n次,则该元组在:

    • 子查询1 union all 子查询2        // 出现m+n次
    • 子查询1 intersect all 子查询2   // 出现min(m,n)次
    • 子查询1 except all 子查询2      // 出现max(0, m-n)次

    2. SQL并运算

    【示例1】求学过002号课的同学或学过003号课的学生的学号:

    • select S# from SC where C# = '002' union select S# from SC where C# = '003';
    • select S# from SC where C# = '002' or C# = '003';

    【示例2】已知两个表Customers(CID, Cname, City, Discnt)和Agents(AID, Aname, City, Percent)求客户所在的或者代理商所在的城市:

    • select City from Customers union select City from Agents;

    3. SQL交运算

        ①intersect运算符并未增强SQL的表达能力,即没有intersect,SQL也可以通过其他方式表达相同的查询需求

        ②但intersect更方便表达查询需求,同时也增加了SQL语言的不唯一性

    【示例】求既学过002号课,又学过003号课的学生的学号:

    • select S# from SC where C# = '002' intersect select S# from SC where C# = '003';
    • select S# from SC where C# = '002' and S# in (select S# from SC where C# = '003');

    4. SQL差运算

        ①except运算符也未增强SQL的表达能力,即没有except,SQL也可以通过其他方式表达相同的查询需求

        ②但except更方便表达查询需求,同时也增加了SQL语言的不唯一性

    【示例】假定所有学生都有选课,求没学过002号课程的学生的学号:

    • select DISTINCT S# from SC except select S# from SC where C# = '002';  // 所有学生 减掉 学过002号课的学生
    • select DISTINCT S# from SC SC1 where not exists (select * from SC where C# = '002' and S# = SC1.S#);

    二、空值的处理

    1. 空值概述

        ①空值:不知道、不存在或无意义的值。

        ②空值不能参与算术、比较或逻辑运算,但现行的DBMS做出了一些新规定:

    • 如果null参与算术运算,则该算术表达式的值为null
    • 如果null参与比较运算,则结果可视为false,在SQL-92中可看成unknown

        ③如果简单地将空值按默认值处理,则会影响聚集函数运算的正确性。

    • 如果null参与聚集运算,则除count(*)之外的其他聚集函数都将忽略null

    2. 空值检测

        ①语法形式:is [not] null

        ②语义:判断指定列的值是否为空值

        ③除is [not] null之外,空值不满足任何查找条件

    【示例】找出年龄值为空的学生姓名:

    • select Sname from Student where Sage is null;  // 不能写成"= null",因为空值是不能进行运算的

    三、实现连接运算

    1. 前言

        ①关系代数操作中有连接运算,其中分为θ-连接和外连接

        ②之前学过的SQL语句都是在from子句后接多个表名来实现连接运算的

    2. SQL的高级语法中引入了内连接和外连接运算

        ①语法形式:from 表名1 [natural] [inner | {left | right | full} [outer]] join 表名2 {on 连接条件 | using (列名 [, 列名 ... ])}

        ②上述连接运算由两部分构成:连接类型、连接条件

    • 连接类型(四者选一):inner join、left outer join、right outer join、full outer join
    • 连接条件(三者选一):natural、on 连接条件、using (列名 [, 列名 ... ])

        ③inner join:即关系代数中的θ-连接运算

        ④left/right/full outer join:即关系代数中的左/右/全外连接运算

        ⑤natural:即自然连接,出现在结果关系中的两个连接关系的元组在公共属性上取值相等,且公共属性只出现一次

        ⑥on 连接条件:即θ-连接,出现在结果关系中的两个连接关系的元组取值满足连接条件,且公共属性出现两次

        ⑦using(列名 [, 列名 ...]):(列名 [, 列名 ... ])是两个连接关系的公共属性的子集,元组需在(列名 [, 列名 ... ])上取值相等,且这些属性只出现一次

    • 示例:select Teacher.T#, Tname, Cname from Teacher inner join Course on Teacher.T# = Course.T# order by Teacher.T#;

    【示例】求所有教师的任课情况并按教师号排序(没有任课的教师也需列在表中):

    • select Teacher.T#, Tname, Cname from Teacher left outer join Course on Teacher.T# = Course.T# order by Teacher.T#;

        

  • 相关阅读:
    20162302预备作业02
    20162302预备作业01
    设计模式第二次作业
    设计模式第一次作业
    项目选题报告(团队)
    高级软件工程结对第二次作业
    高级软件工程团队第一次作业
    高级软件工程结对第一次作业
    高级软件工程第二次作业
    高级软件工程第一次作业--准备
  • 原文地址:https://www.cnblogs.com/xzxl/p/10743450.html
Copyright © 2011-2022 走看看