第3章关系数据库标准语言SQL
3.1SQL概述
SQL的定义:
- 结构化查询语言
- 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。
- SQL只要提出“做什么”,无须了解存取路径。操作对象是一条记录
SQL的特点:
- 综合统一
- 高度非过程化
- 面向集合的操作方式
- 以同一种语法结构提供多种使用方式
- 语言简洁,易学易用
SQL功能 | 动词 |
---|---|
数据查询 | select |
数据定义 | create、drop、alter |
数据操纵 | insert、update、delete |
数据控制 | grant、revoke |
3.1.3SQL的基本概念
基本表
- 基本表示本身独立存在的表,
- 在关系数据库管理系统中一个关系就对应一个基本表
- 一个或多个基本表对应一个存储文件
- 一个表可以带若干索引,索引也存放在存储文件中
存储文件
- 存储文件的逻辑结构组成了关系数据库的内模式
- 存储文件的物理结构对最终用户是隐蔽的
视图
- 从一个或几个基本表导出的表
- 数据库中只存放视图的定义而不存放视图对应的数据
- 视图是一个虚表
- 用户可以在视图上再定义视图
3.3数据定义
一个关系数据库管理系统的实例可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象
3.3.1模式的定义与删除
定义
CREATE SCHEMA <模式名>AUTHORIZATION<用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>];
删除模式
DROP SCHEME <模式名><cascade|RESTRICT>
3.3.2基本表的定义、删除与修改
定义
create table 表名(
列名 数据类型 not null, //非空性约束
列名 数据类型 unique, //唯一性约束
列名 数据类型 check(检查条件),//检查性约束
............
constraint 主键名 primary key(主属性列表),
constraint 外键名 foreign key (外键属性列表) references 被参考表名(参考列),
constraint 检查名 check(校验条件)
)
[例3.10] 增加课程名称必须取唯一值的约束条件。
ALTER TABLE Course ADD UNIQUE(Cname);
UNIQUE:不能重复可以为空
主码:不能重复不可以为空
3.3.3索引的建立与删除
建立索引的目的:加快查询速度
- 顺序文件上的索引
- B+树索引
- 散列索引
- 位图索引
3.4数据查询
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]···
FROM <表名或视图名> [,<表名或视图名>···]|(<SELECT 语句>) [AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
3.4.1单表查询
指定DISTINCT关键词,去掉表中重复的行
- 常用查询条件:
比较:= , > , < , >= , <= , != , <>(也是不等于), !> , !< , not+上述运算符
确定范围:between and , not between and
- 如
where age between 18 and 20;
等价于where age <=18 and age<=20;
- 如
确定集合:in , not in
字符匹配:like , not like
like
可以当做=
用以比较字符串,也可以使用通配符来模糊匹配字符串。%
表示匹配0个或多个字符,_
匹配一个。\%
用来转义百分号,以此类推。如果用户要查询的字符串本身就含有通配符%或_,这时就要使用ESCAPE‘<换码字符>’短语就可以对通配符转义了
空值:is null,is not null
- 空值不能用
=null
判断。因为null
不等于任何值。
- 空值不能用
逻辑运算:and , or , not
ORDER BY子句
- 可以按一个或多个属性列排序
- 升序:ASC;降序:DESC;默认为升序 对于空值,默认为最大,
- 例如按升序排,含空值的元组最后显示,按降序排,空值的元组则最先显示。
聚集函数
如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。
注意:where子句中是不能用聚集函数作为条件表达式的,聚集函数只能用于select子句和group by中的having子句。
GROUP BY子句
- 该子句将查询结果按某一列或多列的值分组,值相等的为一组。
- 对查询结果分组的目的是为了细化聚集函数的作用对象,如果未对查询结果分组,聚集函数将作用于整个查询结果,分组后聚集函数将作用于每一组,即每一组都有一个函数值。
- where子句和having短语的区别在于作用对象不同,where子句作用于基本表或视图,从中选择满足条件的元组。Having短语作用于组,从中选择满足条件的组。
注意:where子句中是不能用聚集函数作为条件表达式的,
3.4.2连接查询
连接查询:同时涉及两个以上的表的查询
等值与非等值连接查询
等值连接:
若在等值连接中把目标列中重复的属性列去掉则为自然连接
自身连接:一个表与其自己进行连接,需要给表起别名以示区别
外连接
左外连接
3.4.3嵌套查询
带有IN谓词的子查询
带有比较运算符的子查询
带有ANY(SOME)或ALL谓词的子查询
带有EXISTS谓词的子查询
- EXISTS和NOT EXISTS谓词子查询
....
where exists (select .........)
当后面的子查询结果集不为空时,exists返回true
,否则返回false
。
not exists和exists刚好相反。
3.4.4集合查询
3.5 数据更新
3.5.1 插入数据
两种形式:一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组
1、插入元组
INTO子句
- 指定要插入数据的表名和属性列
- 属性列的顺序可与表定义中的顺序不一致
- 没有指定属性列:表示要插入的是一条完整的个元组,且属性列属性与表定义中的顺序一致
- 指定部分属性列:插入的元组在其余属性列上取空值
插入子查询结果
可以一次插入多个元组
关系数据库管理系统在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则
- 实体完整性
- 参照完整性
- 用户定义的完整性
- NOT NULL约束
- UNIQUE约束
- 值域约束
3.5.2修改数据
修改操作又称为更新操作,
update 表名 set 列名=表达式,列名=表达式,..... where 条件
功能:
- 修改指定表中满足where子句条件的元组
- set子句给出<表达式>的值用于取代相应的属性列
- 如果省略where子句,表示要修改表中的所有元组
三种修改方式:
修改某一个元组的值
修改多个元组的值
带子查询的修改语句
关系数据库管理系统在执行修改语句时会检查所插元组是否破坏表上已定义的完整性规则
- 实体完整性
- 参照完整性
- 用户定义的完整性
- NOT NULL约束
- UNIQUE约束
- 值域约束
3.5.3删除数据
delete from 表名 where 条件。
-
删除某一个元组的值
3.7视图
视图是从一个或几个基本表导出的表,是一个虚表,只存放视图的定义,而不存放视图对应的数据
3.7.1定义视图
建立视图
- with check option表示对视图进行update、insert和delete操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
- 关系数据库管理系统执行create view语句时,只是把视图定义存入数据字典,并不执行其中的select语句
- 在对视图查询时,按视图的定义从基本表中将数据查出
定义IS_Student视图时加上了with check option,对该视图进行插入、修改和删除操作时,关系数据库管理系统会自动加上Sdept="IS"的条件。
2.删除视图
因为IS_S1视图上还道出了IS_S2视图,所以被拒绝执行。如果确定要删除,需要级联删除
3.7.2 查询视图
用户角度:查询视图与查询基本表相同
关系数据库管理系统实现视图查询的方法
视图消解法
- 进行有效性检查
- 转换成等价的对基本表的查询
- 执行修正后的查询
有些情况下,视图消解法不能生成正确的查询。
3.7.3 更新视图
由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。
一般的,行列子集视图是可更新的,并不是所有的视图都是可更新的。
视图的作用(优点)
习题
1 .试述 SQL 语言的特点。
- (l)综合统一。 sQL 语言集数据定义语言 DDL 、数据操纵语言 DML 、数据控制语言 DCL 的功能于一体。
- (2)高度非过程化。用 sQL 语言进行数据操作,只要提出“做什么”,而无需指明“怎么做”,因此无需了解存取路径,存取路径的选择以及 sQL 语句的操作过程由系统自动完成。
- (3)面向集合的操作方式。 sQL 语言采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
- (4)以同一种语法结构提供两种使用方式。 sQL 语言既是自含式语言,又是嵌入式语言。作为自含式语言,它能够独立地用于联机交互的使用方式;作为嵌入式语言,它能够嵌入到高级语言程序中,供程序员设计程序时使用。
- (5)语言简捷,易学易用。
2 .试述 SQL 的定义功能。S
SQL 的数据定义功能包括定义表、定义视图和定义索引。 SQL 语言使用 cREATE TABLE 语句建立基本表, ALTER TABLE 语句修改基本表定义, DROP TABLE 语句删除基本表;使用 CREATE INDEX 语句建立索引, DROP INDEX 语句删除索引;使用 CREATE VIEW 语句建立视图, DROP VIEW 语句删除视图。
3.什么是基本表?什么是视图?
两者的区别和联系是什么?基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中。视图在概念上与基本表等同,用户可以如同基本表那样使用视图,可以在视图上再定义视图。
4 .试述视图的优点。
- ( l )视图能够简化用户的操作;
- ( 2 )视图使用户能以多种角度看待同一数据;
- ( 3 )视图对重构数据库提供了一定程度的逻辑独立性;
- ( 4 )视图能够对机密数据提供安全保护。
5.所有的视图是否都可以更新?为什么?
不是。视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新。因为有些视图的更新不能惟一有意义地转换成对相应基本表的更新,所以,并不是所有的视图都是可更新的
6 .哪类视图是可以更新的?哪类视图是不可更新的?各举一例说明。
答:基本表的行列子集视图一般是可更新的。若视图的属性来自集函数、表达式,则该视图肯定是不可以更新的。