数据库概论第三章-SQL
SQL 概 述
SQL 的特点
综合统一
SQL 集数据定义语言、 数据操纵语言、 数据控制语言的功能于一体, 语言风格统一,可以独立完成数据库生命周期中的全部活动,
高度非过程化
而用 SQL 进行数据操作时, 只要提出“ 做什么”, 而无须指明“ 怎么做”, 因此无须了解存取路径。面向集合的操作方式
SQL 采用集合操作方式, 不仅操作对象、 查找结果可以是元组的集合, 而且一次插入、 删除、 更新操作的对象也可以是元组的集合。以同一种语法结构提供多种使用方式
SQL 既是独立的语言, 又是嵌入式语言。语言简洁, 易学易用
数据定义
模式
表
修改表
删除基本表
当某个基本表不再需要时, 可以使用 DROP TABLE 语句删除它。 其一般格式为:
DROP TABLE <表名〉 [RESTRICT | CASCADE] ;
若选择 RESTRICT, 则该表的删除是有限制条件的。 欲删除的基本表不能被其他表的约束所引用( 如 CHECK, FOREIGN KEY 等约束), 不能有视图, 不能有触发器( trigger),不能有存储过程或函数等。 如果存在这些依赖该表的对象, 则此表不能被删除。
若选择 CASCADE, 则该表的删除没有限制条件。 在删除基本表的同时, 相关的依赖对象, 例如视图, 都将被一起删除。
默认情况是 RESTRICT。
[例 3.11] 删除 Student 表。
DROP TABLE Student CASCADE;
基本表定义一旦被删除, 不仅表中的数据和此表的定义将被删除, 而且此表上建立的索引、 触发器等对象一般也都将被删除。 有的关系数据库管理系统还会同时删除在此表上建立的视图。 如果欲删除的基本表被其他基本表所引用, 则这些表也可能被删除。 例如 SC表通过外码 Sno 引用 Student, 则执行例 3.11 后 Student 表被删除, SC 也被级联删除。 因此执行删除基本表的操作一定要格外小心
索引
建立索引
每个<列名>后面还可以用<次序>指定索引值的排列次序, 可选 ASC (升序) 或 DESC (降序), 默认值为 ASC»
UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER 表示要建立的索引是聚簇索引。
修改索引
重新命名
删除索引
数据字典
数据字典是关系数据库管理系统内部的一组系统表, 它记录了数据库中所有的定义信息,包括关系模式定义、 视图定义、 索引定义、 完整性约束定义、 各类用户对数据库的操作权限、统计信息等。
数 据 查 询
单表查询
(1) 消除取值重复的行
两个本来并不完全相同的元组在投影到指定的某些列上后, 可能会变成相同的行。 可以用 DISTINCT 消除它们
(2) 查询满足条件的元组查询满足指定条件的元组可以通过 WHERE 子句实现。
ORDER BY 子句
用户可以用 ORDER BY 子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC) 排列, 默认值为升序
聚集函数
注意, WHERE 子句中是不能用聚集函数作为条件表达式的。 聚集函数只能用于SELECT 子句和 GROUP BY 中的 HAVING 子句 。
GROUP BY 子句
对查询结果分组的目的是为了细化聚集函数的作用对象。 如果未对查询结果分组, 聚集函数将作用于整个查询结果。 分组后聚集函数将作用于每一个组, 即每一组都有一个函数值。
连接查询
若一个查询同时涉及两个以上的表, 则称之为连接查询。 连接查询是关系数据库中最主要的查询, 包括等值连接查询、 自然连接査询、 非等值连接查询、 自身连接査询、 外连接查询和复合条件连接查询等。
等值连接与自然连接
连接查询的 WHERE 子句中用来连接两个表的条件称为连接条件或连接谓词
当连接运算符为=时, 称为等值连接。 使用其他运算符称为非等值连接。
关系数据库管理系统执行该连接操作的一种可能过程是: 首先在表 Student 中找到第一个元组, 然后从头开始扫描 SC 表, 逐一查找与 Student 第一个元组的 Sno 相等的 SC 元组, 找到后就将 Student 中的第一个元组与该元组拼接起来, 形成结果表中一个元组。 SC全部查找完后, 再找 Student 中第二个元组, 然后再从头开始扫描 SC, 逐一查找满足连接条件的元组, 找到后就将 Student 中的第二个元组与该元组拼接起来, 形成结果表中一个元组。 重复上述操作, 直到 Student 中的全部元组都处理完毕为止。 这就是嵌套循环连接算法的基本思想。 如图 3.5 所示。
若在等值连接中把目标列中重复的属性列去掉则为自然连接。
连接操作不仅可以在两个表之间进行, 也可以是一个表与其自己进行连接, 称为表的自身连接
若某个学生没有选课, 仍把 Student 的悬浮元组保存在结果关系中, 而在 SC 表的属性上填空值 NULL, 这时就需要使用外连接。
左外连接列出左边关系( 如本例 Student ) 中所有的元组, 右外连接列出右边关系中所有的元组。
连接操作除了可以是两表连接、 一个表与其自身连接外, 还可以是两个以上的表进行连接, 后者通常称为多表连接。
嵌套查询
上层的査询块称为外层查询或父查询, 下层査询块称为内层查询或子查询
**带 有 IN 谓词的子查询 **
在嵌套査询中, 子查询的结果往往是一个集合, 所以谓词 IN 是嵌套查询中最经常使用的谓词。
子査询的查询条件不依赖于父査询, 这类子査询称为不相关子查询。 不相关子查询是较简单的一类子查询。 如果子查询的查询条件依赖于父查询, 这类子查询称为相关子查询 ( correlated subquery), 整个査询语句称为相关嵌套查询( correlatednested query) 语句
带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。 当用户能确切知道内层查询返回的是单个值时, 可以用>、 <、 =、 >=、 <=、 !=或<>等比较运算符。
带 有 ANY (SOME) 或 ALL 谓词的子查询
any 类似于一个集合中min
all类似于一个集合中的max
带有 EXISTS 谓词的子查询
带有 EXISTS 谓词的子查询不返回任何数据, 只产生逻辑真值”true”或逻辑假值 “false”。
集合查询
SELECT 语句的查询结果是元组的集合, 所以多个 SELECT 语句的结果可进行集合操作。 集合操作主要包括并操作 UNION、 交操作 INTERSECT 和差操作 EXCEPT。
基于派生表的查询
子查询不仅可以出现在 WHERE 子句中, 还可以出现在 FROM 子句中, 这时子查询生成的临时派生表 ( derived table ) 成为主查询的查询对象。
数 据 更 新
插入数据
插入元组
插入子查询结果
修改数据
- 修改某一个元组的值
[例 3.73] 将学生 201215121 的年龄改为 22 岁。
1 | UPDATE Student |
- 修改多个元组的值
[例 3.74] 将所有学生的年龄增加 1 岁。
1 | UPDATE Student |
- 带子查询的修改语句
子查询也可以嵌套在 UPDATE 语句中, 用以构造修改的条件。
[例 3.75] 将计算机科学系全体学生的成绩置零。
1 | UPDATE SC |
删除数据
删除某一个元组的值
[例 3.76] 删除学号为 201215128 的学生记录。1
2
3DELETE
FROM Student
WHERE Sno='201215128';删除多个元组的值
[例 3.77] 删除所有的学生选课记录。1
2DELETE
FROM SC;这条 DELETE 语句将使 SC 成为空表, 它删除了 SC 的所有元组。
带子查询的删除语句
子查询同样也可以嵌套在 DELETE 语句中, 用以构造执行删除操作的条件。
[例 3.78] 删除计算机科学系所有学生的选课记录。1
2
3
4
5
6DELETE
FROM SC
WHERE SnoIN
( SELETE Sno
FROM Student
WHERE Sdept= 'CS' );
空值的处理
所谓空值(NULL)就是“ 不知道” 或“ 不存在” 或“ 无意义” 的值
空值的判断 : 判断一个属性的值是否为空值, 用 IS NULL 或 IS NOT NULL 来表示。
空值的约束条件 属性定义( 或者域定义) 中有 NOT NULL约束条件的不能取空值, 加了 UNIQUE 限制的属性不能取空值, 码属性不能取空值。
空值的算术运算 、 比较运算和逻辑运算
空值与另一个值( 包括另一个空值) 的算术运算的结果为空值, 空值与另一个值( 包括另一个空值) 的比较运算的结果为UNKNOWN。 有了 UNKNOWN 后, 传统的逻辑运算中二值(TRUE, FALSE) 逻辑就扩展成了三值逻辑。AND、 OR、 NOT 的真值表如表 3.8 所示, 其中丁表示 TRUE, F 表示 FALSE,U 表示 UNKNOWN。
视 图
视图是从一个或几个基本表( 或视图) 导出的表。 它与基本表不同, 是一个虚表。 数据库中只存放视图的定义, 而不存放视图对应的数据, 这些数据仍存放在原来的基本表中。所以一旦基本表中的数据发生变化, 从视图中査询出的数据也就随之改变了。 从这个意义上讲, 视图就像一个窗口, 透过它可以看到数据库中自己感兴趣的数据及其变化。
定义视图
删除视图
查询视图
定义视图并查询视图与基于派生表的查询是有区别的。 视图一旦定义, 其定义将永久保存在数据字典中, 之后的所有查询都可以直接引用该视图。 而派生表只是在语句执行时临时定义, 语句执行后该定义即被删除。
更新视图
由于视图是不实际存储数据的虚表, 因此对视图的更新最终要转换为对基本表的更新。 像查询视图那样, 对视图的更新操作也是通过视图消解, 转换为对基本表的更新操作
为防止用户通过视图对数据进行增加、 删除、 修改时, 有意无意地对不属于视图范围内的基本表数据进行操作, 可在定义视图时加上 WITH CHECK OPTION 子句。 这样在视图上增、 删、 改数据时, 关系数据库管理系统会检査视图定义中的条件, 若不满足条件则拒绝执行该操作。
视图的作用
- 试图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当利用视图可以更清晰地表达查询