数据库系统概念笔记CH4(上)
第四章:中级SQL
4.1连接表达式
连接条件:
- join…using是一种自然连接的形式,只需要在指定属性上的取值匹配
- join…on则允许一种更为普遍的自然连接
- 在下面条件下对二者进行自然连接(注意CS-315仅存在于course,CS-347仅存在于prereq中)
举例说明:
--举例子说明join...on
--
select *
from student join takes on student.ID=takes.ID
--将student.ID和takes.ID相同的元组进行了自然连接
--如果使用join...using,则由于在ID上存在不匹配,故不能够成功连接
--等价于
select *
from student,takes
where student.ID=takes.ID
连接后:
因此由于on条件可以表示为任意的SQL谓词,故on条件的自然连接表达式使得自然连接变得更加丰富。
外连接 outer join
外连接通过在结果中创建包含空值元组的方式保留了在连接中丢失的元组
外连接有三种形式:
- 左外连接:只保留出现在左外连接运算之前的关系中的元组
- 右外连接:只保留出现在右外连接运算之后的关系中的元组
- 全外连接:保留出现在两个关系中的元组
4.2 VIEWS 视图
why need views?
有时候我们希望向用户隐藏特定的数据;如果直接对部分数据进行条件提取后,如果底层数据发生变化的话,则提取的数据需要再次提取,很不方便且占用空间。
视图:不是逻辑模型的一部分,是一种作为虚关系对用户可见的关系
视图的创建: 视图关系只有在需要的时候才会被创建
--通用:
creat view v as <qeary expression>
--其中<query expression>可以是任何合法的查询表达式,v表示视图名
--创建一个instructor视图,不看到工资
creat view faculty as
select ID,name,dept_name
from instructor;
--之后可以使用view
select name
from faculty
where dept_name='Biology'
视图更新:
对视图的修改与更新实际上是作用于其所对应的数据库逻辑模型中的实际关系的修改
通常来说SQL视图可更新的条件:
-
from子句中只有一个数据库关系
-
select子句中只包含关系的属性名,不包含任何表达式、聚集或者distinct声明
-
任何没有出现在select子句中的属性可以取值为空
-
查询中没有group by或having子句
--在可插入情况下,语句: insert into faculty values (’30765’, ’Green’, ’Music’); --等价于 insert into faculty values (’30765’, ’Green’, ’Music’,null);
为了避免视图更新时插入不满足视图要求的条件的元组,可以采用with check option的方法定义视图。通过该方法定义视图,可以使得如果向视图中插入一条不满足视图的where子句条件的元组,数据库系统将拒绝该插入操作。
creat view as <query expression> with check option;
4.3事务transaction
事务由查询和更新语句的序列组成,
结束事务的方式: commit work / rollback work
一个事务或者在完成所有步骤后提交其行为,或者在不能完成其所有动作的情况下回滚其所有动作,通过这种方式数据库提供了对事务具有原子性的抽象。
4.4完整性约束
完整性约束保证授权用户对数据库所做的修改不会破坏数据的一致性。
单个关系上的约束:
-
not null
--该声明表示该变量不能为空值 name varchar(20) not null budget numeric(12,2) not null
SQL禁止在关系模式的主码中出现空值
-
unique
unique(A1,A2...,An) --说明上述属性构成了一个候选码 --不能存在两个元组在上述属性上的取值都相同
-
check(<谓词>)
create table section ( course_id varchar (8), sec_id varchar (8), semester varchar (6), year numeric (4,0), building varchar (15), room_number varchar (7), time slot id varchar (4), primary key (course_id, sec_id, semester, year), check (semester in (’Fall’, ’Winter’, ’Spring’, ’Summer’)) --限定季节只能是这四种中的一个 );
参照完整性
用于保证一个关系中给定属性的取值也在另一个关系的特定属性集的取值中出现。
外码约束:
dept_name varchar(20) references department --声明该属性为外码,受约束于department --通常参照完整性的存在,对一个属性的修改如果会影响参照完整性,则系统会拒绝 --但是可以显式调整: --on delete cascade 或者 on update cascade --例如: dept_name varchar(20) references department on delete cascade on update cascade, --这样如果删除或更新会违反参照完整性,则会将该删除或更新应用于所有被参照
4.5 SQL的数据类型与模式
日期和时间类型
-
date:日历日期,包括年(4位),月,日
-
time:一天中的时间,包括时,分,秒。显式声明time§指明秒的小数后的位数
-
timestamp: date和time的组合
和时间相关的几个函数:
-
cast e as t :将字符串e转换成类型t , t可以是date、time、timestamp的一种,当然字符需要符合规范。
-
extract (field from d),从date或者time中提出单独的域,域可以是year、month、day、hour、minute、second中的一种。
-
current_date返回当前日期,current_time返回当前时间,
-
如果x和y都是时间类型,则 x - y 表示二者的时间间隔
默认值
SQL允许为属性制定默认值,操作如下:
create table student
(ID varchar (5),
name varchar (20) not null,
dept_name varchar (20),
tot_cred numeric (3,0) default 0,
primary key (ID));
在这里tot_cred的默认值为0,意思是如果创建时不为其赋值,则默认为0
大对象类型
-
blob:二进制数据的大d对象数据类型
-
clob : 字符数据类型的大对象数据类型
book review clob(10KB) image blob(10MB) movie blob(2GB)
用户定义类型
--创建新的数据类型
create type Dollars as numeric (12,2) final;
--创建新的数据类型后便可以调用
create table department
(dept_name varchar (20),
building varchar (15),
budget Dollars);
--创建新的域
create domain person_name char(20) not null;
create domain degree_level varchar(10)
constraint degree_level_test
check (value in (’Bachelors’, ’Masters’, ’Doctorate’));
--域相较于属性,可以增加更多的约束条件,且不是强类型的,也就是如果数据类型相同则可以直接赋值
create table的扩展
--可以根据已有的表建立新表,属性相同
create table temp_instructor like instructor;
create table t1 as
(select *
from instructor
where dept name= ’Music’)
with data;
4.6 授权
对数据的授权包括:
- 读取数据 select
- 插入新数据 insert
- 更新数据 update
- 删除数据 delete
权限的授予和收回:
grant语句用来授予权限:
grant <权限列表>
on <关系名或视图名>
to <用户或者角色列表>
授予权限的例子:
--授予选择权限
grant select on department to Amis;
--授予更新权限
grant update(budget) on department to Amis;
revoke收回权限:
revoke <权限列表>
on <关系名或视图名>
from <用户或者角色列表>
--收回选择权限
revoke select on department from Amis;
--授予更新权限
revoke update(budget) on department from Amis;
角色
可以建立角色集,给角色授予权限
--创建角色
creat role instructor;
--授予角色权限
grant select on takes
to instructor;
--角色可以授予给用户,也可以授予给其他角色
grant dean to Amit;
creat role dean;
grant instructor to dean;
grant dean to Satoshi;
视图的授权
create view geo_instructor as
(select *
from instructor
where dept_name = ’Geology’);
The creator of the view must have select authorization on the instructor relation..
grant select on geo_instructor to geo_staff
权限的转移:
grant select on department to Amit with grant option;
--则Amit拥有授予权限的功能
权限的收回:
revoke select on department from Amit, Satoshi restrict;
--表示级联收回权限