一、实现并、交、差运算

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#;

第10讲:利用SQL语言实现关系代数操作的更多相关文章

  1. 第一讲:SQL语言概述

    SQL语言是集DDL.DML和DCL于一体的数据库语言. SQL语言之DDL:定义数据库 SQL语言之DML:操纵数据库 一.功能概述 SQL语言主要由以下9个单词引导的操作语句来构成,但每一条语句都 ...

  2. MySQL 利用SQL线程对Binlog操作

    背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...

  3. MySQL 利用SQL线程对Binlog操作(转)

    背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...

  4. 利用SQL Profiler 追踪数据库操作

    SQL Server 事件探查器 是一个界面,用于创建和管理跟踪并分析和重播跟踪结果. 这些事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行分析或用它来重播一系列特定的步骤. SQL S ...

  5. R中利用SQL语言读取数据框(sqldf库的使用)

    熟悉MySQL的朋友可以使用sqldf来操作数据框 # 引入sqldf库(sqldf) library(sqldf) # 释放RMySQL库的加载(针对sqldf报错) #detach("p ...

  6. 数据库系统学习(六)-SQL语言基本操作

    第六讲 SQL语言概述 基本命名操作 关系代数是集合的思想 关系演算是逻辑的思想(数学公式) SQL-86,SQL-89,SQL-92,SQL-99,SQL-2003,2008...发展过程标准 SQ ...

  7. 架构-数据库访问-SQL语言进行连接数据库服务器-DB-Library:DB-Library

    ylbtech-数据库访问-SQL语言进行连接数据库服务器-DB-Library:DB-Library 1.返回顶部 1. 在基于三层构架的信息系统开发中,应用服务器要利用SQL语言进行连接数据库服务 ...

  8. SQL语言概况(4.1)

    SQL语言概况(4.1) 目录 SQL语言概况(4.1) 4.1 SQL语言概况 4.1.1 历史及标准简介 4.1.2 SQL语言定义及特点 4.1.3 使用说明 参考资料: 数据库原理及设计(第3 ...

  9. ASP.net(C#)利用SQL Server实现注册和登陆功能

    说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...

随机推荐

  1. C#做一个简单的进行串口通信的上位机

    C#做一个简单的进行串口通信的上位机   1.上位机与下位机 上位机相当于一个软件系统,可以用于接收数据.控制数据.即可以对接收到的数据直接发送操控命令来操作数据.上位机可以接收下位机的信号.下位机是 ...

  2. Difference between link and @import

    原文don’t use @import Using @import within a stylesheet adds one more roundtrip to the overall downloa ...

  3. 【 腾讯敏捷转型No.4 】为什么敏捷团队不要超过15人

    早期,腾讯公司的架构是比较简单的.从上至下分别是:公司——商业单元(BU)——部门——组——员工,每个部门基本上就是负责一个大的产品,每个组都是按照专业进行分工和管理,例如:产品组.终端组.后台组.设 ...

  4. iOS UITextField的代理<UITextFieldDelegate>的几点笔记

    今天做项目的时候,有个需求,点击按钮,就在特定的编辑框输入按钮中的文字,一开始我还以C++的思想来写,先获取光标的位置,然后在判断是否在那个编辑框,进行输入.后来我旁边的同事看到了直接教我用代理方法, ...

  5. js array数组对象操作方法汇总

    --------------------------更新自2018.6.11 js 数组对象操作方法如下: 1. 创建数组 var array1 = [1,2] //方法一 var array2 = ...

  6. vue实现两重列表集合,点击显示,点击隐藏的折叠效果,(默认显示集合最新一条数据,点击展开,显示集合所有数据)

    效果图: 默认显示最新一条数据: 点击显示所有数据: 代码: 说明:这里主要是 这块用来控制显示或者隐藏 根据当前点击的  这个方法里传递的index 对应  isShow 数组里的index  ,对 ...

  7. leetcode-53-Maximum Subarray(动态规划详解)

    题目描述: Given an integer array nums, find the contiguous subarray (containing at least one number) whi ...

  8. 【HNOI2015】菜肴制作

    题面 题解 这道题目首先可以想到拓扑排序,但是肯定不是字典序最小的排列. 比如说,有\(4\)种菜,限制为\(2 \to 4, 3 \to 1\),那么如果求字典序最小的排列会算出\((2, 3, 1 ...

  9. 【FJOI2016】建筑师

    安利另外一篇\(blog\) 密码泥萌都知道 题面 题解 为了描述方便,这里将建筑称作\(zsy\) 高度为\(n\)的\(zsy\)无论如何都能从左右两侧看到.剩下的部分,从左边看到的是前缀\(ma ...

  10. 2_C语言中的数据类型 (九)逻辑运算符与if语句、switch、条件运算符?、goto语句与标号

    1          条件分支语句 1.1       关系运算符 在C语言中0代表false,非0代表真 1.1.1          < 小于 1.1.2          <= 小于 ...