第四讲 结构化查询语言SQL
1 SQL发展简史
SQL是用于对存放在计算机数据库中的数据进行组织、管理和检索的工具。"SQL"是Structured Query Language的缩写。
SQL是和关系数据库交织在一起发展起来的。
表4.1 SQL发展里程碑| 日期 | 事 件 |
| 1970 | Codd定义关系数据库模式 |
| 1974 | IBM开始其System/R计划 |
| 1974 | 首篇文章描述SEQUEL语言 |
| 1978 | System/R用户试验 |
| 1979 | Oracle首次引入商用RDBMS |
| 1981 | 关系技术引入Ingres |
| 1981 | IBM公布SQL/DS |
| 1982 | ANSI成立SQL标准委员会 |
| 1983 | IBM公布DB2 |
| 1986 | 批准ANSI SQL标准 |
| 1986 | Sybase引入用于事务处理的RDBMS |
| 1987 | 批准ISO SQL标准 |
| 1988 | Ashton-Tate和Microsoft公布用于OS/2的SQL Server |
| 1988 | IBM公布DB2 Version 2 |
| 1989 | 首次提供用于OS/2的SQL数据库服务器 |
| 1989 | 成立SQL |
| 1991 | 公布SQL Access Group规程 |
| 1992 | Microsoft公布ODBC规程 |
| 1992 | 首次提供用于Netware的SQL数据库服务器 |
| 1992 | 批准ANSI SQL2标准 |
| 1993 | 首次提供ODBC产品 |
2 SQL语言特点
图4.1描述了SQL的工作机理。

图4.1 用SQL进行数据存取
结构化查询语言这一名称实际上有些不贴切。
首先,尽管查询是设计SQL的最初目的,检索数据也仍然是其最重要的功能之一,但SQL决不仅仅是一个查询工具。SQL用于控制DBMS提供给用户的所有功能,包括:
数据定义(Data definition):SQL可用于定义被存放数据的结构和组织,以及数据项之间的关系。
数据检索(Data retrieval):SQL能使用户或应用程序从数据库中检索数据并使用这些数据。
数据操纵(Data manipulation):用户或应用程序通过SQL更改数据库,如增加新数据,删除旧数据,修改已存入的数据等。
存取控制(Access control):SQL可用来限制用户检索,增加和修改数据的权限,一保护所存储的数据不被非法存取。
数据共享(Data sharing):SQL可用于调整数据让并发用户共享,以保证用户之间彼此不受影响。
数据完整性(Data integrity):SQL能对数据库的完整性条件作出规定,以使其不会因为修改紊乱或系统出错而被破坏。
第二,SQL并不是一种像COBOL,FORTRAN和C语言等那样完整的计算机语言。SQL没有用于条件测试的IF语句,没有用于程序分支的GOTO语句,也没有用于循环的DO或FOR语句。
确切地说,SQL是一种数据库子语言(sublanguage)。也称为第四代语言(4GL),一种非过程语言。
SQL语言简洁,为完成其核心功能只用了6个动词:SELECT、CREATE、INSERT、UPDATE、DELETE、GRANT(REVOKE)。
ANSI SQL的类型
目前的ANSI SQL标准认可四种SQL语句的方法。采用何种方法依赖于应用程序编程环境:
交互式SQL(Interactive SQL):类似于Forpro,以命令行形式执行SQL语句。
嵌入式SQL(Embedded SQL):通过在SQL语句前假如一个关键字来执行SQL语句。例如C中的EXEC SQL。
模块SQL(Module SQL):允许创建独立于3GL源代码的编译SQL语句,然后把编译好的目标模块连入可执行程序。SQL模块类似于Visual Basic代码模块,模块中包含变量说明和用来容纳查询结果集合的临时表,可以把变元值从3GL传递给SQL模块说明的过程参数。在数据库服务器上执行预编译查询的存储过程有许多与模块SQL共同的性质。
动态SQL(Dynamic SQL):可以创建在编写语句时无法预测其内容的SQL语句(前面的多种SQL类型属于静态SQL类)。例如:读者想设计一个可以针对多种数据库处理查询的Visual Basic应用程序。动态SQL可以以字符串形式向数据库传送查询。例如,可以向数据库传送一个查询并获得详细的信息,这些信息来自描述数据库表及表中字段的数据库字典。在知道了数据库结构之后,应用程序用户可以创建向查询添加正确字段名的定制查询。
SQL的作用
SQL本身不是一个数据库管理系统,也不是独立的产品。事实上,SQL是数据库管理系统的一个组成部分,是用户和DBMS通信的语言和工具。

图4.2 典型DBMS的组成
SQL有下列作用:
SQL是一种交互式查询语言
SQL是一种数据库编程语言
SQL是一种数据库管理语言
SQL是一种客户机/服务器语言
SQL是一种分布式数据库语言
SQL是一种数据库网关语言
3 SQL语言应用
3.1 数据定义(DDL)
(1)基表定义:CREATE TABLE
CREATE TABLE 表名
(域名1 数据类型1 [列完整性约束条件][, 域名2 数据类型2 [列完整性约束条件]]…)[in 数据库空间]
例:定义书中图17.8的关系STU
CREATE TABLE STU
(S CHAR(6) NOT NULL, SN CHAR(10) NOT NULL, SA INTEGER NOT NULL, SD CHAR(8) NOT NULL)
(2)视图定义:CREATE VIEW,Access数据库目前不支持
CREATE VIEW 视图名 [(域名表)] AS (SELECT语句)
(3)索引定义:CREATE [UNIQUE] INDEX,用于对基表建立索引以提供对基表的存取路径
索引可以加快数据库中有关数据的存取速度。
CREATE [UNIQUE] INDEX 索引名 ON [(域名表)] AS (SELECT语句)
例:对书中图17.8的关系STU的S域创建名为SNO的索引
CREATE UNIQUE INDEX SNO ON STU(S)
(4)基表删除:DROP TABLE
DROP TABLE 基表名
例:DROP TABLE STU
(5)视图删除:DROP VIEW
DROP VIEW 视图名
(6)索引删除:DROP INDEX
DROP INDEX 索引名 ON 基表名
例:DROP INDEX SNO ON STU
(7)基表修改:ALTER TABLE
ALTER TABLE 表名 ADD(OR MODIFY) 域名 数据类型
例:在表STU上增加一个域名为性别(SE),其数据类型为CHAR(4)
ALTER TABLE STU ADD SE CHAR(4)
例:将表STU上的S域的字符串长度改为10。
ALTER TABLE STU MODIFY S CHAR(10) !Access数据库不支持MODIFY
3.2 数据操作(DML)
数据操作包括数据的查询、插入、删除、修改。命令分别为SELECT、INSERT、DELETE、UPDATE
3.3 数据控制(DCL)
SQL的数据控制功能包括存取控制和完整性控制,为了防止非法用户对数据的使用和破坏,提供了GRANT和REVOKE语句,是对操作的授权控制语句。