第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