3.1 SQL概述
3.1.1 SQL的特点
SQL之所以能够为用户和业界所接受并称为国际标准,是因为它是一个综合的、功能极强同时又简洁易学的语言。SQL集数据查询、数据操纵、数据定义和数据控制功能于一体,其主要特点包括以下几部分:
1. 综合统一
SQL集数据定义语言、数据操纵语言、数据控制语言的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括以下一系列操作要求:
- 定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库。
- 对数据库中的数据进行查询和更新。
- 数据库重构和维护。
- 数据库安全性、完整性控制,以及事务控制。
- 嵌入式SQL和动态SQL定义。
2. 高度非过程化
只要提出“做什么”,而无须指明“怎么做”,因此无须了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。
3. 面向集合的操作方式
SQL采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
4. 以同一种语法结构提供多种使用方式
SQL既是独立的语言,又是嵌入式语言。
作为独立语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作;
作为嵌入式语言,SQL语句能够嵌入到高级语言(例如C、C++、Java)程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL的语法结构基本上是一致的。这种以统一的语法结构提供多种不同使用方式的做法,提供了极大的灵活性与方便性。
5. 语言简洁、易学易用
SQL功能极强,但由于设计巧妙,语言十分简洁,完成核心功能只用了9个动词,如下表所示。SQL接近英语口语,因此易于学习和使用。
SQL功能 | 动词 |
---|---|
数据查询 | SELECT |
数据定义 | CREATE, DROP, ALTER |
数据操纵 | INSERT, UPDATE, DELETE |
数据控制 | GRANT, REVOKE |
3.2 学生-课程数据库
本章以学生-课程数据库为例来讲解SQL的数据定义、数据操纵、数据查询和数据控制语句。
3.3 数据定义
关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有模式、表、视图和索引等。因此SQL的数据定义功能包括模式定义、表定义、视图和索引的定义。
操作对象 | 创建 | 删除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。在进行查询优化和查询处理时,数据字典中的信息是其重要依据。
3.4 数据查询
数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:
SELECT [ALL|DISTINCT] <目标列表达式> [, <目标列表达式>] ...
FROM <表名或视图名> [, <表名或视图名>...] | (<SELECT语句> [AS] <别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
整个SELECT语句的含义是,根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表。
如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。
如果有ORDER BY子句,则结果表还要按<列名2>的值的升序或降序排序。
SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。
3.5 数据更新
3.5.1 插入数据
1. 插入元祖
INSERT
INTO <表名> [(<属性列1> [,<属性列2>]...]
VALUES(<常量1> [,<常量2>]...)
eg:
INSERT
INTO Student(Sno, Sname, Ssex, Sdept, Sage)
VALUES('201215128', '陈冬', '男', 'IS', 18);
2. 插入子查询结果
INSERT
INTO <表名> [<属性列1> [,<属性列2>...])]
子查询;
eg:
INSERT
INTO Dept_age(Sdept, Avg_age)
SELECT Sdept, AVG(Sage)
FROM Student
GROUP BY Sdept;
3.5.2 修改数据
修改操作又称为更新操作,其语句的一般格式为
UPDATE <表名>
SET <列名> = <表达式> [, <列名>=<表达式>]...
[WHERE <条件>];
eg:
UPDATE Student
SET Sage=22
WHERE Sno='201215121';
3.5.3 删除数据
删除语句的一般格式为
DELETE
FROM <表名>
[WHERE <条件>];
3.6 空值的处理
- 空值的产生
- 空值的判断
判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示 - 空值的约束条件
属性定义(或者域定义)中有NOT NULL约束条件的不能取空值,加了UNIQUE限制的属性不能取空值,码属性不能取空值。 - 空值的算术运算、比较运算和逻辑运算
3.7 视图
视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。
3.7.1 定义视图
1. 建立视图
SQL语言用CREATE VIEW命令建立视图,其一般格式为
CREATE VIEW <视图名> [(<列名> [,<列名>]...)]
AS <子查询>
[WITH CHECK OPTION]
其中,子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则取决于具体系统的实现。
WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。
2. 删除视图
DROP VIEW <视图名> [CASCADE];
3.7.2 查询视图
视图定义后,用户就可以像对基本表一样对视图进行查询了。
从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解(view resolution)
3.7.3 更新视图
由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。
3.7.4 视图的作用
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当利用视图可以更清晰地表达查询