第三章 关系数据库标准语言SQL(重点)
3.1 SQL概述
- SQL :结构化查询语言,是关系数据库的标准语言。
3.1.2 SQL的特点:综合统一;高度非过程化;面向集合的操作方式;以同一种语法结构提供多种使用方式;语言简洁易用。(特点详细看书P76~78)
3.1.3 SQL同样支持关系数据库三级模式结构
基本表
- 基本表是本身独立存在的表;
- 一个关系就对应一个基本表;
- 一个或多个基本表对应一个存储文件;
- 一个表可以带若干索引。
存储文件
- 逻辑结构组成了关系数据库的内模式;
- 物理结构是任意的,对用户透明。
视图
- 从基本表导出的表;
- 是一个虚表;
- 数据库中只存放视图的定义,而不存放视图对应的数据;
- 用户可以在视图上再定义视图。
3.3 数据定义(核心部分)
3.3.1 模式的定义和删除
1. 定义模式
- 定义模式(语句格式):
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
- (如果没有指定模式名,那么后面的用户名就是模式名)
- 在 CREATA SCHEMA 中可以 CREATE TABLE ,CREATE VIEW 和 GRANT 子句,也就是说可以进一步创建基本表,视图和定义授权。
- (要创建模式,要有管理员权限或者 CREATE SCHEMA 权限)
2. 删除模式
- 语句格式:
DROP SCHEMA <模式名> <CASCADE | RESTRICT>
- (说明:CASCADE 和 RESTRICT 必须二选一)
- CASCADE(级联):删除模式的同时把该模式中所有的数据库对象全部删除。
- RESTRICT(限制):如果已经定义了下属的数据库对象,则会拒绝语句执行,没有下属对象时才能执行。
3.3.2 基本表的定义,删除与修改
1. 定义基本表
2.数据类型:
3. 模式与表(了解即可)
- 如果搜索路径的模式名都不存在,则会出错。
- 若搜索路径的存在模式,RDBMS会使用模式列表中的第一个存在的模式作为数据库对象的模式名。
- 例子:创建基本表(学生-课程模式)
- ① 创建表时给出模式名
- ② 在创建模式语句中同时创建表
- ③ 设置所属模式,在创建表名中不必给出模式名
4. 修改基本表
- 语句格式:
- 说明(以下全是):<表名>是要修改的基本表;
- ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件;
- DROP COLUMN 子句用于删除表中的列。
- 指定了CASCADE 短语,则自动删除引用该列的其他对象;
- 指定了RESTRICT 短语,则如果该列被其他对象引用,数据库管理系统将拒绝删除该列;
- DROP CONSTRAINT 子句用于删除指定的完整性约束条件;
- ALTER COLUMN 子句用于修改原有的列定义,包括修改列名和数据类型。
修改基本表的例子
- 向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD S_entrance DATE;
- 将年龄的数据类型由字符型)(假设原来的数据类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
- 增加课程名称必须取唯一值的约束条件。
ALTER TABLE Course ADD UNIQUE (Cname);
5. 删除基本表
- 语句格式:
DROP TABLE <表名> [RESTRICT| CASCADE];
- 【例】删除Student表:
DROP TABLE Student CASCADE;
- 说明(以下全是):RESTRICT —— 删除表是有限制的。欲删除的基本表不能被其他表的约束所引用。如果存在依赖该表的对象,则此表不能被删除;
- CASCADE —— 删除该表没有限制。在删除基本表的同时,相关的依赖对象一起删除。
- 基本表定义被删除,数据被删除,表上建立的索引、视图、触发器等一般也将被删除。
3.3.3 索引的建立与删除
- 建立索引的目的:加快查询速度。
- 谁可以建立索引:DBA(管理员)或表的属主(即建立表的人)
数据库一般会自动建立以下列上的索引:
PRIMARY KEY; UNIQUE;
- 谁维护索引:DBMS自动完成。
- 使用索引:DBMS自动选择是否使用索引及使用。
- RDBMS(关系数据库)中索引一般采用B+树、HASH索引来实现。
- B+树索引具有动态平衡的优点,HASH索引具有查找速庶土的特点。采用B+树还是HASH索引则由具体的RDBMS来决定。
- 索引是关系数据库内部实现技术,属于内模式的范畴。
- CREATE INDEX语句定义索引时,可以定义索引是唯一索引,非唯一索引或 聚簇索引。
1. 建立索引
- 建立索引使用
CREATE INDEX
语句 - 语句格式:
- 说明:UNIQUE 表明此索引每一个索引值只对应唯一的数据。
- CLUSTER 表示要建立的索引是聚簇索引。聚簇索引是指索引顺序与表中记录的物理顺序一致的索引组织。
- (在最经常查询的列上建立聚簇索引以提高查询效率;一个基本表上最多只能建立一个聚簇索引;经常更新的列不宜建立聚簇索引。)
2. 删除索引
- 删除索引使用
DROP INDEX
语句 - 语句格式:
DROP INDEX <索引名>;
- 删除索引时,系统会从数据字典中删去有关该索引。
- 实例:删除Student表的Stusname索引:
DROP INDEX Stusname;
3.3.4 数据字典
- 数据字典是关系数据库管理系统内部的一组系统表。
- 数据字典记录了数据库中所有的定义信息,包括模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的权限、统计信息等。
- RDBMS(关系数据库)执行SQL数据定义时,实际就是更新数据字典。
3.4 数据查询(重点)
3.4.1 单表查询
- 功能:对一个表的内容进行查询。
1.选择表中的若干列
- (1)查询指定列
- 格式:在SELECT后面指定列名,FROM后面列所在的表名。
- (2)查询全部列
- 功能:选出表中所有属性列。
- 格式:在 SELECT 关键字后面列出所有列名或将<目标列表达式>指定为 * 。
- (3)查询经过计算的值
- 功能:选出表中指定的属性列,并经过计算后输出。
- 格式:SELECT子句的 <目标列表达式> 可以为:
- (1)算术表达式(+-*/)
- (2)字符串常量(“李四”)
- (3)函数
- (4)列别名
2.选择表中的若干元组
- (1)消除取值重复的行
- 如果没有指定 DISTINCT 关键词,则缺省为ALL。
【例】查询选修了课程的学生学号。
- SELECT Sno FROM SC;
- 等价于:SELECT ALL Sno FROM SC;
【输出结果】
- Sno
- 200215121
- 200215121
- 200215121
- 200215122
- 200215122
- (2)查询满足条件的元组
查询满足条件的元组可以通过where子句实现,where常用的查询条件如下: - ① 比较大小
- ② 确定范围
- 谓词:
BETWEEN---AND…
和NOT BETWEEN---AND…
- 前面的表达的是在这里面,后面的表达的是不在这里的。
- BETWEEN后是范围的下限(低值),AND后是范围的上限(高值)
- ③ 确定集合
谓词:INK<值表>,NOT IN<值表>
- ④ 字符匹配
- 谓词:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字体>’ ]
- 说明:匹配串为固定字符串。
- 匹配串为含通配符的字符串。
- 如果要查询的字符串含有通配符 % 或 _ ,这事就要用ESCAPE ‘<换码字符> ’短语对通配符进行转义。
- 使用换码字符将通配符转义为普通字符。
- ⑤ 涉及空值的查询
- 谓词:IS NULL 或 IS NOT NULL
- “IS” 不能用 “=” 代替
- ⑥ 多重条件查询
- 用逻辑运算符AND和OR来联结多个查询条件,AND的优先级高于OR,可以用括号改变优先级。
可用来实现多种其他谓词:
- [NOT] IN
- [NOT] BETWEEN … AND…
3.ORDER BY子句(排序)
- ORDER BY子句可以按一个或多个属性列排序:
- 升序:ASC;(由小到大)
- 降序:DESC;(由大到小)
- 缺省值为升序。
- 当排序列含空值时:(空值默认为最大值)
- ASC:排序列为空值的元组最后显示。
- DESC:排序列为空值的元组最先显示。
4.聚集函数
5.GROUP BY 子句(分组)
- GROUP BY 子句作用是:按指定的一列或多列值分组,值相等的为一组,来细化聚集函数的作用对象。
- 说明:① 未对查询结果分组,聚集函数将作用于整个查询结果;② 对查询结果分组后,聚集函数将分别作用于每个组。
- GROUP BY子句分组后,可以使用 HAVING 短语指定筛选条件。
- 【例】查询选修了3门以上课程的学生学号。
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT (*) > 3 ;
HAVING 短语与 WHERE 子句的区别:
3.4.2 连接查询(多个表的查询)
- 等值与非等值连接查询,自然连接查询,自身连接查询,外连接查询,符合条件查询。
1. 等值与非等值连接查询
- 连接查询的 WHERE 子句中用来连接两个表的条件称为连接条件或连接谓词。
- 其一般格式:
- 注意:①当连接运算符为“=”称为等值连接,其他运算符称为非等值连接; ②连接谓词中的列名称为连接字段,并且各连接字段类型必须是可比的,但名字不必是相同的。
- 【例】查询每个学生及其选修课程的情况。
连接操作的一种执行方法:嵌套循环法(NESTED-LOOP)(了解即可)
- 了解即可
- 实例看书上(P100/101)
2. 自然连接
- 若在等值连接中把目标列中重复的属性列去掉则为自然连接。
3. 自身连接查询
- 定义:一个表与其自己进行连接。
- 说明:① 需要给表起别名以示区别。② 由于所有属性名都是同名属性,因此必须使用别名前缀。
4. 外连接
- 把悬浮元组也加到我们数据库的查询结果。
- 普通连接与外连接的区别:普通连接操作只输出满足连接条件的元组。外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。
- 外连接分为:左外连接,右外连接
- 左外连接:列出左边关系中所有的元组。
LEFT 0UT JOIN SC ON
- 右外连接:列出右边关系中所有的元组。
RIGHT OUT JOIN SC ON
5.多表连接
3.4.3 嵌套查询
- 一个
SELECT - FROM - WHERE
语句称为一个查询块。 - 嵌套查询定义:是指将一个查询块嵌套在另一个查询块的WHERE 子句或 HAVING 短语的条件中的查询。
- 说明:① 子查询中不能使用ORDER BY子句。②层层嵌套方式反映了SQL语言的结构化。③有些嵌套查询可以用连接运算替代。④外层查询(父查询)、内层查询(子查询)
1.带有IN谓词的子查询
- 在嵌套查询中,子查询的结果往往是个集合,用IN谓词表示父查询的条件在子查询结果的集合中。
- 说明:① 不相关子查询:子查询的查询条件不依赖于父查询。 ② 相关子查询:子查询的查询条件依赖于父查询,整个查询语句称为嵌套查询。
2.带有比较运算符的子查询
- 当能确切知道内层查询返回单值时,可用 比较运算符
( >,<,=,>=,<=,!=或<> )
。
3.带有ANY (SOME)或ALL谓词的子查询
4、带有EXISTS谓词的子查询
(1)EXISTS谓词
- EXISTS谓词代表存在量词 ∃ :,带有EXISTS谓词的子查询只返回逻辑真值 “true” 或逻辑假值 “false” 。
- 说明:① 使用存在量词EXISTS后,若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值。 ② 由EXISTS引出的子查询目标列表都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。
(2)NOT EXISTS谓词
- 说明:
- 若内层查询结果非空,则外层的WHERE子句返回假值;
- 若内层查询结果为空,则外层的WHERE子句返回真值。
(3)不同形式的查询间的替换
- ① 一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换;
- ② 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。
(4)用EXISTS / NOT EXISTS实现全称量词
(5)用EXISTS / NOT EXISTS 实现逻辑蕴涵
3.4.4 集合查询
- SELECT 语句的查询结果是元组的集合,所以多个SELECT 语句的结果可进行集合操作。
- 集合操作主要包括 并操作UNION、交操作 INTERSEC 和差操作EXCEPT。
- 并操作UNION 是并集
- 交操作INTERSEC 是交集
- 差操作EXCEPT 是 差集
- 注意:参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
- UNION:将多个查询结果合并起来,系统自动去掉重复元组
- UNION ALL:将多个查询结果合并起来时,保留重复元组。
3.4.5 基于派生表的查询
- 子查询不仅可以出现在 WHERE 子句中,还可以出现在FROM 子句中,这时子查询生成的临时派生表(derived table)成为主查询的查询对象。
- 如果子查询中没有聚集函数,派生表可以不指定属性列,子查询 SELECT 子句后面的列名为其默认属性。
- 【注意】通过FROM子句生成派生表时,AS关键词可以省略,但必须为派生关系指定一个别名。而对于基本表,别名是可选择项。
3.4.6 SELECT语句的一般格式
3.5 数据更新
- 数据更新操作有三种:向表中添加若干行数据、修改表中的数据 和 删除表中的若干行数据。
3.5.1 插入数据
- SQL 的数据插入语句 INSERT 通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组。
1. 插入元组
2. 插入子查询结果
- 语句格式:
INSERT INTO <表名> [ ( <属性列1> [ , <属性列2 > ] … ) ];子查询;
- 功能:将子查询结果插入指定表中。
- 说明:SELECT 子句目标列必须与 INTO 子句匹配,值的个数,类型都要一致。
3.5.2 修改数据(更新操作)
3.5.3 删除数据
3.6 空值的处理
- 空值的存在是因为取值有不确定性,对关系运算带来特殊的问题,所以需要做特殊的处理。
- SQL语言中允许某些元组的某些属性取空值,一般有以下三种情况:
- ① 该属性有值,但当前不知道它的具体值。
- ② 该属性不应该有值。
- ③ 由于某种原因不便于填写。
1. 空值的判断
- 判断一个属性的值是否为空值,用 IS NULL 或 IS NOTNULL来表示。
2. 空值的约束条件
- ① 属性定义(或者域定义)中有 NOT NULL 约束条件的不能取空值;
- ② 加了 UNIQUE 限制的属性不能取空值;
- ③ 码属性不能取空值。
3. 空值的算术运算、比较运算和逻辑运算
- 算术运算:空值与另一个值(包括另一个空值)的算术运算的结果为空值。
- 比较运算:空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN;
- 逻辑运算:T 表示TRUE ,F 表示FALSE,U表示UNKNOWN。
3.7 视图
- 视图的特点:
- (1)视图是虚表,是从一个或几个基本表(或视图)。
- (2)只存放视图的定义,不存放视图对应的数据。
- (3)表中的数据发生变化,视图中查询出的数据也随之改变。
- 基于视图的操作:查询、删除、受限更新、定义基于该视图的新视图。
3.7.1 定义视图
1. 建立视图
- 说明:
- ① 组成视图的属性列名:全部省略或全部指定。
- ② RDBMS执行 CREATE VIEW 语句时只是把视图定义存入数据字典并不执行其中的 SELECT 语句。
- ③ 在对视图查询时,按视图的定义从基本表中将数据查出。
- 若一个视图是从单个基本表导出的,并且只是去掉了基本表的其些行和某些列,但保留了主码,则称这类视图为行列子集视图。
- 视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在基本表与视图上。
- 带虚拟列的视图也称为带表达式的视图。
- 可以用带有聚集函数和 GROUP BY 子句的查询来定义视图,这种视图称为分组视图。
2. 删除视图
- 语句的格式:
DROP VIEW <视图名> [CASCADE];
- 【说明】
- ① 该语句从数据字典中删除指定的视图定义。
- ② 如果该视图上还导出了其他视图,使用 CASCADE 级联删除语句,把该视图和由它导出的所有视图一起删除。
- ③ 删除基表时,由该基表导出的所有视图定义都必须显式地用 DROP VIEW 语句删除。
3.7.2 查询视图
- 视图定义后,用户就可以像基本表一样对视图进行查询了。
1. RDBMS实现视图查询的方法——视图消解法
- 第一步:进行有效性检查。
- 第二步:转换成等价的对基本表的查询。
- 第三步:执行修正后的查询。
2.视图消解法的局限
- 视图消解法有些情况下,视图消解法不能生成正确查询。
3.7.3 更新视图
- 【说明】更新视图是指通过视图来插入、删除和修改数据,因为视图不适宜存储数据,因此对视图的更新操作将通过视图消解,转化为对实际表的更新操作。
- 【注意】为防止在更新视图时出错,定义视图时要加上WITH CHECK OPTION子句。
- 更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新。
3.7.4 视图的作用
- 1.视图能够简化用户的操作。
- 2.视图使用户能以多种角度看待同一数据。
- 3.视图对重构数据库提供了一定程度的逻辑独立性。
- 4.视图能够对机密数据提供安全保护。
- 5.适当的利用视图可以更清晰的表达查询。
Comments | NOTHING