数据库原理
1、名词解释
数据(Date)、数据库(DateBase)、数据库管理系统(DBMS)、数据库系统(DBS)
数据库数据的特点:永久存储、有组织和可共享性。
数据库管理系统DBMS的主要功能:①数据定义功能、②数据组织、存储和管理、③数据操纵功能、④数据库的事务管理和运行管理、⑤数据库的建立和维护功能。
数据库系统DBS一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员构成。
2、发展历程
数据管理技术经历了三个阶段,人工管理、文件管理、数据库系统。
人工管理阶段缺点:数据的逻辑结构或物理结构发生变化后,必须对应用程序做相应的修改,加重程序员的负担。
文件管理缺点:数据共享性差、冗余度大,数据独立性差。
3、模型分类
根据模型应用的不同目的分类,可以分为两类,第一类是概念模型,第二类是逻辑模型和物理模型。概念模型(也叫信息模型,主要用于数据库设计),逻辑模型(主要用于DBMS的实现),物理模型。
数据模型通常由数据结构、数据操作和完整性约束三部分组成。
数据操作包括查询、插入、删除、更新数据。
完整性约束:实体完整性,参照完整性,用户定义的完整性。
4、基本概念
实体(Entity),客观存在并可相互区别的事物。
属性(Attribute),实体所具有的某一特性。
码(Key),唯一标识实体的属性集。
域(Domain),一组具有相同数据类型的值的集合。属性的取值范围。
实体型(Entity Type)。
实体集(Enttity Set),同一类型实体的集合。
联系(Relationship),反映实体(型)内部的联系和实体(型)之间的联系。
5、两个实体型之间的联系
a. 一对一联系(1:1)
例如,一个班级只有一个正班长,而一个班长也只在一个班中任职。班级与班长之间有一对一联系。
b. 一对多联系(1:n)
例如,一个班级中有若干名学生,而每个学生只在一个班级里学习。班级与学生之间有一对多联系。
c. 多对多联系(m:n)
例如,一门课同时被若干个学生选修,而一个学生可以同时选修多门课。课程与学生之间具有对多对联系。
两个以上实体型之间的联系
两个以上的实体型之间也存在一对一、一对多、多对多联系。
单个实体型内的联系
同一个实体集内的各实体之间也存在一对一、一对多、多对多联系。
6、实体-联系图(E-R图)
E-R图是概念模型的一种表示方法,提供了表示实体型、属性、联系的方法。
实体型,用矩形表示,矩形框内写明实体名。
属性,用椭圆形表示,并用无向边将其对应的实体型连接起来。
联系,用菱形表示,菱形内写明联系名,并用无向边分别与有关实体型连接起来,并在无向边旁边标上联系的类型(1:1,1:n,m:n)。如果一个联系具有属性,则该属性也要用无向边与该联系连接起来。
such as:学生实体具有学号、姓名、性别、出生年份、系等属性。
7、常用的数据模型
数据库领域常用的逻辑数据模型有,层次模型、网状模型、关系模型、面向对象模型、对象关系模型。
本文主要讲关系数据模型。
有关关系数据模型的名词解释如下:
关系(Relation):一个关系对应通常说的一张表。
元组(Tuple):表中的一行。
属性(Attribute):表中的一列。
码(Key):也称为码建,表中的某个属性组,可以唯一确定一个元组。
域(Domain):属性的取值范围。
分量:元组中的一个属性值。
关系模式:对关系的描述。
关系数据模型的优点:
a.关系模型与格式化模型不同,它是建立在严格的数学概念的基础上。
b.关系模型的概念单一。
c.关系模型的存取路径对用户透明,具有较高的独立性,安全保密性,简化程序员操作。
8、数据库系统模式
模式(Schema)是数据库中全体数据的逻辑结构和特征的描述,同一个模式可以有很多实例。
数据库系统的三级模式结构:数据库系统是由外模式、模式、内模式构成。
外模式(也叫子模式或用户模式),面向用户,只告诉你结果,没有查数据的过程。
模式(也叫逻辑模式),面向数据库。
内模式面向物理层。
Notice:
a.外模式通常是模式的子集,一个数据库可以有多个模式。
b.同一个外模式可以为某一用户的多个应用系统使用,但一个应用程序只能使用一个外模式。
c.每个用户只能看到和访问所对应的外模式中的数据,有些数据是看不到的。
数据库管理系统在三级模式之间提供了两层映像,外模式/模式映像,模式/内模式映像。
两层映像保证了数据库系统中的数据具有较高的逻辑独立性和物理独立性。
二、关系数据库
1、基础概念
关系模型建立在集合代数的基础上。
域:一组具有相同数据类型的值的集合。
笛卡尔积:所有域的所有取值的一个组合。
such as:笛卡尔积
导师集合D1={白老师,徐老师}
专业集合D2={计算机专业,软件专业}
研究生集合D3={张三,李四}
则D1,D2,D3的笛卡尔积为
D1*D2*D3={(白老师,计算机专业,张三),(白老师,计算机专业,李四),(白老师,软件专业,张三),(白老师,软件专业,李四),徐老师,计算机专业,张三),(徐老师,计算机专业,李四),(徐老师,软件专业,张三),(徐老师,软件专业,李四)}
元组:笛卡尔积中的每一个元素。
分量:笛卡尔积中一个元素中的每一个值
基数:集合中元素的个数,例如导师集合的基数为2,专业集合的基数也为2.
笛卡尔积的基数是每一个集合基数的乘积,例如D1*D2*D3的基数为2*2*2=6.
笛卡尔积的子集并不是都有意义。
三类关系:基本关系(基本表):实际存在的表,是实际存储数据的逻辑表示。
查询表:查询结果对应的表。
视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
基本关系的性质:
a.列是同质的,每一列的域是一样的。
b.不同的列可以出自同一个域,每一列的属性名不能相同。
c.列的顺序无所谓,列的次序可以任意更换。
d.每行的候选码不能相同,意思就是每个人的身份证号不能一样。
e.行的顺序无所谓,次序可以换。
f.分量必须取原子值,分量不能继续分。
关系的表示:关系名(属性1,属性2,……)
关系模式的表示:R(U,D,DOM,F)
R:关系名,例如学生信息。
U:组成该关系的属性名的集合,意思是把表中的属性弄成一个集合,放在U里。
D:表示U中属性所取的域。
DOM:属性向域的映像集合,例如张三的性别是男,取D中的男这一个域。
F:属性间的数据依赖关系集合。
关系模式是静态的、稳定的。
关系是动态的,随时间不断变化。
2、关系操作
关系模型中常用的关系操作有查询、插入、删除、修改。
查询可以分为选择、投影、连接、除、并、差、交、笛卡尔积等。
3、关系的完整性
关系模型中有三类完整性约束:实体完整性、参照完整性、用户定义的完整性。
其中实体完整性和参照完整性是必须满足的,也叫关系的两个不变性。
实体完整性规则:
a.主属性不能取空值。
b.任意两个元组的主码不能相同。
参照完整性规则:
如果属性或属性组F是基本关系R的外码,则对于R上的每个元组来说,在F属性上的值要么取空值,要么等于S中某个元组的主码值。参考下图来说,Student表中的专业号属性的值要么是空值,要么就要和专业表中的专业号对应。意思是要么学生还没被分配专业,要么就分配专业表里的专业,不能给学生分配不存在的转业。
外键:F是基本关系R的一个或一组属性,但是不是R的主码;如果F与另一个基本关系S的主码相对应,则F是基本关系R的外码。基本关系R叫做参照关系,S叫被参照关系。
such as:在Student表中,学号是主码,专业号不是主码,只是一个属性;student表中的专业号参照于专业表中的专业号;专业表的主码是专业号;满足这三个条件,所以在student表中,专业号叫做外码。
注:
a.R和S不一定是不同的关系,例如也可以都是学生表。
b.外码F要和S的主码域相同。
c.外码的名字可以不和S的主码相同,但要一一对应。
用户定义的完整性:例如绩点只能是1~5.
4、关系代数
包括集合运算(并、差、交、笛卡尔积)和专门的关系运算(选择、投影、连接、除)。
a.集合运算(对行操作)
并:(和并集一样)
差:顾名思义。A-B=在A中但是不在B中的元组。
交:取A和B的交集
笛卡尔积:可以打破两个关系的属性元组不一样的限制
运算结果:假设R有k1行,n列;S有k2行,m列;则结果有k1*k2行,有n+m列。其中前n个属性来自于R,后m个属性来源于S。
b.专门的关系运算
关系模式为R(A1,A2,……An),t是R的一个元组,t[Ai]则表示元组t中对应于属性Ai上的一个分量。
属性列(属性组):属性集合中的一部分属性构成的集合。
表示,在总体属性中去掉A集合中的属性,剩余的值。类似于补集。
R有n列,S有m列,tr属于R,ts属于S,则称为元组的连接。结果是一个n+m列的元组,前n个分量是R中的一个n元组,后m个分量是S中的一个m元组。
象集:概念较抽象,直接举例理解。
求x1的象集,就是在R上找x1对应的另一个属性的值。以此类推……
选择:(选择行)
在关系R中选择满足条件的一些元组。记作,,F为选择条件,基本形式为X1
X2。
是比较运算符,可以是>,≥,<,≤,=,<>(表示不等于),与,或,非。
X1,Y1是属性名,或者常量,函数等,属性名也可以用它的序号代替。
such as:,意思是选择在R表中,年龄大于18岁的人。
或者这样写。字符串要加单引号,数字不用。
投影:(选择列)
从R中选择出若干个属性列组成新的关系。
.
A是R中的属性列,R是表名。
连接:
有三种常用的连接,一般连接(也称为连接)、等值连接、自然连接。
一般连接:从两个关系的笛卡尔积中,选取属性间满足一定条件的元组。
记作,
A和B:分别是R和S上度数相等(即,属性的个数一样,比如都有三个属性)且可比的属性组。
,是比较运算符,可以是>,≥,<,≤,=,<>(表示不等于),与,或,非。
等值连接:即比较运算符为=,含义是从关系R和S的笛卡尔积中选取A、B属性值相同的元组。
自然连接:是一种特殊的等值连接,两个关系中进行比较的分量必须是相同属性组,在结果中把重复的属性列去掉;含义是:R和S具有相同的属性组B
举个例子,such as:关系R和S如下图所示
R | ||
---|---|---|
A | B | C |
a1 | b1 | 5 |
a1 | b2 | 6 |
a2 | b3 | 8 |
a2 | b4 | 12 |
S | |
---|---|
B | E |
b1 | 3 |
b2 | 7 |
b3 | 10 |
b3 | 2 |
b5 | 2 |
想求下列值:
,
,
解:先对R和S进行笛卡尔积
R X S | ||||
A | R.B | C | S.B | E |
a1 | b1 | 5 | b1 | 3 |
a1 | b1 | 5 | b2 | 7 |
a1 | b1 | 5 | b3 | 10 |
a1 | b1 | 5 | b3 | 2 |
a1 | b1 | 5 | b5 | 2 |
a1 | b2 | 6 | b1 | 3 |
a1 | b2 | 6 | b2 | 7 |
a1 | b2 | 6 | b3 | 10 |
a1 | b2 | 6 | b3 | 2 |
a1 | b2 | 6 | b5 | 2 |
a2 | b3 | 8 | b1 | 3 |
a2 | b3 | 8 | b2 | 7 |
a2 | b3 | 8 | b3 | 10 |
a2 | b3 | 8 | b3 | 2 |
a2 | b3 | 8 | b5 | 2 |
a2 | b4 | 12 | b1 | 3 |
a2 | b4 | 12 | b2 | 7 |
a2 | b4 | 12 | b3 | 10 |
a2 | b4 | 12 | b3 | 2 |
a2 | b4 | 12 | b5 | 2 |
,即在笛卡尔积中找C<E的元组,结果如下:
A | R.B | C | S.B | E |
a1 | b1 | 5 | b2 | 7 |
a1 | b1 | 5 | b3 | 10 |
a1 | b2 | 6 | b2 | 7 |
a1 | b2 | 6 | b3 | 10 |
a2 | b3 | 8 | b3 | 10 |
,等值连接,结果如下:
A | R.B | C | S.B | E |
a1 | b1 | 5 | b1 | 3 |
a1 | b2 | 6 | b2 | 7 |
a2 | b3 | 8 | b3 | 10 |
a2 | b3 | 8 | b3 | 2 |
,找两个表中,属性名一模一样的,而且域也要可比较,结果如下:
A | B | C | E |
a1 | b1 | 5 | 3 |
a1 | b2 | 6 | 7 |
a2 | b3 | 8 | 10 |
a2 | b3 | 8 | 2 |
知识储备:
悬浮元组:两个关系R和S在自然连接时,关系R和S中被舍弃的元组。
外连接:把悬浮元组舍弃的元组也保存在结果关系中,并且在其他属性上填空值(Null),这种连接叫外连接。
左外连接:只保留左边关系R中的悬浮元组叫做左外连接。
右外连接:只保留右边关系S中的悬浮元组叫做右外连接。
除:
给定关系R(X,Y)和S(Y,Z),其中X,Y,Z为属性组。R中的Y可以和S中的Y不同名,但是要出自同一个域。
R与S的除运算得到一个新的关系P(X),P是R中满足条件(条件为:元组在X上分量值x的象集Yx包含S在Y上投影的集合)的元组在X属性列上的投影。
理论太深奥,直接举例理解:
such as:求关系R,S的除运算R➗S,
R | ||
A | B | C |
a1 | b1 | c2 |
a2 | b3 | c7 |
a3 | b4 | c6 |
a1 | b2 | c3 |
a4 | b6 | c6 |
a2 | b2 | c3 |
a1 | b2 | c1 |
S | ||
B | C | D |
b1 | c2 | d1 |
b2 | c1 | d1 |
b2 | c1 | d2 |
R和S中都有B,C两个属性列,相当于定义中的Y。
R中的A属性列相当于定义中的X。
先找R中X属性值x的象集,即找不同x值所对应的其他属性列的值的集合。用表示,
然后在象集中,寻找能和S表中的Y属性值对上的象集。
S表中B,C属性值集合为
和对应,因此结果如下表:
R➗S |
A |
a1 |
5、关系演算
关系演算以数理逻辑中的谓词演算为基础。按谓词变元的不同,可以分为元组关系演算和域关系演算。
ALPHA
时间紧,等待后期更新……
三、SQL语句
1、基础概念
SQL(Structured Query Language),结构化查询语言,是关系数据库的标准语言。
SQL的特点:①综合统一;②高度非过程化;③面向集合的操作方式;④以同一种语法结构提供多种使用方式;⑤语言简洁,易学易用。
SQL支持关系数据库三级模式结构,其模式、外模式、内模式中的基本对象有模式表、视图和索引等。
SQL的数据定义功能包括模式定义、表定义、视图和索引的定义。
SQL不提供修改模式定义和修改视图定义的操作。如果想修改这些对象,只能删除重建。
操作对象 | 操作方式 | ||
创建 | 删除 | 修改 | |
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
知识储备:
(1)什么是基本表?
本身独立存在的表;SQL中一个关系就对应一个基本表;一个(或多个)基本表对应一个存储文件;一个表可以有若干索引。
(2)什么是存储文件?
逻辑结构组成了关系数据库的内模式;物理结构是任意的,对用户透明。
(3)什么是视图?
从一个或几个基本表导出的表;数据库中只存放视图的定义,不存放视图中的数据;视图是一个虚表;用户可以在视图上再定义视图。
2、模式的定义与删除
a. 模式的定义
CREATE SCHEMA 模式名 AUTHORIZATION 用户名;
//例如:为用户XSJ定义一个学生-课程模式S-T。
CREATE SCHEMA "S-T" AUTHORIZATION XSJ;
如果没有指定模式名,则模式名默认为用户名。
//默认模式名为用户名XSJ
CREATE SCHEMA AUTHORIZATION XSJ;
也可以在模式中直接创建表或视图或授权。
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> <表定义子句>;
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> <视图定义子句>;
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> <授权定义子句>;
//例如:为用户XSJ创建一个模式TEST,并在其中定义了一个表TAB1
CREATE SCHEMA TEST AUTHORIZATION XSJ
CREATE TABLE TAB1(COL1 SMALLINT,COL2 INT,COL3 CHAR(20),COL4 NUMERIC(10,3),COL5 DECIMAL(5,2));
执行创建模式语句需要拥有DBA权限。
b. 模式的删除
DROP SCHEMA <模式名> <CASCADE|RESTRICT>;
其中,CASCADE和RESTRICT必须二选一;
CASCADE是级联:删除模式的同时把该模式中所有的数据库对象删除;
RESTRICT是限制:如果该模式中定义了下属的数据库对象(例如表、视图等),则拒绝该删除语句的执行。如果该模式中没有定义下属的数据库对象,则执行删除语句。
//删除模式XSJ,并且删除该模式中定义的数据库对象
DROP SCHEMA XSJ CASCADE;
3、基本表的定义、删除、修改
a. 基本表的定义
定义表sql语句:
CREATE TABLE <表名> (<列名1> 数据类型 [列级完整性约束条件],
<列名2> 数据类型 [列级完整性约束条件],
……
[,表级完整性约束条件]);
/*如果完整性约束条件涉及该表的多个属性列,则必须定义在表级上,如果只涉及一个属性列,则既可以定义在列级也可以定义在表级。*/
such as:
/*例1*/
/*建立一个学生表Student,学号是主码,姓名取值唯一。*/
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
/*例2*/
/*创建一个课程表Course。*/
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40),
Cpno CHAR(4), /*Cpno是先修课
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)
/*Cpno是外码,被参照表是Course表,被参照列是Cno*/
);
/*例3*/
/*建立一个学生选课表SC。*/
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
/*主码由两个属性构成,涉及两个属性列,所以必须作为表级完整性进行定义*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/*表级完整性约束条件,Sno是外码,被参照表是Student*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*表级完整性约束条件,Cno是外码,被参照表Course*/
);
b. 数据类型
数据类型 | 含义 |
CHAR(n),CHARACTER(n) | 长度为n的定长字符串 |
VARCHAR(n),CHARCATERVARYING(n) | 最大长度为n的变长字符串 |
CLOB | 字符串大对象 |
BLOB |
二进制大对象 |
INT,INTEGER | 长整型(4个字节) |
SMALLINT | 短整型(2个字节) |
BIGINT | 大整数(8个字节) |
NUMERIC(p,d) | 定点数,由p位数字(不包括符号、小数点)组成,小数点后面有d位数字。 |
DECIMAL(p,d),DEC(p,d) | 同NUMERIC |
REAL | 取决于机器精度的单精度浮点数 |
DOUBLE PRECISION | 取决于机器精度的双精度浮点数 |
FLOAT(n) | 可选精度的浮点数,精度至少为n位数字 |
BOOLEAN |
逻辑布尔量 |
DATE | 日期,包含年月日,格式为YYYY-MM-DD |
TIME | 时间,包含一日的时分秒,格式为HH:MM:SS |
TIMESTAMP | 时间戳类型 |
INTERVAL | 时间间隔类型 |
c. 模式与表
每个基本表都属于某一个模式,一个模式包含多个基本表。
创建基本表时,如果没有指定模式,系统会根据搜索路径来确定该对象所属的模式。搜索路径包含一组模式列表,关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名。如果搜索路径中的模式名都不存在,系统将给出错误。
//设置指定模式的三种方法
/*第一种,在表中明显地给出模式名:*/
CREATE TABLE "S-T".Student(……);/*Student表所属的模式为S-T
CREATE TABLE "S-T".Course(……);/*Course表所属的模式为S-T
CREATE TABLE "S-T".SC(……);/*SC表所属的模式为S-T
/*第二种,也可以在创建模式的时候,创建表*/
/*例如:为用户XSJ创建一个模式TEST,并在其中定义了一个表TAB1*/
CREATE SCHEMA TEST AUTHORIZATION XSJ
CREATE TABLE TAB1(COL1 SMALLINT,COL2 INT,COL3 CHAR(20),COL4 NUMERIC(10,3),COL5 DECIMAL(5,2));
/*第三种,也可以设置搜索路径,再定义基本表*/
/*例如,建立了S-T.Student基本表*/
SET search_path TO "S-T",PUBLIC;
CREATE TABLE Student(……);
d. 修改基本表
ALTER TABLE <表名>
[ADD [COLUMN] <新列名><数据类型> [完整性约束]] /*增加一个新的列*/
[ADD <表级完整性约束>] /*增加表级完整性约束*/
[DROP [COLOMN] <列名> [CASCADE|RESTRICT]] /*删除列名,如果是CASCADE,则自动删除引用该列的其他对象,如果是RESTRICT,则如果该列被其他对象引用,将拒绝删除该列*/
[DROP CONTRAINT <完整性约束> [RESTRICT|CASCADE]] /*删除完整性*/
[ALTER COLUMN <列名><数据类型>] /*修改列名或数据类型*/
例如:
/*例1*/
/*向Student表中增加“入学时间S_entrance”列,其数据类型是日期型。*/
ALTER TABLE Student ADD S_entrance DATE;
/*不论基本表中原来是否有数据,新增加的列一律为空值。
所以不能加主码*/
/*例2*/
/*将Student表中年龄的数据类型由字符型改为整数型*/
ALTER TABLE Student ALTER COLUMN Sage INT;
/*例3*/
/*增加课程名称必须取唯一值的条件*/
ALTER TABLE Course ADD UNIQUE(Cname);
e. 删除基本表
DROP TABLE <表名>[RESTRICT|CASCADE];
/*RESTRICT,如果存在依赖该表的对象,则此表不能删除
CASCADE,如果表被删除,则依赖该表的对象也同时删除*/
/*基本表被删除了之后,表上的数据、建立的索引、视图、触发器等一般都会被删除。*/
例如:
/*删除Student表*/
DROP TABLE Student CASCADE;
4、索引的建立与删除
建立索引的目的:加快查询速度。
谁可以建立索引:DBA或建立表的人。
DBMS一般会自动建立PRIMARY KEY,UNIQUE列上的索引。
谁维护索引:DBMS自动完成。
使用索引:DBMS自动选择是否使用索引及使用哪些索引。
关系数据库管理系统RDBMS中索引一般采用B+树,HASH索引来实现。
B+树索引的优点:动态平衡;HASH索引的优点:查找速度快。
采用B+树还是HASH索引则由具体的RDBMS决定。
索引是关系数据库内部实现技术,属于内模式的范畴。
索引有唯一索引、非唯一索引(聚簇索引)。
a. 建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名> [<次序>] [, <列名> [<次序>]]……);
/*UNOQUE是唯一索引,表明此索引每一个索引值只对应唯一的数据。
CLUSTER是聚簇索引。*/
/*次序是指升序还是降序。升序为ASC,降序为DESC,默认为升序。*/
例如:
/*例1*/
/*为Student表,Course表,SC表建立索引。其中Student表按照学号升序建立唯一索引,Course表按课程号升序建议唯一索引,SC表按学号升序和课程号降序建立唯一索引。*/
CREATE UNIQUE INDEX Stusno ON Student(sno);
CREATE UNIQUE INDEX Coucno ON Course(cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
/*升序为ASC,降序为DESC,默认为升序。*/
/*例2*/
/*在Student表的Sname列上建立一个聚簇索引。*/
CREATE CLUSTER INDEX Stusname ON Student(Sname);
/*聚簇索引是指索引顺序与表中记录的物理顺序一致的索引组织。
在最经常查询的列上建立聚簇索引可以提高查询效率。
一个基本表上最多只能建立一个聚簇索引。
经常更新的列不适合建立聚簇索引。*/
b. 删除索引
DROP INDEX <索引名>;
/*删除索引时,系统会从数据字典中删去有关该索引的描述。
例如:
/*删除Student表的Stusname索引*/
DROP INDEX Stusname;
5、数据字典
数据字典是关系数据库管理系统内部的一组系统表。
记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
RDBMS执行SQL数据定义时,实际就是在更新数据字典。
6、数据查询
查询语句的一般格式为:
SELECT [ALL|DISTINCT] <目标表达式> [,<目标列表达式>]……
FROM <表明或视图名> [,<表名或视图名>……] | (<SELECT语句>)[AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
a. 单表查询
功能:对一个表的内容进行查询。
包含:①选择表中的若干列;②选择表中的若干元组;③ORDER BY 子句;④聚集函数;⑤GROUP BY子句;
选择表中的若干列:
/*查询全体学生的学号与姓名*/ /*选择两列*/
SELECT Sno,Sname FROM Student;
/*查询全体学生的姓名、学号和所在系*/ /*选择三列*/
SELECT Sname,Sno,Sdept FROM Student;
/*查询全体学生的详细信息*/ /*选择所有列*/
SELECT * FROM Student;
/*查询全体学生的姓名以及出生年份*/ /*查询经过计算的值*/
SELECT Sname,2023-Sage FROM Student;
/*Student表中只有年龄,没有年份,所以要放个表达式计算,
格式为:SELECT <目标表达式> FROM <表名>
<目标表达式>可以是列名、算术表达式、字符串常量、函数、列别名。
*/
/*查询全体学生的姓名、出生年份和所在系,系名要求小写字母表示*/ /*函数*/
SELECT Sname,2023-Sage,LOWER(Sdept) FROM Student;
/*使用列别名改变查询结果的列标题*/ /*列别名*/
SELECT Sname NAME,2023-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student;
/*效果是把Sname名字改成NAME,'2023-Sage'改成BIRTHDAY,Sdept改为DEPARTMENT进行输出。*/
选择表中的若干元组:
/*1、消除取值重复的行*/
/*(1)查询选修了课程的学生的学号*/
SELECT Sno FROM SC;
或
SELECT ALL Sno FROM SC;
/*如果没有指定DISTINCT关键词,则默认为ALL,
如果一个学生选了多个课,则会重复输出该学生的学号
*/
/*所以加个DISTINCT关键词即可*/
SELECT DISTINCT Sno FROM SC;
/*2、查询满足条件的元组*/
/*(1)查询计算机科学系全体学生的名字*/ /*比较*/
SELECT Sname FROM Student WHERE Sdept='CS';
/*(2)查询所有年龄在20岁以下的学生姓名及其年龄*/
SELECT Sname,Sage FROM Student WHERE Sage<20;
/*(3)查询考试成绩有不及格的学生的学号*/
SELECT DISTINCT Sno FROM SC WHERE Grade<60;
/*(4)查询年龄在20-23岁(包括20岁和23岁)之间学生的姓名、所在系和年龄。*/ /*确定范围*/
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
/*(5)查询年龄不在20-23岁之间学生的姓名、所在系和年龄。*/
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;
/*(6)查询计算机科学系(CS)、数学系(MA)、信息系(IS)学生的姓名和性别*/ /*确定集合*/
SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS','MA','IS');
/*(7) 查询即不是CS系、MA系,也不是IS系的学生的姓名和性别*/
SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN('CS','MA','IS');
/*(8)查询学号为123456789的学生的详细情况*/ /*字符匹配*/
SELECT * FROM Student WHERE Sno LIKE '123456789';
/*等价于*/
SELECT * FROM Student WHERE Sno='123456789';
/*(9)查询所有姓刘的学生的姓名、学号和性别*/
SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%';
/*模糊查询*/
/*通配符有%和_
'%'可以代表任意长度(长度可以为0)的字符串
'_'可以代表任意单个字符
*/
/*(10)查询姓"欧阳"且全名为三个汉字的学生的姓名*/
SELECT Sname FROM Student WHERE Sname LIKE '欧阳_';
/*(11)查询名字中第二个字为'阳'的学生的姓名和学号*/
SELECT Sname,Sno FROM Student WHERE Sname LIKE '_阳%';
/*(12)查询所有不姓刘的学生的姓名、学号和性别*/
SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE '刘%';
/*(13)查询DB_Design课程的课程号和学分*/ /*特殊情况:转义*/
SELECT Cno,Ccredit FROM SC WHERE Cname LIKE 'DB\_Design' ESCAPE'\';
/*DB_Design在LIKE里,会被误认为是通配符,需要转义。具体格式如上。*/
/*(14)查询以"DB_"开头,且倒数第三个字符为i的课程的详细情况*/
SELECT * FROM SC WHERE Cname LIKE 'DB\_%i__' ESCAPE'\';
/*(15)查询缺少成绩的学生的学号和课程号*/ /*涉及空值的查询*/
SELECT Sno,Cno FROM SC WHERE Grade IS NULL;
/*(16)查询所有有成绩的学生学号和课程号*/
SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;
/*(17)查询计算机科学系年龄在20岁以下的学生的姓名*/ /*多重条件查询*/
SELECT Sname FROM Student WHERE Sdept='CS' AND Sage<20;
/*AND和OR可以用来连接多个查询条件,AND的优先级大于OR,可以用括号改变优先级*/
WHERE子句常用的查询条件
查询条件 | 谓词 |
比较 | =,>,<,>=,<=,!=,<>,!>,!<,NOT加上述比较符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空值 | IS NULL,IS NOT NULL |
多重条件(逻辑运算) | AND,OR,NOT |
ORDER BY 子句:
ORDER BY子句可以按照一个或多个属性列排序。
升序:ASC;降序:DESC;默认为ASC;
当排序列含空值时,空值默认最大。
/*(1)查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列*/
SELECT Sno,Grade FROM SC WHERE Cno='3' ORDER BY Grade DESC;
/*(2)查询全体学生情况,查询结果按所在系的系号升序排序,同一系中的学生按年龄降序排列*/
SELECT * FROM Student ORDER BY Sdept ASC,Sage DESC;
聚集函数:
函数及形式 | 功能 |
COUNT([DISTINCT|ALL] *) | 统计元组个数 |
COUNT([DISTINCT|ALL] <列名>) | 统计一列中有多少个值 |
SUM([DISTINCT|ALL] <列名>) | 计算一列值的总和(此列必须是数值型) |
AVG([DISTINCT|ALL] <列名>) | 计算一列值的平均值(此列必须是数值型) |
MAX([DISTINCT|ALL] <列名>) | 求一列中值的最大值 |
MIN([DISTINCT|ALL] <列名>) | 求一列中值的最小值 |
/*(1)查询学生总人数*/
SELECT COUNT (*) FROM Student;
/*(2)查询选修了课程的学生人数*/
SELECT COUNT (DISTINCT Sno) FROM SC;
/*(3)计算选修1号课程的学生平均成绩*/
SELECT AVG(Grade) FROM SC WHERE Cno='1';
/*(4)查询选修1号课程的学生最高分数*/
SELECT MAX(Grade) FROM SC WHERE Cno='1';
注:①当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。
②WHERE子句中不能用聚集函数作为条件表达式,聚集函数只能用于SELECT子句和 GROUP BY中的HAVING子句。
GROUP BY子句:
作用是:按指定的一列或多列值分组,值相等的为一组,来细化聚集函数的作用对象。
注:①未对查询结果分组,聚集函数将作用于整个查询结果。
②对查询结果分组后,聚集函数将分别作用于每个组。
/*(1)求各个课程号及相应的选课人数*/
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
/*SELECT后面跟的要么是GROUP BY后面的列名,要么是跟聚合函数*/
/*(2)查询选修了3门以上课程的学生学号*/ /*HAVING短语*/
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>3;
/*WHERE子句作用于基本表或视图,从整个表中选择满足条件的元组*/
/*HAVING短语作用于组,从分的组中选择满足条件的组*/
/*(3)查询平均成绩大于等于90分的学生学号和平均成绩*/
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>=90;
/*先通过学号分组,找到每个学号对应的成绩,再通过HAVING去找平均成绩大于等于90的*/
b. 连接查询
等值与非等值连接查询:
连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,
其一般格式为以下两种:
/*第一种*/
[<表名1>.] <列名1><比较运算符> [<表名2>.] <列名2>
/*比较运算符主要有=,>,<,<=,>=,!=(或<>)*/
/*第二种*/
[<表名1>.] <列名1> BETWEEN [<表名2>.] <列名2> AND [<表名2>.] <列名3>
注:当连接运算符是‘=’时,称为等值连接,其他运算符为非等值连接。
各连接字段必须是可比的,名字可以不同。要么都是数字,要么都是字符。
/*(1)查询每个学生及其选修课程的情况*/
SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno=SC.Sno;
/*这种查询的结果为:
Student.Sno Sname Ssex Sage Sdept SC.Sno Cno Grade
Student.Sno和SC.Sno的值都一样,会有一列重复。因此需要自然连接*/
/*自然连接:在等值连接中把目标列中重复的属性列去掉,就称为自然连接*/
SELECT Student.*,SC.Cno,SC.Grade FROM Student,SC WHERE Student.Sno=SC.Sno;
自身连接:
一个表和它自己进行连接。
/*(1)查询每一门课的间接先修课(即先修课的先修课)*/
/*先为Course表起两个别名,一个叫FIRST,一个叫SECOND*/
SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno=SECOND.Cno;
外连接:
把悬浮元组(即不满足条件的元组)也保留在结果关系中。
外连接分为左外连接和右外连接。
左外连接,列出左边关系的所有元组;右外连接,列出右边关系的所有元组。
左外连接,LEFT OUT JOIN SC ON
右外连接,RIGHT OUT JOIN SC ON
/*还是刚刚那个例子*/
/*(1)查询每个学生及其选修课程的情况*/
SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno=SC.Sno;
/*这种查询的结果为:
Student.Sno Sname Ssex Sage Sdept SC.Sno Cno Grade
Student.Sno和SC.Sno的值都一样,会有一列重复。因此需要自然连接*/
/*自然连接:在等值连接中把目标列中重复的属性列去掉,就称为自然连接*/
SELECT Student.*,SC.Cno,SC.Grade FROM Student,SC WHERE Student.Sno=SC.Sno;
/*用外连接查询*/
/*要输出所有学生的选修情况,那学生表的内容是全部都要输出的,所以左外连接*/
SELECT Student.*,SC.Cno,SC.Grade FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);
多表连接:
两个表以上进行连接。
/*(1)查询每个学生的学号、姓名、选修的课程名及成绩*/ /*涉及三个表*/
SELECT Student.Sno,Student.Sname,Course.Cname,SC.Grade FROM Student,Course,SC WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
c. 嵌套查询
一个查询块:一个SELECT-FROMWHERE语句。
嵌套查询:把一个查询块嵌套在另一个查询块的WHERE子句中或者HAVING短语的条件中的查询。
注:①子查询中不能使用ORDER BY子句。
②层层嵌套方式反映了SQL语言的结构化。
③有些嵌套查询可以用连接运算代替。
④上层的查询块称为外层查询或父查询;下层查询块称为内层查询或子查询。
子查询可以分为两类,不相关子查询和相关子查询。
不相关子查询:子查询的查询条件不依赖于父查询;相关子查询:子查询的查询条件依赖于父查询。
/*(1)查询与“刘晨”在同一个系的学生*/ /*带有IN谓词的子查询*/
/*第一步,先确定刘晨所在的系
SELECT Sdept FROM Student WHERE Sname='刘晨';
/*结果为CS*/
/*第二步,查找所有在CS系的学生
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept='CS';*/
/*合并在一起写*/
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='刘晨');
/*也可以用自身连接去写*/
SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname='刘晨';
/*(2)查询与'刘晨'在同一个系的学生*/ /*带有比较运算符的子查询
/*改写成*/
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept = (SELECT Sdept FROM Student WHERE Sname='刘晨');
/*把IN换成=*/
/*(3)找出每个学生超过刘晨选修课程平均成绩的课程号*/
SELECT Cno FROM SC WHERE Grade>(SELECT AVG(Grade) FROM SC WHERE Sno =(SELECT Sno FROM Student WHERE Sname='刘晨'));
/*此处正确性有待验证,个人认为书本有错误,因为不知道刘晨的学号,所以要先在Student表中找到姓名对应的学号*/
/*(4)查询非CS系中比计算机科学任意一个学生年龄小的学生姓名和年龄*/ /*带有ALL或ANY谓词的子查询*/
SELECT Sname,Sage FROM Student WHERE Sage< ANY(SELECT Sage FROM Student WHERE Sdept='CS') AND Sdept !='CS';
/*(5)查询非CS系中比计算机科学所有学生年龄都小的学生姓名和年龄*/
SELECT Sname,Sage FROM Student WHERE Sage< ALL(SELECT Sage FROM Student WHERE Sdept='CS') AND Sdept !='CS';
/*(6)查询所有选修了1号课程的学生姓名*/ /*带有EXISTS谓词的子查询*/
/*
博主要废了,我先摸会儿鱼🐟
*/
7、数据更新
a. 插入数据
包含插入元组、插入子查询结果。
插入元组:
INSERT INTO <表名> [(<属性列1>[,<属性列2>]……)] VALUES (<常量1> [,<常量2>]……);
/*(1)插入一个新学生元组插入到Student表中,(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)*/
INSERT INTO Student (Sno,Sname,Ssex,Sdept,Sage) VALUES ('201215128','陈冬','男','IS',18);
/*如果不写列名,将会一一对应插入*/
INSERT INTO Student VALUES('201215128','陈冬','男','IS',18);/*和上面的SQL语句效果一样*/
/*(2)插入一条选课记录('201215128','1')*/
/*SC表中有三个属性列,学号,课程号,成绩。这条记录缺少成绩*/
/*有两种写法*/
INSERT INTO SC VALUES('201215128','1',NULL);
/*或者*/
INSERT INTO SC (Sno,Cno) VALUES('201215128','1');/*会自动给Grade赋空值*/
插入子查询结果:
INSERT INTO <表名> [(<属性列1> [,<属性列2>……]) 子查询;
/*SELECT子句目标列必须和INTO子句匹配,值的个数和类型必须一致*/
/*(1)对于每一个系,求学生的平均年龄,并把结果存入数据库中*/
/*先建表,一列存放系名,一列存放相应的学生平均年龄*/
CREATE TABLE Dept_age (Sdept CHAR(15) Avg_age SMALLINT);
/*然后对Student表按系分组求平均年龄,再把系名和平均年龄存入新表中*/
INSERT INTO Dept_age(Sdept,Avg_age) SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept;
b. 修改数据
UNDATE <表名> SET <列名>=<表达式> [,<列名>=<表达式>]…… [WHERE <条件>];
/*修改指定表中满足WHERE子句条件的元组*/
/*SET子句:指定修改方式,修改的列,修改后取值
WHERE子句:指定要修改的元组,如果没写WHERE,则默认修改所有元组
在执行修改语句的时候,会检查修改操作是否破坏了表上已定义的完整性规则
*/
/*(1)将学生201215121的年龄改为22岁*/ /*修改某一个元组的值*/
UPDATE Student SET Sage=22 WHERE Sno='201215121';
/*(2)将所有学生的年龄都增加1*/ /*修改多个元组的值*/
UPDATE Student SET Sage=Sage+1;
/*(3)将CS系全体学生的成绩置0*/ /*带子查询的修改语句*/
UPDATE SC SET Grade=0 WHERE Sno IN(SELECT Sno FROM Student WHERE Sdept='CS');
c. 删除数据
DELETE FROM <表名> [WHERE <条件>];
/*删除指定表中满足WHERE子句条件的元组*/
WHERE子句:指定要删除的元组,若没写,表示要删除表中所有元组,但表仍然存在,只是删除数据*/
/*(1)删除学号为200215128的学生记录*/ /*删除某一个元组的值*/
DELETE FROM Student WHERE Sno='200215128';
/*(2)删除所有学生的选课记录*/ /*删除多个元组的值*/
DELETE FROM SC;
/*(3)删除CS系所有学生的选课记录*/ /*带子查询的删除语句*/
DELETE FROM SC WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept='CS');
8、空值的处理
以下几种情况可以取空值:
①该属性应该有一个值,但目前还不知道它的具体值。
②该属性不应该有值。
③由于某种原因,不便于书写。
空值的判断:
/*(1)从Student表中找出漏填的学生信息*/
SELECT * FROM Student WHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL;
/*判断一个属性的值是否为空值,用IS NULL 或IS NOT NULL判断*/
空值的约束条件:
①属性定义中有NOT NULL约束条件,则不能取空值。
②加了UNIQUE限制的属性不能取空值。
③码属性不能取空值。
空值的运算:
包含算术运算、比较运算、逻辑运算。
空值与另一个值(包括另一个空值)的算术运算的结果为空值;
空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN;
逻辑运算如下表所示:
x y | x AND y | x OR y | NOT x |
T T | T | T | F |
T U | U | T | F |
T F | F | T | F |
U T | U | T | U |
U U | U | U | U |
U F | F | U | U |
F T | F | T | T |
F U | F | U | T |
F F | F | F | T |
/*(1)找出选修1号课程的不及格的学生以及缺考的学生*/
SELECT Sno FROM SC WHERE Cno='1' AND (Grade<60 OR Grade IS NULL);
9、视图的操作
视图的特点:
①视图是虚表。是从一个或几个基本表(或视图)导出的表。
②只存放视图的定义,不存放视图对应的数据。
③表中的数据发生变化,视图中查询出的数据也随之变化。
基于视图的操作包含:查询、删除、受限更新、定义基于该视图的新视图。
视图的作用:
①视图能够简化用户的操作。
②视图使用户能以多种角度看待同一数据。
③视图对重构数据库提供了一定程度的逻辑独立性。
④视图能够对机密数据提供安全保护。
⑤适当利用视图可以更清晰地表达查询。
a. 建立视图
CREATE VIEW <视图名> [(<列名> [,<列名>]……)] AS <子查询> [WITH CHECK OPTION];
/*这里的列名指的是,组成视图的属性列名:全部省略或全部指定
子查询里不允许包含ORDER BY子句和DISTINCT短语
RDBMS执行CREATE VIEW语句时,只是把视图定义存入数据字典,并不执行其中的SELECT语句
在对视图查询时,按视图的定义从基本表中将数据查询出来*/
/*(1)建立信息系学生的视图*/
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS';
/*(2)建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生*/
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS' WITH CHECK OPTION;
/*加个WITH CHECK OPTION时,相当于自动在修改、插入、删除操作上加上Sdept='IS'的条件*/
/*(3)建立信息系选修了1号课程的学生视图*/
CREATE VIEW IS_S1 (Sno,Sname,Grade) AS SELECT Student.Sno,Sname,Grade FROM Student.SC WHERE Sdept='IS' AND Student.sno=SC.Sno AND SC.Cno='1';
/*先行跳过吧,等待后续更新,博主想摸会儿🐟…………暂时更新到SQL(14)*/
四、数据库安全性
1、基础概论
数据库的安全性是指,保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
数据库的不安全因素:
①非授权用户对数据库的而恶意存取和破坏。(针对这点,数据库管理系统提供的安全措施主要有用户身份鉴别、存取控制、视图等)
②数据库中重要或敏感的数据被泄露。(针对这点,数据库管理系统提供的主要技术有强制存取控制、数据库加密存储、加密传输等)
③安全环境的脆弱性。
TCSEC/TDI从安全策略、责任、保证、文档四个方面描述安全性级别划分。
2、数据库安全性控制
数据库安全性主要包括,用户身份鉴别、多层存取控制、审计、视图、数据加密等安全技术。
用户身份鉴别是数据库管理系统提供的最外层安全保护措施。
常用的身份鉴别方法有:静态口令鉴别;动态口令鉴别;生物特征鉴别;智能卡鉴别。
存取控制机制主要包括,用户权限和合法权限检查两部分。
授权:授予与收回
在SQL中使用GRANT和REVOKE语句向用户授予或收回对数据的操作权限;GRANT语句向用户授予权限,REVOKE语句收回已经授予用户的权限。
/*GRANT*/
/*一般格式*/
GRANT <权限> [,<权限>]……
ON <对象类型> <对象名> [,<对象类型> <对象名>]……
TO <用户> [,<用户>]……
[WITH GRANT OPTION];
/*发出DRANT法人可以是数据库管理员、数据库对象创建者、拥有该权限的用户
接受权限的用户可以是一个或多个具体用户、PUBLIC(即全体用户)
WITH GRANT OPTION子句,如果有这个子句则表示该权限可以再授予给其他用户;如果没有这个子句,则表示该权限不可以再授予给其他用户
SQL标准不允许玄循环授权
*/
/*(1)把查询Student表的权限授给用户U1*/
GRANT SELECT ON TABLE Student TO U1;
/*(2)把对Student表和Course表的全部操作权限授予给用户U2和U3*/
GRANT ALL PRIVILEGES ON TABLE Student,Course TO U2,U3;
/*(3)把对表SC的查询权限授予给所有用户*/
GRANT SELECT ON TABLE SC TO PUBLIC;
/*(4)把查询Student表和修改学生学号的权限授给用户U4*/
GRANT SELECT,UPDATE(Sno) ON TABLE Student TO U4;
/*(5)把对表SC的INSERT权限授给U5用户,并允许将此权限再授予给其他用户*/
GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION;
/*REVOKE*/
/*一般格式:*/
REVOKE <权限> [,<权限>]……
ON <对象类型> <对象名> [,<对象类型> <对象名>]……
FROM <用户> [,<用户>]……[CASCADE|RESTRICT];
/*授予的权限可以由数据库管理员或其他授权者用REVOKE收回*/
/*(1)把用户U4修改学生学号的权限收回*/
REVOKE UPDATE(Sno) ON TABLE Student FROM U4;
/*(2)收回所有用户对表SC的查询权限*/
REVOKE SELECT ON TABLE SC FROM PUBLIC;、
/*(3)收回用户U5对SC表的INSERT权限*/
/*因为在GRANT例子中,U5把权限给了U6和U7,因此要把这些权限一并收回,用级联CASCADE*/
REVOKE INSERT ON TABLE SC FROM U5 CASCADE;
对创建数据库模式之类的数据库对象的授权,由数据库管理员在创建用户时实现。
CREATE USER <username> [WITH] [DBA|RESOURCE|CONNECT];
/*只有系统的超级用户才有权限创建一个新的数据库用户
新创建的数据库用户只有三种权限,DBA、RESOURCE、CONNECT.
DBA可以创建用户、创建模式、创建表,可以登录数据库,执行数据查询和操纵。
RESOURCE不可以创建用户、不可以创建模式、可以创建表,可以登录数据库,执行数据查询和操纵。
CONNECT不可以创建用户、不可以创建模式、不可以创建表,可以登录数据库,只有在有授权的情况下才能登录数据库,执行数据查询和操纵
*/
/*CREATE USER语句不是SQL标准,所以不同的数据库管理系统的语法和内容都不一样。
数据库角色是一组被命名的与数据库操作相关的权限。
在SQL中,先用CREATE ROLE语句创建角色,再用GRANT语句给角色授权,再用REVOKE收回权限。