第4章SQL语言
SQL语言概貌及特点
SQL语言概述
SQL:Structured Query Language,结构化查询语言
SEQUEL:Structured English Query language
一种介于关系代数与关系演算之间的语言
成为关系数据库的标准语言
支持:System R、SQL/DS、Oracle、Informix、Sybase、INGRES、DB2、FoxPro、Access
SQL语言的功能
查询
定义:DDL(Data Definition Language)语言
操纵:DML(Data Manipulation Language)语言
控制:DCL(Data Control Language)语言
SQL语言的标准化
SQL86
由ANSI(American National Standard Institute,美国国家标准局)于1986年10月公布
ISO(International Standardization Organization,国际标准化组织)于1987年通过
数据定义语言
数据操纵语言
模块语言
嵌入式语法
SQL89
ISO于1989年公布
增加简单的完整性描述语句
SQL92
ISO于1992年公布
也称SQL2
SQL3
酝酿中的新标准
增加面向对象功能
SQL语言支持的三级逻辑结构☆
基本表(Base Table)
数据库中实际独立存在的表(关系),存储在实际的文件中
不是由其他表导出
存储文件
存储基本表的数据
视图(View)
虚拟表
换个角度看实际表的结果
由一个或几个基本表导出
没有实际的存储位置
S(S#,SN,AGE,SEX,DEP)→CS_S(S#,SN,AGE,SEX)
库中只保存视图的定义,不存放对应的数据
SQL语言的主要特点
综合统一
操作一体化:查询、操作、定义、控制
高度非过程化
用户→“干什么”
RDBMS→“怎么干”
隐蔽数据的存取路径
面向集合的操作方式
操作对象是一个或多个关系
操作结果也是一个新关系
以同一种语法结构提供两种使用方式
自含型:DBMS中独立使用,针对DB的所有用户
宿主型:嵌入到宿主语言中使用,针对应用程序员
两种类型的语法结构基本一致
语言简洁,易学易用
类似于英语的自然语言
操作谓词少
SQL数据查询功能
概述
检索、搜索、查找
对现成的基本表(关系)和视图(虚表)进行数据查询
不改变数据本身
SQL语言的格式☆
SQL结果的转向(VFP)☆
缺省:输出到临时窗口
TO SCREEN:屏幕输出
TO <FileName>:输出到TXT文件
INTO TABLE <TableName>:输出到表
单表查询
投影查询SELECT
查询指定列
查询学生的姓名、年龄和性别
SELECT Sn,Age,Sex FROM Student
查询学生选修课的课程号**
SELECT Cno FROM Sc
SELECT DISTINCT Cno FROM Sc
查询全部列
查询全体学生的详细记录
SELECT * FROM Student
按人为次序显示全体学生的详细记录
SELECT Sn,Dept,Age,Sex,Sno FROM Student
查询经过计算的值
查询全体学生的出生年份
SELECT Sn,2002-Age FROM Student
以小写字母显示系名
SELECT Sn,LOWER(Dept) FROM Student
列标题使用别名
查询全体学生的出生年份,并使用别名
SELECT Sn Name,2002-Age Birthday FROM Student
选取查询WHERE
比较大小:(NOT) 比较运算符
查询学习了课程C2的学生
SELECT * FROM Sc WHERE Cno=’C2’
查询年龄大于19的学生
SELECT * FROM Student WHERE Age>19
SELECT * FROM Student WHERE NOT Age<=19
多重条件查询:AND / OR
查询课程号为C2且成绩高于85分以上的学生
SELECT * FROM Sc WHERE Cno=’C2’ AND G>85
查询选修C1或C2且不低于70分的学生
SELECT * FROM Sc WHERE (Cno=’C1’ OR Cno=’C2’) AND G>=70
确定范围:(NOT) BETWEEN AND
查询成绩在60至75之间的学生
SELECT * FROM Sc WHERE G>=60 AND G<=75
SELECT * FROM Sc WHERE G BETWEEN 60 AND 75
消除重复的行:DISTINCT
查询选修了课程C1或C2的学号
SELECT Sno FROM Sc WHERE Cno=’C1’ OR Cno=’C2’
SELECT DISTINCT Sno FROM Sc WHERE Cno=’C1’ OR Cno=’C2’
DISTINCT与ALL(默认)对应
确定集合:(NOT) IN
查询选修了课程C1或C2的学号
SELECT DISTINCT Sno FROM Sc WHERE Cno=’C1’ OR Cno=’C2’
SELECT DISTINCT Sno FROM Sc WHERE Cno IN (‘C1’,’C2’)
查询既不是计算机系,也不是数学系的学生
SELECT * FROM Student WHERE Dept NOT IN ('CS','MA')
SELECT * FROM Student WHERE NOT Dept IN ('CS','MA')
字符匹配(模糊查询):(NOT) LIKE
查询计算机系的学生
SELECT * FROM Student WHERE Dept = 'CS'
SELECT * FROM Student WHERE Dept LIKE 'CS'
查询不以P开头的课程
SELECT * FROM Course WHERE Cn NOT LIKE 'P%'
%(百分号):代表任意0-n个字符
_(下划线):代表任意1个字符
查询第二个字符为o的课程
SELECT * FROM Course WHERE Cn LIKE '_o%'
查询姓赵的学生(汉字?)
SELECT * FROM Student WHERE Sn LIKE '赵%'
SELECT * FROM Student WHERE Sn LIKE '赵_'
涉及空值的查询:IS (NOT) NULL
查询没填的课程名?
SELECT * FROM Course WHERE Cn IS NULL
SELECT * FROM Course WHERE LEN(TRIM(Cn))=0
排序查询ORDER BY
查询选修了C1的学生,成绩按降序排列
SELECT * FROM Sc WHERE Cno=’C1’ ORDER BY G DESCENDING
DESCENDING降序,ASC升序(默认)
查询学号为S1、S3和S5的学生,年龄按升序排列
SELECT * FROM Student WHERE Sno=’S1’ OR Sno=’S3’ OR Sno=’S5’ ORDER BY Age
SELECT * FROM Student WHERE Sno IN (’S1’,’S3’,’S5’) ORDER BY Age
按系显示学生,同系学生按年龄从大到小排列
SELECT * FROM Student ORDER BY Dept,Age DESCENDING
库函数(集函数)查询
库函数
AVG:按列计算平均值,对数值有效
SUM:按列计算值的总和,对数值有效
COUNT:按列值计个数,用DISTINCT消去重复行
COUNT *:统计元组个数,用DISTINCT消去重复行
MAX:在列中找出最大值
MIN:在列中找出最小值
求计算机系学生的平均年龄
SELECT AVG(Age) FROM Student WHERE Dept='CS'
求S3学生的总分和平均分
SELECT SUM(G),AVG(G) FROM Sc WHERE Sno='S3'
求计算机系的学生总数
SELECT COUNT(Sno) FROM Student WHERE Dept='CS'
SELECT COUNT(*) FROM Student WHERE Dept='CS'
查询共有几个系
SELECT COUNT (*) FROM Student
SELECT COUNT (Dept) FROM Student
SELECT COUNT (DISTINCT Dept) FROM Student
求课程C1的最高分和最低分以及高低分之间的差距
SELECT MAX(G),MIN(G),MAX(G)-MIN(G) FROM Sc WHERE Cno=’C1’
分组查询GROUP BY
语句
分组子句GROUP BY
分组条件HAVING,去掉不符合条件的若干组
查询各个课程的选修人数
SELECT Cno,COUNT(*) FROM Sc GROUP BY Cno
查询出至少选修了4门课程的学号和门数
SELECT Sno,COUNT(*) FROM Sc GROUP BY Sno
SELECT Sno,COUNT(Sno) FROM Sc GROUP BY Sno HAVING COUNT(Sno)>=4
求选课在4门以上的平均成绩,不统计不及格的课程,按降序排列总成绩
SELECT Sno,AVG(G) Average FROM Sc WHERE G>=60 GROUP BY Sno HAVING COUNT(*)>=4 ORDER BY Average DESCENDING
SELECT Sno,AVG(G) FROM Sc WHERE G>=60 GROUP BY Sno HAVING COUNT(*)>=4 ORDER BY 2 DESCENDING
求解过程
FROM:指明操作对象
WHERE:选取
GROUP:分组
HAVING:选组
SELECT:投影
ORDER:排序
连表查询
等值连接
查询每个学生及其选修课程的情况
SELECT Student.*,Sc.* FROM Student,Sc
SELECT Student.*,Sc.* FROM Student,Sc WHERE Student.Sno=Sc.Sno
SELECT Student.Sno,SN,Sex,Age,Dept,Cno,G FROM Student,Sc WHERE Student.Sno=Sc.Sno
复合条件连接
查询“张三”的成绩
SELECT Cno,G FROM Student,Sc WHERE Student.Sno=Sc.Sno AND Sn=’张三’
查询所有学生选修的课程名和成绩
SELECT Sn,Cn,G FROM Student,Course,Sc WHERE Student.Sno=Sc.Sno AND Course.Cno=Sc.Cno
自身连接
查询所有比“周八”大的姓名和年龄
SELECT X.Sn,X.Age FROM Student X,Student Y WHERE X.Age>Y.Age AND Y.Sn='周八'
子查询块嵌套查询
概念
嵌套查询是SQL结构化的体现
内部查询(内层查询、子查询)、外部查询(外层查询、父查询、主查询)
子查询不能使用ORDER
带有IN谓词的子查询
查询和“吴二”同岁的学生
SELECT Age FROM Student WHERE Sn=’吴二’
SELECT Sn,Age FROM Student WHERE Age=18
SELECT Sn,Age FROM Student WHERE Age IN (SELECT Age FROM Student WHERE Sn=’吴二’)
SELECT X.Sn,X.Age FROM Student X,Student Y WHERE X.Age=Y.Age AND Y.Sn='吴二'
SELECT Y.Sn,Y.Age …?
查询选修了数学课的学生姓名
SELECT Cno FROM Course WHERE Cn='Maths'
SELECT Sno FROM Sc WHERE Cno='C1'
SELECT Sn FROM Student WHERE Sno IN ('S1','S2','S6','S3','S4')
SELECT Sn FROM Student WHERE Sno IN (SELECT Sno FROM Sc WHERE Cno='C1')
SELECT Sn FROM Student WHERE Sno IN (SELECT Sno FROM Sc WHERE Cno IN(SELECT Cno FROM Course WHERE Cn='Maths'))
VFP6不能嵌套两层?!
SELECT Sn FROM Student WHERE Sno IN (SELECT Sno FROM Sc,Course WHERE Sc.Cno=Course.Cno AND Cn='Maths')
SELECT Sn FROM Student,Sc,Course WHERE Cn='Maths' AND Student.Sno=Sc.Sno AND Sc.Cno=Course.Cno
查询没有选修C2课程的学生姓名
SELECT Sn FROM Student WHERE Sno NOT IN (SELECT Sno FROM Sc WHERE Cno='C2')
带有比较运算符的子查询
查询和“吴二”同岁的学生
SELECT Sn,Age FROM Student WHERE Age IN (SELECT Age FROM Student WHERE Sn=’吴二’)
SELECT Sn,Age FROM Student WHERE Age =(SELECT Age FROM Student WHERE Sn=’吴二’)
查询选修了数学课的学生姓名
SELECT Sn FROM Student WHERE Sno IN (SELECT Sno FROM Sc WHERE Cno IN(SELECT Cno FROM Course WHERE Cn='Maths'))
VFP6不能嵌套两层!
SELECT Sn FROM Student WHERE Sno IN (SELECT Sno FROM Sc WHERE Cno =(SELECT Cno FROM Course WHERE Cn='Maths'))
带有ANY或ALL谓词的子查询
查询选修了C2的学生姓名
SELECT Sn FROM Student,Sc WHERE Student.Sno=Sc.Sno AND Cno='C2'
{16345}
SELECT Sn FROM Student WHERE Sno IN (SELECT Sno FROM Sc WHERE Cno='C2')
{13456}
SELECT Sn FROM Student WHERE Sno=ANY(SELECT Sno FROM Sc WHERE Cno='C2')
{13456}
查询选修了C2的学生中成绩最高的学号
SELECT Sno,MAX(G) FROM Sc WHERE Sno IN (SELECT Sno FROM Sc WHERE Cno='C2')
SELECT Sno FROM Sc WHERE Cno='C2' AND G >= (SELECT MAX(G) FROM Sc WHERE Cno='C2')
SELECT Sno FROM Sc WHERE Cno='C2' AND G>= ALL(SELECT G FROM Sc WHERE Cno='C2')
SELECT X.Sno,MAX(X.G) FROM Sc X,Sc Y WHERE X.Sno=Y.Sno AND Y.Cno='C2'
ANY,ALL与集函数的对应关系☆
带有EXISTS谓词的子查询
查询选修了C2的学生姓名
SELECT Sn FROM Student,Sc WHERE Student.Sno=Sc.Sno AND Cno='C2'
SELECT Sn FROM Student WHERE Sno=ANY(SELECT Sno FROM Sc WHERE Cno='C2')
SELECT Sn FROM Student WHERE EXISTS (SELECT * FROM Sc WHERE Cno='C2')
SELECT Sn FROM Student WHERE EXISTS (SELECT * FROM Sc WHERE Cno='C2' AND Sno=Student.Sno)
查询没有选修C2课程的学生姓名
SELECT Sn FROM Student WHERE NOT EXISTS (SELECT * FROM Sc WHERE Cno='C2' AND Sno=Student.Sno)
并交差集合查询
概述
并操作UNION
交操作INTERSECT
差操作MINUS
查询选修了C2或C3课程的学生
SELECT Sno,Cno FROM Sc WHERE Cno='C2'
SELECT Sno,Cno FROM Sc WHERE Cno='C3'
SELECT Sno,Cno FROM Sc WHERE Cno='C2' UNION SELECT Sno,Cno FROM Sc WHERE Cno='C3'
SELECT Sno FROM Sc WHERE Cno='C2' UNION SELECT Sno FROM Sc WHERE Cno='C3'
SELECT Sno,Cno FROM Sc WHERE Cno='C2' OR Cno='C3'
将Student和Student1两表合并
SELECT Sno,Sn,Sex FROM Student UNION SELECT Sno,Sn,Sex FROM Student1
差|交操作
标准SQL中没有直接提供集合的差和交操作,但可以用其他方法实现
查询至少选修了C2和C3的学生
SELECT Sno FROM Sc WHERE Cno='C2' AND Sno IN (SELECT Sno FROM Sc WHERE Cno='C3')
SQL查询小结
SELECT查询的一般格式☆
SELECT [ALL | DISTINCT] <目标列表表达式> [别名] [, <目标列表表达式> [别名]]…FROM <表/视图> [别名][,<表/视图> [别名]]…[WHERE <条件表达式>][GROUP BY <列名1>] [HAVING <条件>]][ORDER BY <列名2> [ASC | DESCENDING]]
SELECT中<目标列表达式>的格式☆
*
<表名>.*
<集函数> ([DISTINCT | ALL] *)
集函数:SUM、AVG、COUNT、MAX、MIN
[<表名.]<属性列名表达式> [, [<表名>.]<属性列名表达式>]…
WHERE中<条件表达式>的格式☆
<属性列名> ? <属性列名> | <常量> | [ANY/ALL] (SELECT语句)
<属性列名> [NOT] BETWEEN <属性列名> | <常量> | (SELECT语句) AND <属性列名> | <常量> | [ANY/ALL] (SELECT语句)
<属性列名> [NOT] IN (<值1> [,<值2>…]) | (SELECT语句)
<属性列名> [NOT] LIKE <匹配串>
<属性列名> IS [NOT] NULL
[NOT] EXISTS (SELECT语句)
<条件表达式> AND | OR <条件表达式> (AND | OR <条件表达式>…)
SQL数据定义功能
概述
SQL DDL(Data Definition Language)语言
定义和撤消的数据对象
用户
基本表
视图
索引
定义用户
VFP5/6不支持
建立数据库用户CREATE USER
格式:CREATE USER <用户名> IDENTIFIED BY <口令>
例子:CREATE USER zhang IDENTIFIED BY 0ffice2K
更改用户口令ALTER USER
格式:ALTER USER <用户名> IDENTIFIED BY <口令>
例子:ALTER USER zhang IDENTIFIED BY Windows2K
删除用户DROP USER
格式:DROP USER <用户名>
例子:DROP USER zhang
定义基本表
定义基本表CREATE TABLE
格式
CREATE TABLE <表名> (<列名> <数据类型> [列级完整性约束条件][,<列名> <数据类型> [列级完整性约束条件]…][,<表级完整性约束条件>]
数据类型(VFP)☆
列级完整性约束条件
NULL | NOT NULL
CHECK Expression [ERROR MessageText]
DEFAULT Expression
PRIMARY KEY | UNIQUE
REFERENCES TableName [TAG TagName]
FOREIGN KEY eExpression4 TAG TagName4 [NODUP
例子
CREATE TABLE Student2 (Sno CHAR(10) NOT NULL UNIQUE,Sn CHAR(10), Sex CHAR(2) DEFAULT ‘M’, Age NUMBER(4), Dept CHAR(10))
CREATE TABLE salesman (SalesID c(6) PRIMARY KEY, SaleName C(20))
CREATE TABLE customer ; (SalesID c(6), ; CustId i PRIMARY KEY, CustName c(20) UNIQUE, SalesBranch c(3), FOREIGN KEY SalesId TAG SalesId REFERENCES salesman)
CREATE TABLE orders ; (OrderId i PRIMARY KEY, ; CustId i REFERENCES customer TAG CustId, ; OrderAmt y(4), ; OrderQty i DEFAULT 10 ; CHECK (OrderQty > 9) ERROR "Order Quantity must be at least 10", ; DiscPercent n(6,2) NULL DEFAULT .NULL., ; CHECK (OrderAmt > 0) ERROR "Order Amount Must be > 0" )
修改基本表ALTER TABLE
修改内容
增加新的属性
修改原有的列定义
修改完整性约束条件
格式
ALTER TABLE <表名> [ADD <新列名> <数据类型> [完整性约束]][DROP <完整性约束>][ALTER <列名><数据类型>]
例子
ALTER TABLE customer ADD COLUMN fax c(20) NULL
ALTER TABLE customer ADD PRIMARY KEY cust_id TAG cust_id
ALTER TABLE customer ALTER COLUMN cust_id c(5) PRIMARY KEY
ALTER TABLE orders ALTER COLUMN orderqty SET CHECK orderqty >= 0 ERROR "Quantities must be non-negative"
ALTER TABLE orders ADD FOREIGN KEY custid TAG cust_id REFERENCES customer
ALTER TABLE orders ALTER COLUMN orderqty DROP CHECK
ALTER TABLE orders DROP FOREIGN KEY TAG cust_id SAVE
ALTER TABLE customer ADD COLUMN fax2 c(20) NOT NULL
ALTER TABLE customer ALTER COLUMN fax2 NULL ALTER COLUMN fax2 SET DEFAULT .NULL.
ALTER TABLE customer DROP COLUMN fax2
重命名基本表RENAME TABLE
格式
RENAME TABLE <旧表名> TO <新表名>
例子
RENAME TABLE Student2 TO Stud2
RENAME Student2 TO Stud2 ???
删除基本表DROP TABLE
删除什么
基本表的结构
数据
索引
不删视图,但视图无法使用
格式
DROP TABLE <表名>
例子
DROP TABLE Stud2
定义视图
什么是视图
虚表
从一个或几个基本表(或视图)导出的表
用户的外视图由基本表和视图组成
只保存视图的定义,不存放视图的数据
以多种角度观察数据库中的数据
通过视图这样的窗口,看到数据库中用户感兴趣的数据
视图的操作
定义
查询
更新
删除
在上面再定义视图
视图的优点(用途)
简化用户的操作
能够为复杂的查询构造视图
能够隐藏数据的复杂性
从而有效地简化查询操作
以多种角度看待同一数据
使不同目的的用户共享同一个数据库
减少冗余
提供了一定的逻辑独立性
通过构造视图,能够在用户和应用程序与实际的基本表之间提供更好的数据独立性
安全保护机密数据
能够将对数据库的访问限制在一定的范围内
有利于数据的保密
定义视图CREATE SQL VIEW
格式
CREATE SQL VIEW <视图名> [(<视图列的列表>)] AS <查询块/子查询>
说明
<查询块>
视图由查询块的查询结果来定义
任意复杂的SELECT语句
查询块不许排序(ORDER BY)
<视图列的列表>
省略
包含查询块的所有字段
指定
有公共列名时需指定列名
有表达式或库函数时需指定列名
启动新列名
例子
创建一个有关计算机系学生情况的视图CS_S
CREATE SQL VIEW CS_S AS SELECT Sno,Sn,Age,Sex FROM Student WHERE Dept=’CS’
创建一个有关学生成绩情况的视图S_SC_C
CREATE SQL VIEW S_SC_C AS SELECT Sn,Cn,G FROM Student,Course,Sc WHERE Student.Sno=Sc.Sno AND Sc.Cno=Course.Cno
VFP不能指定视图列名?!
创建一个有关学生平均成绩的视图AVGG
CREATE SQL VIEW AVGG AS SELECT Sno,AVG(G) FROM Sc GROUP BY Sno
查询视图
查找视图CS_S中小于20岁者
SELECT * FROM CS_S WHERE Age<20
实际操作:SELECT Sno,Sn,Age,Sex FROM Student WHERE Dept=’CS’ AND Age<20
重命名视图RENAME VIEW
格式:RENAME VIEW <旧视图名> TO <新视图名>
RENAME <旧名> TO <新名>:数据库DBS换文件名
例子:RENAME VIEW CS_S TO S_CS
删除视图DROP VIEW
格式:DROP VIEW <视图名>
例子:DROP VIEW S_CS
说明
视图定义从数据字典中撤消
基本表的数据不受影响
使得在上定义的视图失效
定义索引
VFP不支持?!
索引的作用
提供多个存取路径
提高存取速度
保证行的唯一性
建立索引CREATE INDEX
格式
CREATE [UNIQUE] INDEX <索引名> ON <表名> (<列名>[{,<列名>}])
例子
CREATE UNIQUE INDEX SCI ON Sc(Sno,Cno)
说明
一个表可以有任意多个索引
索引会影响系统的开销(空间、速度)
索引由系统自动使用和维护
先录数据后建索引
要对WHERE子句用到的列名建立索引
对索引列尽量定义为NOT NULL
使用唯一索引保证列值的唯一性
删除索引DROP INDEX
DROP INDEX <索引名>
SQL数据操纵(更新)功能
概述
数据存储操作
SQL DML(Data Manipulation Language)语句
插入数据INSERT
格式
INSERT INTO <表名>[(<列名1>[{,<列名2>}])] VALUES (<值1>[{,<值2>}])
说明
列名顺序不一定与表结构一致
列表名与VALUE值一一对应
空值用NULL表示
例子
插入单个元组(一个记录)
INSERT INTO Student VALUES(‘S11’,’lin’,’M’,18,’CS’)
插入单个元组的部分数据值
INSERT INTO Sc(Sno,Cno) VALUES(‘S11’,’C4’)
插入子查询结果(多行记录)
INSERT INTO Sc(Sno) SELECT Sno FROM Student WHERE Dept=’CS’
删除数据DELETE
格式
DELETE FROM <表名> [WHERE <条件>]
说明
省略WHERE则删除表中的全部元组
只删表的数据,不删表的定义
注意保证数据的一致性
例子
删除一个元组的值(一行记录)
DELETE FROM Student WHERE Sno=’S11’
删除多个元组的值(多行记录)
DELETE FROM Sc WHERE G<60
DELETE FROM Sc
带子查询的删除语句
DELETE FROM Sc WHERE Sno IN (SELECT Sno FROM Student WHERE Sn=’lin’)
修改(更新)数据UPDATE
格式
UPDATE <表名> SET <列名> = <表达式>[,<列名> = <表达式>]…[WHERE <条件>]
说明
表达式可为具体值、计算结果、子查询
省略WHERE则修改所有元组
注意保证数据的一致性
例子
修改一个元组的某些列值
UPDATE Student SET Age=20 WHERE Sno=’S1’
修改多个元组的值(多行)
UPDATE Student SET Age=Age+1
UPDATE Emp SET Salary=2*Salary WHERE Job=’PROGRAMMER’ AND Salary <=3000
带子查询的修改语句
UPDATE Sc SET G=0 WHERE ‘CS’=(SELECT Dept FROM Student WHERE Student.Sno=Sc.Sno)
UPDATE Emp SET Salary=(SELECT 1.5*AVG(Salary) FROM Emp)
修改操作与数据库的一致性
UPDATE Student SET Sno=’99299’ WHERE Sno=’99101’
UPDATE Sc SET Sno=’99299’ WHERE Sno=’99101’
SQL数据控制功能
概述
SQL DCL(Data Control Language)语句
数据保护
安全性控制
完整性控制
并发控制
数据恢复
SQL数据控制功能
管理数据库用户
控制用户权限的使用
控制权限传递
VFP不支持?!
权限和角色
权限(特权)
新用户必须授予权限
限定用户的操作及操作的数据
将用户的操作限定在指定的范围内
禁止用户越权非法操作
通过为用户设置权限来保证数据的安全
系统权限
用户操作数据库系统的权力,由DBA授予
对象权限
用户操作数据库对象(基本表、视图)的权力,由对象所有者授予
角色
多种权限的集合
可授予用户或其他角色
授予了角色代表授予了该角色所代表的全部权限
可避免权限的多次授予,简化权限的管理
预定义角色
CONNECT:拥有登录数据库的权限
RESOURCE:拥有操作数据的权限
DBA:拥有全部权限
权限与角色的授予GRANT
格式
GRANT <系统权限>|<角色>[{,<系统权限>|<角色>}] TO <用户名>|<角色>|PUBLIC [{,<用户名>|<角色>}] [WITH ADMIN OPTION]
GRANT ALL|<对象权限>[(列名[{,列名}])][,<对象权限>[(列名[{,列名}])]] ON <数据库对象名> TO <用户名>|<角色>|PUBLIC [{,<用户名>|<角色>}] [WITH GRANT OPTION]
说明
PUBLIC:数据库中的全部用户
<对象权限>
SELECT
INSERT
DELETE
ALTER
INDEX
UPDATE
<数据库对象名>
基本表
视图
[WITH ADMIN OPTION]:允许权限或角色的传递
[WITH GRANT OPTION]
允许传递
例子
授予CONNECT角色所代表的权限
GRANT CONNECT TO U1
把CREATE TABLE权限授予自定义角色CREATE_TABLE
GRANT CREATE TABLE TO CREATE_TABLE
将角色CREATE_TABLE所代表的权限授予全部用户
GRANT CREATE_TABLE TO PUBLIC
把查询Student表的权限授予用户U2
GRANT SELECT ON TABLE Student TO U2
将表Student的插入和修改学号的权限授予用户U3和U4
GRANT INSERT,UPDATE(Sno) ON TABLE Student TO U3,U4
将表Course的所有权限授予U5,并允许传递
GRANT ALL ON TABLE Course TO U5 WITH GRANT OPTION
把对表Sc的查询权限授予所有用户
GRANT SELECT ON TABLE Sc TO PUBLIC
DBA把在数据库Scm中建表的权限授予用户U6
GRANT CREATETAB ON DATABASE Scm TO U6
系统权限与角色的收回REVOKE
格式
REVOKE <系统权限>|<角色>[{,<系统权限>|<角色>}] FROM <用户名>|<角色>|PUBLIC[{,<用户名>|<角色>}]
REVOKE ALL|<对象权限>[{,<对象权限>}] ON <数据库对象名> FROM <用户名>|<角色>|PUBLIC [{,<用户名>|<角色>}]
例子
收回用户Lin的CREATE TABLE权限
REVOKE CREATE TABLE FROM Lin
收回用户U6对表Student的修改权限
REVOKE UPDATE ON TABLE Student FROM U6
收回所有用户对表Sc的查询权限
REVOKE SELECT ON TABLE Sc FROM PUBLIC