第 3章 SQL语言
本章主要介绍了结构化查询语言 SQL。 SQL
是对数据库中的数据进行组织、管理和检索
的工具。 SQL语言是使用关系模型的数据库
应用语言,本章以 VFP为基础讲述 SQL的基
本概念及其语句的基本用法。
3.1 SQL基础
? SQL是关系型数据库管理系统的标准语言。可以
用来执行各种各样的操作。
? 当用户需要处理数据库中的数据时,就可以通过
SQL语言发出请求,数据库对 SQL请求进行处理,
并将处理的结果其返回给用户。
计算机系统
SQL请求
数据库管理系

数据库
数据
SQL是一种能够控制数据库管理系统并能
与之交互的综合性语言划分为如下几类,
? 1.?数据定义( Data definition)语言 用于定义被
存放的数据的结构和组织,以及数据项之间的关
系;
? 2.?数据检索( Data retrieval)语言 用户或应用
程序通过 SQL语言从数据库中检索到并能使用符
合条件的数据;
? 3.?数据操作( Data manipulation)语言 用户或
应用程序通过 SQL语言更改数据库,增加新数据、
删除旧数据、修改已有数据;
? 4.?数据控制( Data control)语言 用户或应用程
序通过 SQL语言控制其对数据库中数据的操作。
3.1.2 SQL语句
语 句 说 明 语 句 说 明
数 据 处 理
SELECT 检索数据库中的数据 INSERT 插入新的数据行
DELETE 删除数据行 UPDATE 修改数据
数 据 定 义
CREATE TABLE 建立一个新表 DROP TABLE* 删除一个表
ALTER TABLE* 修改一个表的结构 CREATE VIEW 建立一个视图
DROP VIEW* 删除一个视图 CREATE INDEX* 建立一个索引
DROP INDEX* 删除一个索引
存 储 控 制
GRANT 授予用户存取权限 REVOKE 取消用户存取权限
事 物 控 制
COMMIT 提交事务 ROLLBACK 回滚事务
编 程 SQL
DECLARE 定义一个查询光标 OPEN 打开查询数据的光标
FETCH 检索查询结果的一行 CLOSE 关闭光标
带 *号的不是 ANSI/ISO SQL1标准的内容。
3.1.3 标量操作符
? 算术运算符有,+(加),-(减),*(乘),/
(除),%(取模)。。
? 比较运算符有,<,>,=,>=,<=,<>。
? 字符串运算符有,+。, +”实现字符串之间和连
接操作。。
? 布尔操作符有,NOT,AND,OR。布尔操作符在
数据库中有两个不同的约定,取决于其是应用于
位串还是用于其他数据类型。操作符 NOT,AND
和 OR应用于所有数据类型。
? 位运算符有,&(与),|(或),^(异或),~
(求反)。
3.1.4 谓词
? 谓词定义应用于表中行的逻辑条件。 SQL
语言支持下列关系操作符,
? BETWEEN操作符
? IN操作符
? LIKE操作符
? ULL操作符
? ALL和 ANY操作符
? EXISTS函数
3.1.5 集合函数
函 数 说 明
AVG(expr) 一列中值的平均值。列中只能包含数值型数据
COUNT(expr),
COUNT(*)
一列中的值数(如果将一个列名指定为 expr)或表中的行数或组中的行值
(如果指定 *)。 COUNT(expr) 忽略空值,但 COUNT(*) 在计数中包含它

MAX(expr) 列中的最大值(文本数据类型按字母顺序排在最后的)。忽略空值
MIN(expr) 列中的最小值(文本数据类型按字母顺序排在最前的)。忽略空值
SUM(expr) 列中值的合计。列中只能包含数值型数据
3.1.6 数量函数
函 数 说 明
ABS(n) 返回数值表达式中 n的绝对值(即负值返回的是正值)
COS(n) 计算 n的余弦值。 n以及结果值为 FLOAT数据类型
EXP(n) 计算 en 的值
LOG(n) 计算 n的自然对数值(即以 e为底)
POWER (X,Y) 计算 XY值
SIN(n) 计算 n的正弦值。 n以及返回的结果值为 FLOAT数据类型
SQRT(n) 计算 n的平方根
TAN(n) 计算 n的正切值。 n以及结果值为 FLOAT数据类型
? 1 数值函数
? 2 日期函数
函 数 说 明
DATEDIFF(item,dat1,dat2) 计算两个日期 dat1和 dat2之差,并以值 item指定的单位作为整数返回结果
DATEADD(item,number,da
te) 添加 item指定的单位的数字 number到指定的日期 date中
?3 字符串函数
函 数 说 明
LOWER(Z1) 将串 Z1的所有大写字母变为小写字母。原来小写的字母和数字及其他字符不变
RIGHT(Z,length) 返回串 Z中的最后 Length个字符
SPACE(length) 返回含有由 length指定的长度的空格的串
SUBSTRING(Z,a,Leng
th) 创建串 Z中从位置 a开始的部分字符串,长度为 Length
3.1.7 空值
?空值( NULL)是指定给列的特殊值。空值指列中的信
息未知或不可用。在布尔操作 AND,OR和 NOT中,空
值是由下列真值表而指定。
AND TRUE FALSE NULL
TRUE TRUE FALSE NULL
FALSE FALSE FALSE FALSE
NULL NULL FALSE NULL
? AND运算真值表
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL
NOT TRUE FALSE NULL
FALSE TRUE NULL
?OR运算真值表
?NOT运算真值表
3.2 SQL数据定义语言
? 本节介绍有关数据定义语言( DDL)的所有
SQL语言语句,DDL语句分为三组,
? 第一组包括创建对象的语句;
? 第二组包括修改对象的语句;
? 第三组包括删除对象的语句。
3.2.1 创建数据库对象
? 一个数据库包含许多不同的对象。数据库
的所有对象可以是物理的或逻辑的。
? 物理对象与数据在物理设备(盘)上的组
织有关,
? 逻辑对象描述数据库的用户视图。数据库、
表、列和视图(虚拟表)是逻辑对象的例
子。
3.2.2 数据库的创建
? 数据库的创建语句( CREATE DATABASE)的一般
形式为,
? CREATE DATABASE 数据库名 [ON [PRIMARY] 数
据库文件 1{,数据库文件 2}...]
? [LOG ON数据库文件 3{,数据库文件 4}...] [FOR
RESTORE]
? 理想的情况下,只有有限的用户被授权可创建数
据库。系统安装之后,只有系统管理员有这个特
权。系统管理员可以通过 GRANT CREATE
DATABASE语句将这个特权授给其他用户。数据
库的创建者称为该数据库的所有者,并对数据库
和其对象有特殊的权利。
3.2.3 基本表的创建
? 基本表的创建语句( CREATE TABLE)在当前打开的数
据库中创建一个新数据表。语句的基本形式为,
? CREATE TABLE 表名 [字段 1 类型 1 [NOT NULL/NULL]
? [{,字段 2 类型 2 [NOT NULL/NULL]}...]]
? table_name是所创建的数据表的名字。
Col_name1,Col_name2,...是表中列的名。 Type1,
Type2...是相应列的数据类型(。表名字与拥有者名一
起在数据库中必须是唯一的,同样,列名字在表中也
必须是唯一的。
? 如果说明为 NOT NULL,则列中不允许分配空值
? 数据库创建之后,在数据库中创建表的特权授给系统
管理员和数据库拥有者。
SQL的数据类型
Type Width nPrecision 说 明
CHAR N — 宽度为 n的字符字段
INTEGER — — 整型
D — — 日期型
T — — 日期时间型
N N d 宽度为 n、有 d位小数的数值型字段
F N d 宽度为 n、有 d位小数的浮点数值型字段
B — d 双精度型
Y — — 货币型
L — — 逻辑型
MEMO — — 备注型
G — — 通用型
3.2.4 修改数据表结构
? 修改数据表结构语句( ALTER TABLE)有
下列基本形式,
? ALTER TABLE 表名 ;
? ADD 字段 类型 [NULL | IDENTITY][,字段
类型 [NULL | IDENTITY] ;
? ALTER COLUMN 字段 类型 {NULL |
IDENTITY}
? [{,Col_name Type NULL | IDENTITY}...]
3.2.5 删除数据库对象
? 删除数据库对象语句的形式,
? DROP DATABASE 数据库 1{,数据库 2,..}
? 可以删除一个或多个数据库。这意味着数
据库 DBMS系统中删除,构成该数据库所用
的全部操作系统文件都被删除。
? 使用下列语句可以从数据库中删除一个或
多个表,
? DROP TABLE 表名 1{,表名 2...}
3.3 简单 SQL数据查询语言
? 3.3.1 SELECT语句的基本形式
? 查询是 SQL语言的核心。用于表达 SQL查询
的 SELECT语句是功能最强,也是功能最复
杂的 SQL语句。使用这个语句使从数据库
(甚至从多个数据库)的一个或多个表中
查询信息成为可能。 SELECT语句执行的结
果是产生符合条件的所有数据记录的另一
个表,也称为结果集。
一个完整的 SELECT语句包括 6个子句。
? ① ?SELECT子句列出所有要求 SELECT语句检索的
数据项;
? ② ?FROM子句列出包含索要查询数据的表;
? ③ ?WHERE子句提供 SQL只查询某些行的数据,也
就是执行查询的条件;
? ④ ?GROUP BY 用以制定汇总查询,即不是对每一
行产生一个查询结果,而是将相似的行进行分组,
再对每一组产生一个汇总结果;
? ⑤ ?HAVING子句告诉 SQL只产生由 GROUP BY 得到
的某些组的结果;
? ⑥ ?ORDER BY子句将查询结果按照一列或多列中
的数据排序。
? SELECT语句最简单的形式包含 SELECT和 FROM子
句。这种形式的 SELECT语句格式是,
? SELECT [ALL | DISTINCT] 字段列表 FROM 表名
[表别名 ][{,tab_alias2}]...]
? tab_1,tab_2,...是被检索的表名。
tab_alias1,tab_alias2,...是被检索表的别名。别名
是相应表的另一个名字,它可以用简短的方式引
用表,或用作引用同一物理表的两个逻辑实例。
? column_list包含下列一个或多个说明。星号( *)
表示在 FROM子句中指定表的全部列。
3.3.2 WHERE子句
? WHERE子句就是用来指定这些查询条件的,主要
可以分为如下几类,
? ① ?比较条件 通过比较两个表达式的值,选取使
比较表达式成立的数据行。
? ② ?范围条件 判断一个表达式的值是否落在某一
个指定的范围内,选取落在范围内的数据行。
? ③ ?组属条件 判断一个表达式的值是否落在某一
组指定的组内,选取属于这一组内的数据行。
? ④ ?模式匹配条件 判断一个包含字符串的数据列
的值是否匹配某一指定的模式,选取于模式相匹
配的数据行。
? ⑤ ?空值条件 判断某个列是否有空值,选取为空
值或不为空值的数据行。
? WHERE子句条件可以包含单个条件或多个条件。
多个条件可以使用布尔操作符 AND,OR和 NOT
建立。
? 涉及 NULL值的查询,为检索列中有 NULL值的行,
SQL包括操作符 IS [NOT] NULL。
? LIKE是将列值与特定模式相比较的操作符,一
般形式为,COLUMN [NOT] LIKE '模式 '
? 模式中的通配符有特殊的解释。其中的两个为
百分号( %)表示任意零个或多个字符序列,
下划线( _)表示任意单个字符。
3.3.3 GROUP BY子句
? GROUP BY子句将一列或多列具有相同列值
的行定义为一组,按组输出查询结果。
3.3.4 集合函数
? SQL语言支持 5个集合函数,MIN,MAX,SUM、
AVG,COUNT。
? 集合函数 MIN和 MAX分别计算列中的最小值和最
大值。如果有 WHERE子句,MIN和 MAX函数返回
所选行的最大值和最小值。
? 集合函数 SUM计算列中值的总和,SUM函数的参
数必须是数值型的。
? 集合函数 AVG计算列中所有值的平均值,AVG函
数的参数必须是数字型的。
? 集合函数 COUNT,COUNT ([DISTINCT] 列名 )计
算指定列 Col_name中非空值的个数; COUNT(*)
计算表中的行数,或 WHERE条件为真的行数。
3.3.5 HAVING子句
? HAVING子句定义应用到分组行中的条件,
HAVING子句对分组行的意义与 WHERE子句
对每个行的意义是相同的。它的语法是,
? HAVING 条件 这里条件包含集合函数或常
量。
? WHERE和 HAVING子句都是条件子句,但两
者在功能上是明显不同的,HAVING子句则
对结果组进行选择,使不满足条件的结果
行不出现在查询结果中。此外,HAVING子
句只能用在有 GROUP BY(分组)子句查询
中。
3.3.6 ORDER BY子句
? ORDER BY子句定义查询结果中行的特定顺序。
这个子句有下列语法,
? ORDER BY {[列名 | 列编号 [ASC | DESC]]},..,
? 列名定义显示顺序,列编号是可选的说明,按
SELECT列表中所有列的顺序来标识( 1代表第 1
列,2代表第 2列,等等)。 ASC指明按升序排列,
DESC指明按降序排列,缺省的为 ASC。
3.3.7 简单子查询
? SQL语句提供将列值与另一个 SELECT语句结果
比较的能力。嵌套在另一个 SELECT语句的
WHERE子句中的 SELECT语句称为子查询,子查
询中的第一个 SELECT语句通常称为外查询,相
对应的内查询指的是第二个 SELECT语句。内查
询总是首先计算,外查询接受内查询的值。
? 子查询有两种:简单子查询、相关子查询。
? 简单子查询中内查询一次计算出精确值,相关子
查询与简单子查询区别在于其值由外查询的变量
决定。因此,相关子查询的内查询每当系统从外
查询检索一个新行时都要进行计算估值。
3.4 复杂 SQL数据查询语言
? SQL提供一种查询方法,能将存储于不同数据
表中的数据进行连接查询。
? 在 SELECT语句中的 FROM子句指定要连接的表,
表名后的字母称为该表的别名,WHERE子句
指定了需要连接的表的连接条件。
? 连接条件不必一定使用等号。使用一般连接条
件(也就是,使用其他比较操作符而不是等号)
的连接操作称为比较连接。
3.5 SQL数据操作语言
? 除了已在前面介绍的 SELECT语句之外,还
有另外三个 DML语句,INSERT,UPDATE和
DELETE。像 SELECT语句那样,三个修改语
句或是对表进行操作或是对视图进行操作。
3.5.1 INSERT语句
? INSERT语句将行(或行的部分)插入表中。它有两种
不同的形式,
? INSERT INTO 表名 [(字段 1 [,字段 2,...])];
? VALUES (表达式 1 [,表达式 2,...])
? INSERT INTO 表名 FROM ARRAY 数组名 | FROM
MEMVAR
? 使用第一种形式,将一行(或行的部分)插入到表
tab_name或视图 view_name的基表中;第二种形式的
INSERT语句插入来自 SELECT语句或来自使用 EXECUTE
语句执行的存储过程的结果集(存储过程必须返回数据,
然后将数据插入表中),SELECT语句可以将来自不同
或相同表的值作为 INSERT语句的目标,只要这些列的
类型相兼容即可。
3.5.2 UPDATE语句
? UPDATE语句修改表中行的值,它的一般形式为
? UPDATE 表名 | 视图名 ;
? SET 字段 1 = 表达式 2 [{字段 2 = 表达式 2}...]
? [FROM 表名 1 | 视图 1 [{表名 2 | 视图 2}...]]
? [WHERE 条件 ]
? 表名中的行(或与视图名有关的表中的行)按照
WHERE子句的条件修改。对于每个要修改的行,
UPDATE语句在 SET子句中修改列的值,为相关的列赋
给常量(或一般表达式)。如果 WHERE子句省略,
UPDATE语句修改表的全部行。
? 注,UPDATE语句只能修改一个表的数据。
3.5.3 DELETE语句
? DELETE语句删除表中的行。语句格式,
? DELETE FROM [数据库名 ]表名 [WHERE 条
件 ]
? 满足 WHERE子句中条件的所有行都将被做
删除标记。在 DELETE语句中不允许明确地
命名列,因为适当行的所有列都将被删除。
? DELETE语句中的 WHERE子句可以包含子查
询。
3.6 SQL数据控制语言
? 在各种大型 DBMS中,只有授权的用户才可
以登录数据库系统并在一个对象上执行相
应操作;否则,SQL语言中语句的执行或数
据库对象上的操作将被拒绝。本节讨论的
内容不专门针对 VFP,其中大部分命令在
VFP中不能使用。
? 有两组权限控制一个用户的活动:语句权
限和对象权限。
3.6.1 语句权限与 GRANT语句
? GRANT语句为 DBMS用户授予权限,它对语
句权限的语法是,
? GRANT {ALL | 语句列表 } TO 账户列表
? 语句列表指定要授予权限的一个或多个语
句(使用逗号分开),账户列表列出要授
予权限的全部账号(由逗号分开)。账户
列表的成员可以是数据库用户名或角色。
ALL指定授予存在的全部语句权限。
3.6.2 对象权限与 GRANT语句
? 对象权限应用于数据库对象(表、视图和存储过程)
上的特定操作。 GRANT语句对对象权限的语法是,
? GRANT {ALL | 权限列表 } ;
? ON {表名 [字段列表 ] | 过程名 } ;
? TO 账户列表
? [WITH GRANT OPTION]
? [AS {组名 | 角色名 }]
? ALL和账户列表与第一种形式的 GRANT语句中同名
选项有相同的含义,表名可以是表或视图的名字;
AS指定具有执行 GRANT语句需要的账号的名字
(当执行 GRANT语句的用户属于多个组或角色时,
必须有 AS参数);权限列表是操作权限的列表。
对象权限列表
权 限 描 述
SELECT 提供选择(读)数据行的能力。可以提供列表限制这个权限到一行或多个行(如果省略列表,该表的全部列可以被选择)
INSERT 提供插入数据行的能力
UPDATE 提供修改列值的能力。可以提供列表限制这个权限到一行或多个行(如果省略列表,该表的全部列可以被修改)
DELETE 提供删除数据行的能力
REFERENCE
S
当用户没有引用表的 SELECT权限时,提供引用引用表中外部关
键字的列的能力
EXECUTE 提供执行指定存储过程的能力
3.6.3 REVOKE语句
? REVOKE语句删除一个或多个已经授予(或拒绝)
的权限。这个语句可以用于语句权限和对象权限,
所以有两个语法形式,
? (1)?语句权限
? REVOKE {ALL | 语句列表 } FROM 账户列表
? (2)?对象权限
? REVOKE [GRANT OPTION FOR] {ALL
[PRIVILEGES] | 权限列表 } ;
? ON 表名 [字段列表 ] {TO | FROM} 账户列表
[CASCADE][AS {组名 | 角色名 }]
3.7 视 图
? 视图是减少数据冗余,方便用户的一种重要工具。
? 基表用于描述 DDL和 DML语句。基表包含存在盘
上的数据。相反,视图在物理上并不存在,也就
是说,它们的内容不存放在盘上。视图是使用存
放在系统目录中的信息从一个或多个表中派生出
来的。这些信息(包括视图名和从基表中检索行
的方式)是与物理存储的视图有关的唯一信息。
因此,视图称为虚拟表。
3.7.1 视图的创建、删除和修改
? CREATE VIEW创建视图。这个语句的一般
形式是,CREATE SQL VIEW 视图名 [AS 查
询语句 ]。视图名是要建立的视图名,查询
语句是指定从一个或多个表中检索行和列的
SELECT语句。
? DROP VIEW删除视图,命令格式,DROP
VIEW 视图名,DROP VIEW语句删除数据库
中指定视图的定义,但并未删除与之相关的
基表。
3.7.2 视图数据的操作
? 如前所述,可以使用与检索和修改基表相
同的 SQL语句对视图进行检索和修改。视图
的查询( SELECT语句)总是转换为与它所
依赖的基础表的等价查询。
? 可以把视图作为基表一样使用 INSERT语句。
当视图用于插入行时,行实际上是插入到
基表中。
? 也可以把视图作为基表一样使用 UPDATE语
句。当视图用于修改行时,基表的内容实
际上被修改了。
? 与修改操作一样,删除操作既可以针对基
表进行,也可以针对视图进行。
3.8 典型关系数据库中的 SQL语言
? Oracle中的 SQL语言。 Oracle数据库语言是
标准的 SQL,可在用户友好接口( UFI)也
就是 SQL*Plus的支持下实现所有的 SQL语言
具有的功能。
? SQL Server中的 SQL语言。 SQL Server的关
系语言称为 Transact-SQL,它是当今最重要
的数据库语言 SQL的变种。
? VFP中的 SQL语言。由于 VFP是从一个基于
微型机的小型数据库系统发展过来的,它
的数据库系统中在采用 SQL标准的基础上做
出了相应的改变。
本 章 小 结
? 本章重点介绍了标准 SQL语句,通过本章的学
习希望读者重点掌握,
? ① ?标准 SQL语言在数据库系统中的地位和作
用;
? ② ?使用标准 SQL语言中的数据定义语句实现
数据库中对象的定义;
? ③ ?使用 VFP SQL语言中的数据操作语句实现
对数据库中数据的查询、修改、插入、删除
操作。重点体会数据查询语句的各个子句;
? ④ ?使用标准 SQL语言中的数据操纵语句实现
对数据库中权限的控制。