第 3章 关系数据库标准语言 SQL
学习要点
1,SQL语言的基本概念及特点
2、定义表、修改、删除基本表
3、建立索引、删除索引
4、单表、连接、嵌套、集合查询
5、插入、修改、删除数据
6、定义、查询、更新视图
7、数据控制第 3章 关系数据库标准语言 SQL
3.1 SQL语言的基本概念及特点
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 SQL的数据控制功能习题及参考答案第 3章 关系数据库标准语言 SQL
3.1 SQL语言的基本概念及特点
3.1.1 SQL语言的基本概念
SQL语言支持关系数据库三级模式结构 。 其中外模式对应于视图 ( View) 和部分基本表 ( Base
Table),模式对应于基本表,内模式对应于存储文件 。
基本表是本身独立存在的表,在 SQL中一个关系就对应一个表 。 一些基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中 。
3.1.1 SQL语言的基本概念存储文件的逻辑结构组成了关系数据库的内模式 。 存储文件的物理文件结构是任意的 。
视图是从基本表或其他视图中导出的表,
它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,
因此视图是一个虚表 。 用户可以用 SQL语言对视图和基本表进行查询 。
3.1.2 SQL语言的特点
SQL语言之所以能够为用户和业界所接受并成为国际标准,是因为它是一个综合的,通用的,功能极强同时又简洁易学的语言 。 SQL
语言集数据查询 ( Data Query),数据操纵
( Data Manipulation),数据定义 ( Data
Definition) 和数据控制 ( Data Control) 功能于一体,充分体现了关系数据语言的特点和优点 。
3.1.2 SQL语言的特点特点如下:
1,综合统一
2,高度非过程化
3,面向集合的操作方式
4,以同一种语法结构提供两种使用方式
5,语言简洁,易学易用
3.2 数据定义
3.2.1 定义基本表定义基本表命令的格式为:
CREATE TABLE<表名 >(<列名 > <数据类型 >[列级完整性约束条件 ][,<列名 > <数据类型 >
[列级完整性约束条件 ]… ][,<表级完整性约束条件 >];
其中 <表名 >是所要定义的基本表的名字,它可以由一个或多个属性 ( 列 ) 组成 。 建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由 DBMS自动检查该操作是否违背这些完整性约束条件 。
3.2.1 定义基本表下面以一个,学生 -课程,数据库为例说明 SELECT语句的各种用法 。
,学生 -课程,数据库中包括三个表:
( 1 ),学生,表 Student 由学号 ( Sno ),姓名
( Sname ),性别 ( Ssex ),年龄 ( Sage),所在系
( Sdept ) 五个属性组成,可记为:
Student(Sno,Sname,Ssex,Sage,Sdept) Sno。
( 2),课程,表 Course由课程号 ( Cno),课程名
( Cname),先修课号 ( Pcno),学分 ( Ccredit) 四个属性组成,可记为,Course(Cno,Cname,Pcno,Ccredit) Cno。
( 3),学生选课,表 SC由学号 ( Sno),课程号
( Cno ),成绩 ( Grade ) 三个属性组成,可记为:
SC(Sno,Cno,Grade) (Sno,Cno)。
3.2.1 定义基本表
【 例 3-1】 建立一个,学生,表 Student,它由学号 Sno,姓名 Sname,性别 Ssex,年龄 Sage,所在系 Sdept五个属性组成,其中学号属性不能为空,并且其值是惟一的 。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
3.2.2 修改基本表修改基本表命令的格式为:
ALTER TABLE<表名 >[ADD<新列名 > <数据类型
>[完整性约束 ]][DROP<完整性约束名 >
<完整性约束名 >] [MODIFY<列名 > <数据类型 >
<数据类型 >];
其中 <表名 >指定需要修改的基本表,ADD子句用于增加新列和新的完整性约束条件,DROP子句用于删除指定的完整性约束条件,MODIFY子句用于修改原有的列定义 。
3.2.3 删除基本表删除基本表命令的格式为:
DROP TABLE<表名 >;
3.2.4 建立索引建立索引命令的格式为:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名
><索引名 > ON <表名 > (<列名 >[<次序 >]
[,<列名 >[<次序 >]],… );
其中,<表名 >指定要建索引的基本表的名字 。
索引可以建在该表的一列或多列上,各列名之间用逗号分隔 。 每个 <列名 >后面还可以用 <次序 >指定索引值的排列次序,包括 ASC( 升序 ) 和 DESC( 降序 ) 两种,缺省值为 ASC。
3.2.5 删除索引删除索引命令的格式为:
DROP INDEX<索引名 >;
【 例 3-5】 删除 Student表的 Stusname索引 。
DROP INDEX Stusname;
说明:索引一经建立,就由系统使用和维护它,
不需用户干预 。 建立索引是为了减少查询操作的时间,但如果数据增删改频繁,系统会花费许多时间来维护索引 。 这时,可以删除一些不必要的索引 。
删除索引时,系统会同时从数据字典中删去有关该索引的描述 。
3.3 查询查询命令的一般格式为:
SELECT [ALL|DISTINCT]<目标列表达式
>[,<目标列表达式 >]… FROM <表名或视图名 >
[,<表名或视图名 >]… [WHERE <条件表达式 >] [GROUP BY <列名 1>[HAVING <条件表达式 >]]
[ORDER BY <列名 2> [ASC|DESC]];
3.3 查询
SELECT语句的含义是:根据 WHERE子句的条件表达式,从 FROM子句指定的基本表或视图中找出满足条件的元组,再按 SELECT子句中的目标列表达式,选出元组中的属性值形成结果表 。 如果有
GROUP子句,则将结果按 <列名 1>的值进行分组,
该属性值相等的元组为一个组,每个组产生结果表中的一条记录 。 如果 GROUP子句带 HAVING短语,
则只有满足指定条件的组才予以输出 。 如果有
ORDER子句,则结果表还要按 <列名 2>的值的升序或降序排列 。
3.3.1 单表查询
1,选择表中的若干列
( 1) 查询指定列
【 例 3-6】 查询全体学生的学号与姓名 。
SELECT Sno,Sname
FROM Student;
<目标列表达式 > 中各个列的先后顺序可以与表中的顺序不一致 。 也就是说,用户在查询时可以根据需要改变列的显示顺序 。
( 2) 查询全部列
3.3.1 单表查询
【 例 3-8】 查询全体学生的详细记录 。
SELECT *
FROM Student;
该 SELECT语句实际上是无条件地把 Student表的全部信息都查询出来,所以也称为全表查询,这是最简单的一种查询 。
( 3) 查询经过计算的值
SELECT子句的 <目标列表达式 >不仅可以是表中的属性列,也可以是有关表达式,即可以将查询出来的属性列经过一定的计算后列出结果 。
3.3.1 单表查询
2,选择表中的若干元组
( 1) 消除取值重复的行
【 例 3-10】 查所有选修过课的学生的学号 。
SELECT Sno
FROM SC;
假设 SC表中有下列数据:
Sno Cno Grade
------- ------- -------
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
3.3.1 单表查询执行上面的 SELECT语句后,结果为:
Sno
-------
95001
95001
95001
95002
95002
3.3.1 单表查询该查询结果里包含了许多重复的行 。 如果想去掉结果表中的重复行,必须指定 DISTINCT短语:
SELECT DISTINCT Sno
FROM SC;
执行结果为:
Sno
-------
95001
95002
3.3.1 单表查询
( 2) 查询满足条件的元组查询满足指定条件的元组可以通过 WHERE子句实现 。
① 比较 。
【 例 3-11】 查计算机系全体学生的名单 。
SELECT Sname
FROM Student WHERE Sdept = 'CS';
② 确定范围 。
3.3.1 单表查询
【 例 3-13】 查询年龄在 20~ 23岁之间的学生的姓名,系别和年龄 。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
③ 确定集合 。
3.3.1 单表查询
【 例 3-14】 查信息系 ( IS),数学系 ( MA)
和计算机科学系 ( CS) 的学生的姓名和性别 。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('IS','MA','CS')
与 IN相对的谓词是 NOT IN,用于查找属性值不属于指定集合的元组 。
3.3.1 单表查询
④ 字符匹配 。 谓词 LIKE可以用来进行字符串的匹配 。 其一般语法格式如下:
[NOT] LIKE'<匹配串 >'[ESCAPE'<换码字符 >']
其含义是查找指定的属性列值与 <匹配串 >相匹配的元组 。 <匹配串 >可以是一个完整的字符串,也可以含有通配符 %和 _。
%( 百分号 ) 代表任意长度 ( 长度可以为 0)
的字符串 。
_( 下横线 ) 代表任意单个字符 。
3.3.1 单表查询
【 例 3-15】 查所有姓刘的学生的姓名,学号和性别 。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE'刘 %';
3.3.1 单表查询
3,对查询结果排序如果没有指定查询结果的显示顺序,
DBMS将按其最方便的顺序 ( 通常是元组在表中的先后顺序 ) 输出查询结果 。 用户也可以用
ORDER BY子句指定按照一个或多个属性列的升序 ( ASC) 或降序 ( DESC) 重新排列查询结果,其中升序 ASC为默认值 。
3.3.1 单表查询
【 例 3-16】 查询选修了 3号课程的学生的学号及其成绩,查询结果按分数的降序排列 。
SELECT Sno,Grade
FROM SC
WHERE Cno='3' GROUP BY Grade
DESC;
3.3.1 单表查询
4,对查询结果分组
GROUP BY子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组 。
对查询结果分组的目的是为了细化集函数的作用对象 。 如果未对查询结果分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值 。 否则,集函数将作用于每一个组,
即每一组都有一个函数值 。
3.3.1 单表查询
【 例 3-18】 查询各个课程号与相应的选课人数 。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
该 SELECT语句对 SC表按 Cno的取值进行分组,
所有具有相同 Cno值的元组为一组,然后对每一组作用集函数 COUNT以求得该组的学生人数 。 查询结果为:
3.3.1 单表查询
Cno COUNT(Sno)
------ ----------
1 22
2 34
3 44
4 33
5 48
如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用
HAVING短语指定筛选条件 。
3.3.2 连接查询一个数据库中的多个表之间一般都存在某种内在联系 。 前面的查询都是针对一个表进行的 。 若一个查询同时涉及两个以上的表,则称之为连接查询 。 连接查询主要包括等值连接查询,非等值连接查询,自身连接查询和复合条件连接查询等 。
1,等值与非等值连接查询
3.3.2 连接查询
2,自身连接查询连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的自身连接 。
3,复合条件连接查询上面各个连接查询中,WHERE子句中只有一个条件,即用于连接两个表的谓词 。 WHERE子句中有多个条件的连接操作,称为复合条件连接 。
3.3.3 嵌套查询在 SQL语言中,一个 SELECT-FROM-WHERE语句称为一个查询块 。 将一个查询块嵌套在另一个查询块的 WHERE子句或 HAVING短语的条件中的查询称为嵌套查询或子查询 。 例如:
SELECT Sname
FROM Student
WHERE Sno IN
SELECT Sno
FROM SC
WHERE Cno='2';
3.3.3 嵌套查询
1,带有 IN谓词的子查询
2,带有比较运算符的子查询
3,带有 EXISTS谓词的子查询
3.3.4 集合查询每一个 SELECT语句都能获得一个或一组元组 。
若要把多个 SELECT语句的结果合并为一个结果,可用集合操作来完成 。 集合操作主要包括并操作,交操作和差操作 。
使用并操作将多个查询结果合并起来,形成一个完整的查询结果时,系统会自动去掉重复的元组 。 需要注意的是,参加并操作的各数据项数目必须相同,
对应项的数据类型也必须相同 。
3.4 数据更新
3.4.1 插入数据
1,插入单个元组插入单个元组的 INSERT命令的格式为:
INSERT
INTO<表名 >[(<属性列 1>[,<属性列 2>… ])
VALUES(<常量 1>[,<常量 2>]… )
3.4.1 插入数据
2,插入子查询结果子查询不仅可以嵌套在 SELECT语句中,用以构造父查询的条件,也可以嵌套在 INSERT语句中,用以生成要插入的数据 。
插入子查询结果的 INSERT语句的格式为:
INSERT
INTO<表名 >[(<属性列 1>[,<属性列 2>… ])
其功能是以批量插入,一次将子查询的结果全部插入指定表中 。
3.4.2 修改数据修改操作又称为更新操作,其命令的一般格式为:
UPDATE<表名 >
SET<列名 >=<表达式 >[,<列名 >=<表达式 >]…
[WHERE<条件 >];
其功能是修改指定表中满足 WHERE子句条件的元组 。 其中 SET子句用于指定修改方法,即用 <表达式 >的值取代相应的属性列值 。 如果省略 WHERE子句,
则表示要修改表中的所有元组 。
3.4.2 修改数据
1,修改某一个元组的值
2,修改多个元组的值
3,带子查询的修改语句
4,修改操作与数据库的一致性
3.4.3 删除数据删除命令的一般格式为:
DELETE
FROM<表名 >
[WHERE<条件 >];
DELETE 命 令 的 功 能是 从 指定 表 中删 除满 足
WHERE子句条件的所有元组 。 如果省略 WHERE子句,
表示删除表中全部元组,但表的定义仍在字典中 。 也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义 。
3.4.3 删除数据
1,删除某一个元组的值
2,删除多个元组的值
3,带子查询的删除语句
3.5 视图
3.5.1 定义视图
1,创建视图
SQL语言用 CREATE VIEW命令建立视图,其一般格式为:
CREATE VIEW<视图名 >[(<列名 >[,<列名 >]… )]
AS<子查询 >
[WITH CHECK OPTION];
其中子查询可以是任意复杂的 SELECT语句,但通常不允许含有 ORDER BY子句和 DISTINCT短语 。
WITH CHECK OPTION表示对视图进行 UPDATE、
INSERT和 DELETE操作时要保证更新,插入或删除的行满足视图定义中的谓词条件 ( 即子查询中的条件表达式 ) 。
3.5.1 定义视图
2,删除视图删除视图的命令格式为:
DROP VIEW<视图名 >;
一个视图被删除后,由此视图导出的其他视图也将失效,用户应该使用 DROP VIEW命令将它们一一删除 。
3.5.2 查询视图视图定义后,用户就可以像对基本表进行查询一样对视图进行查询了 。
DBMS执行对视图的查询时,首先进行有效性检查,检查查询涉及的表,视图等是否在数据库中存在,
如果存在,则从数据字典中取出查询涉及的视图的定义,把定义中的子查询和用户对视图的查询结合起来,
转换成对基本表的查询,然后再执行这个经过修正的查询 。 将对视图的查询转换为对基本表的查询的过程称为视图的消解 ( View Resolution) 。
3.5.3 更新视图更新视图包括插入 ( INSERT),删除 ( DELETE)
和修改 ( UPDATE) 三类操作 。
由于视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新 。
为防止用户通过视图对数据进行增删改时,无意或故意操作不属于视图范围内的基本表数据,可在定义视图时加上 WITH CHECK OPTION子句,这样在视图上增删改数据时,DBMS会进一步检查视图定义中的条件,若不满足条件,则拒绝执行该操作 。
3.5.4 视图的特点视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作 。 而且对于非行列子集视图进行查询或更新时还有可能出现问题 。 既然如此,为什么还要定义视图呢? 这是因为合理使用视图能够带来许多好处 。
1,视图能够简化用户的操作
2,视图使用户能以多种角度看待同一数据
3,视图对重构数据库提供了一定程度的逻辑独立性
4,视图能够对机密数据提供安全保护
3.6 SQL的数据控制功能
3.6.1 数据控制简介由 DBMS提供统一的数据控制功能是数据库系统的特点之一 。 数据控制亦称为数据保护,
包括数据的安全性控制,完整性控制,并发控制和恢复 。
3.6.2 授权命令
SQL语言用 GRANT命令向用户授予操作权限,GRANT命令的一般格式为:
GRANT <权限 >[,<权限 >]…
[ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >]…
[WITH GRANT OPTION];
其功能为:将对指定操作对象的指定操作权限授予指定的用户 。
3.6.3 收权命令授予的权限可以由 DBA或其他授权者用 REVOKE
命令收回,REVOKE命令的一般格式为:
REVOKE<权限 >[,<权限 >]…
[ON<对象类型 > <对象名 >]
FROM<用户 >[,<用户 >]… ;
【 例 3-43】 把用户 U4修改学生学号的权限收回 。
REVOKE UPDATE(Sno) ON TABLE Student
FROM U4;
3.6.3 收权命令
【 例 3-44】 收回所有用户对表 SC的查询权限 。
REVOKE SELECT ON TABLE SC FROM PUBLIC;
可见,SQL提供了非常灵活的授权机制 。 用户对自己建立的基本表和视图拥有全部的操作权限,并且可以用 GRANT语句把其中某些权限授予其他用户 。 被授权的用户如果有,继续授权,的许可,还可以把获得的权限再授予其他用户 。 DBA拥有对数据库中所有对象的所有权限,并可以根据应用的需要将不同的权限授予不同的用户 。 而所有授予出去的权力在必要时又都可以用 REVOKE语句收回 。
习 题
1,选择题
( 1) SQL语言具有 __________的功能 。
A.关系规范化,数据操作,数据控制
B,数据定义,数据操作,数据控制
C,数据定义,关系规范化,数据控制
D,数据定义,关系规范化,数据操作
( 2) SQL语言的数据操作语句包括 SELECT,INSERT、
UPDATE和 DELETE。 其中最重要的,也是使用最频繁的语句是 __________。
A,SELECT B,INSERT C,UPDATE D,DELETE
习 题
( 3) 检索所有比,王平,年龄大的学生姓名,年龄和性别 。 正确的 SQL语句是 __________。
( 4) 检索学生姓名及其所选修课程的课程号和成绩 。
正确的语句是 __________。
( 5) 检索选修了四门以上课程的学生总成绩 ( 不统计不及格的课程 ),并要求总成绩按降序排列 。 正确的语句是 __________。
习 题
2,填空
( 1 ) 结 构 化 查 询 语 言 SQL 是一种介于 __________ 与
__________ 之 间 的 语 言,其 功 能 包 括 __________,
__________,__________和 __________四个方面,是关系数据库的标准语言 。
( 2) SQL语言支持关系数据库三级模式结构 。 其中外模式对应于
__________和 __________,模式对应于 __________,
内模式对应于 __________。
( 3 ) 若一个查询同时涉及两个以上的表,则称之为
__________,__________ 主 要 包 括 __________,
__________,__________,__________ 和
__________。
习 题
( 4) 连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的 __________。
( 5) 定义基本表时,通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的 __________中 。
参考答案
1( 1) B ( 2) A ( 3) A ( 4) C ( 5) C
2( 1)关系代数、关系演算、查询、操纵、定义和控制
( 2)视图、部分基本表、基本表、存储文件
( 3)连接查询、连接查询、等值连接、非等值连接、自身连接、外连接和复合条件连接查询
( 4)自身连接 ( 5)数据字典
学习要点
1,SQL语言的基本概念及特点
2、定义表、修改、删除基本表
3、建立索引、删除索引
4、单表、连接、嵌套、集合查询
5、插入、修改、删除数据
6、定义、查询、更新视图
7、数据控制第 3章 关系数据库标准语言 SQL
3.1 SQL语言的基本概念及特点
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 SQL的数据控制功能习题及参考答案第 3章 关系数据库标准语言 SQL
3.1 SQL语言的基本概念及特点
3.1.1 SQL语言的基本概念
SQL语言支持关系数据库三级模式结构 。 其中外模式对应于视图 ( View) 和部分基本表 ( Base
Table),模式对应于基本表,内模式对应于存储文件 。
基本表是本身独立存在的表,在 SQL中一个关系就对应一个表 。 一些基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中 。
3.1.1 SQL语言的基本概念存储文件的逻辑结构组成了关系数据库的内模式 。 存储文件的物理文件结构是任意的 。
视图是从基本表或其他视图中导出的表,
它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,
因此视图是一个虚表 。 用户可以用 SQL语言对视图和基本表进行查询 。
3.1.2 SQL语言的特点
SQL语言之所以能够为用户和业界所接受并成为国际标准,是因为它是一个综合的,通用的,功能极强同时又简洁易学的语言 。 SQL
语言集数据查询 ( Data Query),数据操纵
( Data Manipulation),数据定义 ( Data
Definition) 和数据控制 ( Data Control) 功能于一体,充分体现了关系数据语言的特点和优点 。
3.1.2 SQL语言的特点特点如下:
1,综合统一
2,高度非过程化
3,面向集合的操作方式
4,以同一种语法结构提供两种使用方式
5,语言简洁,易学易用
3.2 数据定义
3.2.1 定义基本表定义基本表命令的格式为:
CREATE TABLE<表名 >(<列名 > <数据类型 >[列级完整性约束条件 ][,<列名 > <数据类型 >
[列级完整性约束条件 ]… ][,<表级完整性约束条件 >];
其中 <表名 >是所要定义的基本表的名字,它可以由一个或多个属性 ( 列 ) 组成 。 建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由 DBMS自动检查该操作是否违背这些完整性约束条件 。
3.2.1 定义基本表下面以一个,学生 -课程,数据库为例说明 SELECT语句的各种用法 。
,学生 -课程,数据库中包括三个表:
( 1 ),学生,表 Student 由学号 ( Sno ),姓名
( Sname ),性别 ( Ssex ),年龄 ( Sage),所在系
( Sdept ) 五个属性组成,可记为:
Student(Sno,Sname,Ssex,Sage,Sdept) Sno。
( 2),课程,表 Course由课程号 ( Cno),课程名
( Cname),先修课号 ( Pcno),学分 ( Ccredit) 四个属性组成,可记为,Course(Cno,Cname,Pcno,Ccredit) Cno。
( 3),学生选课,表 SC由学号 ( Sno),课程号
( Cno ),成绩 ( Grade ) 三个属性组成,可记为:
SC(Sno,Cno,Grade) (Sno,Cno)。
3.2.1 定义基本表
【 例 3-1】 建立一个,学生,表 Student,它由学号 Sno,姓名 Sname,性别 Ssex,年龄 Sage,所在系 Sdept五个属性组成,其中学号属性不能为空,并且其值是惟一的 。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
3.2.2 修改基本表修改基本表命令的格式为:
ALTER TABLE<表名 >[ADD<新列名 > <数据类型
>[完整性约束 ]][DROP<完整性约束名 >
<完整性约束名 >] [MODIFY<列名 > <数据类型 >
<数据类型 >];
其中 <表名 >指定需要修改的基本表,ADD子句用于增加新列和新的完整性约束条件,DROP子句用于删除指定的完整性约束条件,MODIFY子句用于修改原有的列定义 。
3.2.3 删除基本表删除基本表命令的格式为:
DROP TABLE<表名 >;
3.2.4 建立索引建立索引命令的格式为:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名
><索引名 > ON <表名 > (<列名 >[<次序 >]
[,<列名 >[<次序 >]],… );
其中,<表名 >指定要建索引的基本表的名字 。
索引可以建在该表的一列或多列上,各列名之间用逗号分隔 。 每个 <列名 >后面还可以用 <次序 >指定索引值的排列次序,包括 ASC( 升序 ) 和 DESC( 降序 ) 两种,缺省值为 ASC。
3.2.5 删除索引删除索引命令的格式为:
DROP INDEX<索引名 >;
【 例 3-5】 删除 Student表的 Stusname索引 。
DROP INDEX Stusname;
说明:索引一经建立,就由系统使用和维护它,
不需用户干预 。 建立索引是为了减少查询操作的时间,但如果数据增删改频繁,系统会花费许多时间来维护索引 。 这时,可以删除一些不必要的索引 。
删除索引时,系统会同时从数据字典中删去有关该索引的描述 。
3.3 查询查询命令的一般格式为:
SELECT [ALL|DISTINCT]<目标列表达式
>[,<目标列表达式 >]… FROM <表名或视图名 >
[,<表名或视图名 >]… [WHERE <条件表达式 >] [GROUP BY <列名 1>[HAVING <条件表达式 >]]
[ORDER BY <列名 2> [ASC|DESC]];
3.3 查询
SELECT语句的含义是:根据 WHERE子句的条件表达式,从 FROM子句指定的基本表或视图中找出满足条件的元组,再按 SELECT子句中的目标列表达式,选出元组中的属性值形成结果表 。 如果有
GROUP子句,则将结果按 <列名 1>的值进行分组,
该属性值相等的元组为一个组,每个组产生结果表中的一条记录 。 如果 GROUP子句带 HAVING短语,
则只有满足指定条件的组才予以输出 。 如果有
ORDER子句,则结果表还要按 <列名 2>的值的升序或降序排列 。
3.3.1 单表查询
1,选择表中的若干列
( 1) 查询指定列
【 例 3-6】 查询全体学生的学号与姓名 。
SELECT Sno,Sname
FROM Student;
<目标列表达式 > 中各个列的先后顺序可以与表中的顺序不一致 。 也就是说,用户在查询时可以根据需要改变列的显示顺序 。
( 2) 查询全部列
3.3.1 单表查询
【 例 3-8】 查询全体学生的详细记录 。
SELECT *
FROM Student;
该 SELECT语句实际上是无条件地把 Student表的全部信息都查询出来,所以也称为全表查询,这是最简单的一种查询 。
( 3) 查询经过计算的值
SELECT子句的 <目标列表达式 >不仅可以是表中的属性列,也可以是有关表达式,即可以将查询出来的属性列经过一定的计算后列出结果 。
3.3.1 单表查询
2,选择表中的若干元组
( 1) 消除取值重复的行
【 例 3-10】 查所有选修过课的学生的学号 。
SELECT Sno
FROM SC;
假设 SC表中有下列数据:
Sno Cno Grade
------- ------- -------
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
3.3.1 单表查询执行上面的 SELECT语句后,结果为:
Sno
-------
95001
95001
95001
95002
95002
3.3.1 单表查询该查询结果里包含了许多重复的行 。 如果想去掉结果表中的重复行,必须指定 DISTINCT短语:
SELECT DISTINCT Sno
FROM SC;
执行结果为:
Sno
-------
95001
95002
3.3.1 单表查询
( 2) 查询满足条件的元组查询满足指定条件的元组可以通过 WHERE子句实现 。
① 比较 。
【 例 3-11】 查计算机系全体学生的名单 。
SELECT Sname
FROM Student WHERE Sdept = 'CS';
② 确定范围 。
3.3.1 单表查询
【 例 3-13】 查询年龄在 20~ 23岁之间的学生的姓名,系别和年龄 。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
③ 确定集合 。
3.3.1 单表查询
【 例 3-14】 查信息系 ( IS),数学系 ( MA)
和计算机科学系 ( CS) 的学生的姓名和性别 。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('IS','MA','CS')
与 IN相对的谓词是 NOT IN,用于查找属性值不属于指定集合的元组 。
3.3.1 单表查询
④ 字符匹配 。 谓词 LIKE可以用来进行字符串的匹配 。 其一般语法格式如下:
[NOT] LIKE'<匹配串 >'[ESCAPE'<换码字符 >']
其含义是查找指定的属性列值与 <匹配串 >相匹配的元组 。 <匹配串 >可以是一个完整的字符串,也可以含有通配符 %和 _。
%( 百分号 ) 代表任意长度 ( 长度可以为 0)
的字符串 。
_( 下横线 ) 代表任意单个字符 。
3.3.1 单表查询
【 例 3-15】 查所有姓刘的学生的姓名,学号和性别 。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE'刘 %';
3.3.1 单表查询
3,对查询结果排序如果没有指定查询结果的显示顺序,
DBMS将按其最方便的顺序 ( 通常是元组在表中的先后顺序 ) 输出查询结果 。 用户也可以用
ORDER BY子句指定按照一个或多个属性列的升序 ( ASC) 或降序 ( DESC) 重新排列查询结果,其中升序 ASC为默认值 。
3.3.1 单表查询
【 例 3-16】 查询选修了 3号课程的学生的学号及其成绩,查询结果按分数的降序排列 。
SELECT Sno,Grade
FROM SC
WHERE Cno='3' GROUP BY Grade
DESC;
3.3.1 单表查询
4,对查询结果分组
GROUP BY子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组 。
对查询结果分组的目的是为了细化集函数的作用对象 。 如果未对查询结果分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值 。 否则,集函数将作用于每一个组,
即每一组都有一个函数值 。
3.3.1 单表查询
【 例 3-18】 查询各个课程号与相应的选课人数 。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
该 SELECT语句对 SC表按 Cno的取值进行分组,
所有具有相同 Cno值的元组为一组,然后对每一组作用集函数 COUNT以求得该组的学生人数 。 查询结果为:
3.3.1 单表查询
Cno COUNT(Sno)
------ ----------
1 22
2 34
3 44
4 33
5 48
如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用
HAVING短语指定筛选条件 。
3.3.2 连接查询一个数据库中的多个表之间一般都存在某种内在联系 。 前面的查询都是针对一个表进行的 。 若一个查询同时涉及两个以上的表,则称之为连接查询 。 连接查询主要包括等值连接查询,非等值连接查询,自身连接查询和复合条件连接查询等 。
1,等值与非等值连接查询
3.3.2 连接查询
2,自身连接查询连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的自身连接 。
3,复合条件连接查询上面各个连接查询中,WHERE子句中只有一个条件,即用于连接两个表的谓词 。 WHERE子句中有多个条件的连接操作,称为复合条件连接 。
3.3.3 嵌套查询在 SQL语言中,一个 SELECT-FROM-WHERE语句称为一个查询块 。 将一个查询块嵌套在另一个查询块的 WHERE子句或 HAVING短语的条件中的查询称为嵌套查询或子查询 。 例如:
SELECT Sname
FROM Student
WHERE Sno IN
SELECT Sno
FROM SC
WHERE Cno='2';
3.3.3 嵌套查询
1,带有 IN谓词的子查询
2,带有比较运算符的子查询
3,带有 EXISTS谓词的子查询
3.3.4 集合查询每一个 SELECT语句都能获得一个或一组元组 。
若要把多个 SELECT语句的结果合并为一个结果,可用集合操作来完成 。 集合操作主要包括并操作,交操作和差操作 。
使用并操作将多个查询结果合并起来,形成一个完整的查询结果时,系统会自动去掉重复的元组 。 需要注意的是,参加并操作的各数据项数目必须相同,
对应项的数据类型也必须相同 。
3.4 数据更新
3.4.1 插入数据
1,插入单个元组插入单个元组的 INSERT命令的格式为:
INSERT
INTO<表名 >[(<属性列 1>[,<属性列 2>… ])
VALUES(<常量 1>[,<常量 2>]… )
3.4.1 插入数据
2,插入子查询结果子查询不仅可以嵌套在 SELECT语句中,用以构造父查询的条件,也可以嵌套在 INSERT语句中,用以生成要插入的数据 。
插入子查询结果的 INSERT语句的格式为:
INSERT
INTO<表名 >[(<属性列 1>[,<属性列 2>… ])
其功能是以批量插入,一次将子查询的结果全部插入指定表中 。
3.4.2 修改数据修改操作又称为更新操作,其命令的一般格式为:
UPDATE<表名 >
SET<列名 >=<表达式 >[,<列名 >=<表达式 >]…
[WHERE<条件 >];
其功能是修改指定表中满足 WHERE子句条件的元组 。 其中 SET子句用于指定修改方法,即用 <表达式 >的值取代相应的属性列值 。 如果省略 WHERE子句,
则表示要修改表中的所有元组 。
3.4.2 修改数据
1,修改某一个元组的值
2,修改多个元组的值
3,带子查询的修改语句
4,修改操作与数据库的一致性
3.4.3 删除数据删除命令的一般格式为:
DELETE
FROM<表名 >
[WHERE<条件 >];
DELETE 命 令 的 功 能是 从 指定 表 中删 除满 足
WHERE子句条件的所有元组 。 如果省略 WHERE子句,
表示删除表中全部元组,但表的定义仍在字典中 。 也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义 。
3.4.3 删除数据
1,删除某一个元组的值
2,删除多个元组的值
3,带子查询的删除语句
3.5 视图
3.5.1 定义视图
1,创建视图
SQL语言用 CREATE VIEW命令建立视图,其一般格式为:
CREATE VIEW<视图名 >[(<列名 >[,<列名 >]… )]
AS<子查询 >
[WITH CHECK OPTION];
其中子查询可以是任意复杂的 SELECT语句,但通常不允许含有 ORDER BY子句和 DISTINCT短语 。
WITH CHECK OPTION表示对视图进行 UPDATE、
INSERT和 DELETE操作时要保证更新,插入或删除的行满足视图定义中的谓词条件 ( 即子查询中的条件表达式 ) 。
3.5.1 定义视图
2,删除视图删除视图的命令格式为:
DROP VIEW<视图名 >;
一个视图被删除后,由此视图导出的其他视图也将失效,用户应该使用 DROP VIEW命令将它们一一删除 。
3.5.2 查询视图视图定义后,用户就可以像对基本表进行查询一样对视图进行查询了 。
DBMS执行对视图的查询时,首先进行有效性检查,检查查询涉及的表,视图等是否在数据库中存在,
如果存在,则从数据字典中取出查询涉及的视图的定义,把定义中的子查询和用户对视图的查询结合起来,
转换成对基本表的查询,然后再执行这个经过修正的查询 。 将对视图的查询转换为对基本表的查询的过程称为视图的消解 ( View Resolution) 。
3.5.3 更新视图更新视图包括插入 ( INSERT),删除 ( DELETE)
和修改 ( UPDATE) 三类操作 。
由于视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新 。
为防止用户通过视图对数据进行增删改时,无意或故意操作不属于视图范围内的基本表数据,可在定义视图时加上 WITH CHECK OPTION子句,这样在视图上增删改数据时,DBMS会进一步检查视图定义中的条件,若不满足条件,则拒绝执行该操作 。
3.5.4 视图的特点视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作 。 而且对于非行列子集视图进行查询或更新时还有可能出现问题 。 既然如此,为什么还要定义视图呢? 这是因为合理使用视图能够带来许多好处 。
1,视图能够简化用户的操作
2,视图使用户能以多种角度看待同一数据
3,视图对重构数据库提供了一定程度的逻辑独立性
4,视图能够对机密数据提供安全保护
3.6 SQL的数据控制功能
3.6.1 数据控制简介由 DBMS提供统一的数据控制功能是数据库系统的特点之一 。 数据控制亦称为数据保护,
包括数据的安全性控制,完整性控制,并发控制和恢复 。
3.6.2 授权命令
SQL语言用 GRANT命令向用户授予操作权限,GRANT命令的一般格式为:
GRANT <权限 >[,<权限 >]…
[ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >]…
[WITH GRANT OPTION];
其功能为:将对指定操作对象的指定操作权限授予指定的用户 。
3.6.3 收权命令授予的权限可以由 DBA或其他授权者用 REVOKE
命令收回,REVOKE命令的一般格式为:
REVOKE<权限 >[,<权限 >]…
[ON<对象类型 > <对象名 >]
FROM<用户 >[,<用户 >]… ;
【 例 3-43】 把用户 U4修改学生学号的权限收回 。
REVOKE UPDATE(Sno) ON TABLE Student
FROM U4;
3.6.3 收权命令
【 例 3-44】 收回所有用户对表 SC的查询权限 。
REVOKE SELECT ON TABLE SC FROM PUBLIC;
可见,SQL提供了非常灵活的授权机制 。 用户对自己建立的基本表和视图拥有全部的操作权限,并且可以用 GRANT语句把其中某些权限授予其他用户 。 被授权的用户如果有,继续授权,的许可,还可以把获得的权限再授予其他用户 。 DBA拥有对数据库中所有对象的所有权限,并可以根据应用的需要将不同的权限授予不同的用户 。 而所有授予出去的权力在必要时又都可以用 REVOKE语句收回 。
习 题
1,选择题
( 1) SQL语言具有 __________的功能 。
A.关系规范化,数据操作,数据控制
B,数据定义,数据操作,数据控制
C,数据定义,关系规范化,数据控制
D,数据定义,关系规范化,数据操作
( 2) SQL语言的数据操作语句包括 SELECT,INSERT、
UPDATE和 DELETE。 其中最重要的,也是使用最频繁的语句是 __________。
A,SELECT B,INSERT C,UPDATE D,DELETE
习 题
( 3) 检索所有比,王平,年龄大的学生姓名,年龄和性别 。 正确的 SQL语句是 __________。
( 4) 检索学生姓名及其所选修课程的课程号和成绩 。
正确的语句是 __________。
( 5) 检索选修了四门以上课程的学生总成绩 ( 不统计不及格的课程 ),并要求总成绩按降序排列 。 正确的语句是 __________。
习 题
2,填空
( 1 ) 结 构 化 查 询 语 言 SQL 是一种介于 __________ 与
__________ 之 间 的 语 言,其 功 能 包 括 __________,
__________,__________和 __________四个方面,是关系数据库的标准语言 。
( 2) SQL语言支持关系数据库三级模式结构 。 其中外模式对应于
__________和 __________,模式对应于 __________,
内模式对应于 __________。
( 3 ) 若一个查询同时涉及两个以上的表,则称之为
__________,__________ 主 要 包 括 __________,
__________,__________,__________ 和
__________。
习 题
( 4) 连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的 __________。
( 5) 定义基本表时,通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的 __________中 。
参考答案
1( 1) B ( 2) A ( 3) A ( 4) C ( 5) C
2( 1)关系代数、关系演算、查询、操纵、定义和控制
( 2)视图、部分基本表、基本表、存储文件
( 3)连接查询、连接查询、等值连接、非等值连接、自身连接、外连接和复合条件连接查询
( 4)自身连接 ( 5)数据字典