第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#;
第10讲:利用SQL语言实现关系代数操作的更多相关文章
- 第一讲:SQL语言概述
SQL语言是集DDL.DML和DCL于一体的数据库语言. SQL语言之DDL:定义数据库 SQL语言之DML:操纵数据库 一.功能概述 SQL语言主要由以下9个单词引导的操作语句来构成,但每一条语句都 ...
- MySQL 利用SQL线程对Binlog操作
背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...
- MySQL 利用SQL线程对Binlog操作(转)
背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...
- 利用SQL Profiler 追踪数据库操作
SQL Server 事件探查器 是一个界面,用于创建和管理跟踪并分析和重播跟踪结果. 这些事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行分析或用它来重播一系列特定的步骤. SQL S ...
- R中利用SQL语言读取数据框(sqldf库的使用)
熟悉MySQL的朋友可以使用sqldf来操作数据框 # 引入sqldf库(sqldf) library(sqldf) # 释放RMySQL库的加载(针对sqldf报错) #detach("p ...
- 数据库系统学习(六)-SQL语言基本操作
第六讲 SQL语言概述 基本命名操作 关系代数是集合的思想 关系演算是逻辑的思想(数学公式) SQL-86,SQL-89,SQL-92,SQL-99,SQL-2003,2008...发展过程标准 SQ ...
- 架构-数据库访问-SQL语言进行连接数据库服务器-DB-Library:DB-Library
ylbtech-数据库访问-SQL语言进行连接数据库服务器-DB-Library:DB-Library 1.返回顶部 1. 在基于三层构架的信息系统开发中,应用服务器要利用SQL语言进行连接数据库服务 ...
- SQL语言概况(4.1)
SQL语言概况(4.1) 目录 SQL语言概况(4.1) 4.1 SQL语言概况 4.1.1 历史及标准简介 4.1.2 SQL语言定义及特点 4.1.3 使用说明 参考资料: 数据库原理及设计(第3 ...
- ASP.net(C#)利用SQL Server实现注册和登陆功能
说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...
随机推荐
- request请求转换成对象。
1)前端post数据过来,key和val键值对会有很多,这个时候往后端进行插值的时候,最好将这些键值对转换成对象进行处理. 使用common-beanutils 来将前端传递过来的map直接转换成对象 ...
- SQLSERVER存储过程语法具体解释
SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } ...
- unlink与close关系
close和unlink.以前时候总是不太理解两者的区别,最近看到一篇博客比较详细地描述了二者的本质区别,这里我引用了它的原文. “每一个文件,都可以通过一个struct stat的结 ...
- iOS 输入框限制输入字节数
iOS中限制输入框文字长度的方法有好多,百度一下,最常用的是这种: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersI ...
- docker 简要学习
一.Docker的安装和启动 使用环境centos7 yum包更新到最新 sudo yum update 安装需要的软件包,yum-util提供yum-config-manager功能 sudo yu ...
- MongoDB登录验证及用户管理
一.超级管理员创建及开启登录验证 如果MongoDB要开启登录验证,必须在开启登录验证之前先创建好超级管理员,否则无法登录数据库! 例如,创建一个超级管理员admin,关联给admin数据库,角色设置 ...
- # 课堂测试(CH6)20155218
课堂测试(CH6) 1. 下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为(D) A . 1 B . 1/4 C . 1/2 D . 3/4 解析:在x[0],y[0]时发 ...
- 20155222 c语言实现pwd命令
20155222 c语言实现linux的pwd命令 1.学习pwd命令在Linux层次结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录.然 ...
- # 20155229 2016-2017-2 《Java程序设计》第七周学习总结
20155229 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 第十二章 lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装 ...
- JavaEE笔记(五)
version 必须配置在id后面 缓存文件在映射文件后面 一级缓存:session回话级别 Session缓存的作用 (1)减少访问数据库的频率.应用程序从内存中读取持久化对象的速度显然比到数据库中 ...