声明:很多文字和代码参考书籍:《数据库系统中文第6版》
1.连接表达式
SQL提供了连接运算的其他形式,包括能够指定显式的连接谓词,能够在结果中包含被自然连接排除在外的元组。
关键词on:
它等价于下面这条语句:
它与自然连接
的区别在于:它的连接结果会产生两个ID,分别是student.ID,takes.ID,然而我们的自然连接只会产生一个ID属性。
on关键词还有其他作用,不然显得和where没区别,下面会介绍到。
A join B using…和 A join B on …的区别(using后面跟属性名字,on后面跟谓词)
外连接:
用自然连接(内连接)可能会丢失一些数据,比如将学生表和选课表做内连接,就会漏掉这些学生的数据,他们可能没有选任何课程。这时候,使用外连接可以保留这些丢失的信息。
外连接分3种:
上面的例子(学生表和选课表作左外连接):
SELECT *
FROM student NATURAL LEFT OUTER JOIN takes;
当遇到没有选课的学生时,保留他们在student表格中的信息,然后他们在takes中的信息设置为null(原本就没有匹配到takes,因为没有选课)
我们还可以顺便把那些没选课的人给揪出来:
SELECT ID
FROM student NATURAL LEFT OUTER JOIN takes
WHERE course_id IS NULL
使用全外连接的例子:
on与where的区别:
对比下面这两条语句:
使用on的语句可以获取到没有选课的学生信息,而where不行,因为on条件是外连接声明的一部分,而where子句不是,注意外连接只为那些对相应内连接结果没有贡献的元组补上空值并加入结果。
2.视图
让所有用户都看到整个逻辑模型是不合适的。出于安全考虑,可能需要向用户隐藏特定的数据。视图可以完成这个要求。
定义
:SQL 允许通过查询来定义“虚关系”,它在概念上包含查询的结果。虚关系并不预先计算和存储,而是在使用虚关系的时候才通过执行查询被计算出来。任何像这种不是逻辑模型的一部分,但作为虚关系对用户可见的关系称为视围(view)。
当我们定义-个视图时,数据库系统存储视图的定义本身,而不存储定义该视图的查询表达式的执行结果。
格式
:
e.g.
给出每个系中所有教师的工资总和:
一个视图可以被用到定义另一个视图的表达式中
列出Physics系在2009年秋季学期所开设的所有课程段:
列出Physics系在2009年秋季学期在Watson大楼开设的所有课程段的标识和房间号:
3.物化视图
特定数据库系统允许存储视图关系,但是它们保证:如果用于定义视图的实际关系改变,视图也跟着修改。这样的视图被称为物化枧图(materialized view)。
4.视图更新
在更新视图时,需要更新实际的关系,比如:更新视图faculty
这个插入必须表示为对关系instructor的插入,因为instructor是构造视图faculty的实际关系,但是上面的插入没有指出薪水是多少,有两种解决办法:
但是赋值null也会遇到问题,比如:
因为没有指出dept_name的值,假设赋值为null,那么instructor表和department表的dept_name都是null,但是两个null是不会相等的,不满足视图的定义,所以不能设置为null
因为这些以及其他问题,不同的数据库指定了不同的条件以允许数据库的更新。
一般来说,如果定义视图的查询对下列条件都满足,则说这个SQL视图是可更新的:
5.事务
事务(transaction)由查询和(或)更新语句的序列组成。SQL标准规定当一条语句被执行,就隐式地开始了一个事务。下列SQL语句可以结束一个事务:
现实中可能出现这种情况,A从银行把钱打给了B,A扣了钱,但是在B收到钱之前系统崩溃了,这时,就会出现银行账户的信息不一致
解决的办法是:让事务具有原子性(atomic)
6.完整性约束
完整性约束保证授权用户对数据库所做的修改不会破坏数据的一致性。因此,完整性约束防止的是对数据的意外破坏。
not null约束
7.授权
grant语句用于授予权限:
举例:
用revoke语句来回收权限:
书上提供的术语回顾: