连接条件

on

在on语句后写具体的条件

1
2
3
select * from student join takes on student.ID = takes.ID;
等价于
select * from student,takes where student.ID = takes.ID;

外连接

外连接运算与自然连接运算类似,只不过通过在结果中创建空值的方式,保留了在连接中丢失的元组

  • 左外连接:left outer join,只保留左边这张表的元组
  • 右外连接:right outer join,只保留右边那张表的元组
  • 全外连接:full outer join,保留出现在关系中全部的元组
  • 内连接:inner join,不保留未匹配元组
1
select * from student natural left outer join takes;

左外连接和右外连接是对称的

视图

创建视图

1
create view view_name as (查询表达式)

例如,需要访问instructor关系中除salary之外的所有数据的职员

1
2
3
create view faculty as
select ID, name, dept_name
from instructor;

一般不允许对视图关系进行修改

视图更新可能存在问题,比如在插入数据时,如果视图的属性列少于基本表,那么可能会出现以下两种情况

  1. 拒绝插入
  2. 向基本表中插入元组,未赋值的属性值为null

删除视图

1
drop view view_name

事务

事务(transaction)由查询语句(select)和更新语句(update)的序列组成

  • commit work:提交当前事务,将事务所做的更新在数据库中长久保存
  • rollback work:回滚当前事务,撤销该事务中所有SQL语句对数据库的更新

一旦事务执行了commit work,就不能通过rollback work撤销了

一个较好的选择是,允许多条SQL语句包含在关键字begin atomic……end之间,这些SQL语句构成单一事务

完整性约束

  • 主码约束
  • not null
  • unique
  • check
  • 参照完整性

默认值

default

1
2
3
4
5
create table s
(
sex char(1) default '1',
sno char(5)
);

create table 的拓展

创建与现有表的模式相同的表

例如,创建一个与instructor具有相同模式的新表temp_instructor

1
create table temp_instructor like instructor;

授权

SQL标准包括select insert update delete

grant语句用来授予权限

1
grant 表级权限 on 关系名或视图名 to 用户/角色列表

例如,授予数据库用户Amit和Satoshi在department关系上的select权限,授予数据库用户Amit和Satoshi在department关系的budget属性上的update权限,

1
2
grant select on department to Amit,Satoshi;
grant update(budget) on department to Amit,Satoshi;

revoke语句用来收回权限

例如,收回授予数据库用户Amit和Satoshi在department关系上的select权限

1
revoke select on student to Amit,Satoshi;

角色

在数据库中建立角色集,并授予每个角色一定的权限,然后将角色分配给用户

1
create role instructor;

角色可以授予给用户,也可以授予给其他角色