Professional Documents
Culture Documents
SQL必知必会(第4版) PDF
SQL必知必会(第4版) PDF
图灵社区的电子书没有采用专有
客户端,您可以在任意设备上,
用自己喜欢的浏览器和PDF阅读
器进行阅读。
但您购买的电子书仅供您个人使
用,未经授权,不得进行传播。
我们愿意相信读者具有这样的良
知和觉悟,与我们共同保护知识
产权。
如果购买者有侵权行为,我们可
能对该用户实施包括但不限于关
闭该帐号等维权措施,并可能追
究法律责任。
内容提要
SQL 是使用最广泛的数据库语言,几乎所有重要的 DBMS 都支持 SQL。本书
由浅入深地讲解了 SQL 的基本概念和语法,涉及数据的排序、过滤和分组,以及表、
视图、联结、子查询、游标、存储过程和触发器等内容,实例丰富,便于查阅。新
版增加了针对 Apache Open Office Base、MariaDB、SQLite 等 DBMS 的描述,并根
据最新版本的 Oracle、SQL Server、MySQL 和 PostgreSQL 更新了相关示例。
本书适合 SQL 初学者,也可供广大开发及管理人员参考。
图灵程序设计丛书
SQL必知必会(第4版)
◆ 著 [美] Ben Forta
译 钟 鸣 刘晓霞
责任编辑 朱 巍
◆ 人民邮电出版社出版发行 北京市崇文区夕照寺街14号
邮编 100061 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
北京 印刷
◆ 开本:880×1230 1/32
印张:8
字数:191千字 2013年 5 月第 1 版
印数:5 001 — 6 000册 2014年 4 月北京第 3 次印刷
著作权合同登记号 图字:01-2013-2648号
ISBN 978-7-115-31398-0
定价:29.00元
读者服务热线:(010)51095186转604 印装质量热线:(010)67129223
反盗版热线:(010)67171154
图灵社区会员 maik000 专享 尊重版权
引 言| 1
版权声明
版权所有,侵权必究。
SQL 。不 者
本书可以 。 授 Web , 经
SQL 书。SQL 方面 书 ,有 不 ,
有 , 授 内容 , 人 不
。 书 不 SQL 本 ,
以 , 。 , 内容
, 者 SQL, 未必 。
, 不 书 , 授 SQL
本书。本书 授 者 SQL , 简
, 复 内容,
以 。 者 本书中
SQL 。
本书 4 版, 经 家 30 者 SQL,
出版 版本。 ,
1 , 。 出 SQL。
本书 以 者
SQL
SQL
何 SQL
人 有 SQL。
DBMS
,本书中所 授 SQL 可以 任何
本书中 所有 或者 SQL 本
DBMS , 可以 本书 http://forta.com/books/
0672336073/ 得。
本书 字体 , 者 文本 出 文
本 以 字体 出。
It will look like this to mimic the way text looks on your screen.
式 体 , 可以 体 。
➥ , 容 不 。 ➥
所有字 内容。
说明
给出上下文讨论中比较重要的信息。
提示
就某任务给出建议或更简单的方法。
注意
提醒可能出现的问题,避免出现事故。
新术语
清晰定义重要的新词汇。
输入
者可以 , 出 。
输出
出, 出 。
分析
Sams 出版 。 Mark
Taber, 本 书, 书 。
Greg Wilson, 本书 面 。
者 本书 版 。 ,
, 得本版
。 家 版 出 。
有 所 本书 IT 或 书,
。 得 授 任,
, 。
, 本书 版 30 者, 本书不
本书, SQL 方面 书 。
者 得 。
Ben Forta
目 录
1 SQL ................................................................................................. 1
1.1 ....................................................................................... 1
1.2 SQL ...................................................................................... 6
1.3 ........................................................................................... 7
1.4 ................................................................................................... 8
2 .................................................................................................. 9
3 ....................................................................................... 21
3.1 ......................................................................................... 21
3.2 ................................................................................. 23
3.3 ................................................................................. 24
3.4 方 ................................................................................. 25
3.5 ................................................................................................. 28
4 ................................................................................................ 29
5 ........................................................................................ 37
6 ............................................................................... 46
7 ........................................................................................ 54
7.1 字 ......................................................................................... 54
7.2 字 ......................................................................................... 55
7.3 ................................................................................. 61
7.4 ................................................................................................. 63
8 ............................................................................... 64
8.1 ................................................................................................. 64
8.2 ......................................................................................... 65
8.3 ................................................................................................. 73
9 ................................................................................................ 74
9.1 ......................................................................................... 74
9.2 不 ..................................................................................... 81
9.3 ................................................................................. 83
9.4 ................................................................................................. 83
10 .............................................................................................. 84
10.1 ....................................................................................... 84
10.2 ....................................................................................... 85
10.3 ....................................................................................... 87
10.4 ................................................................................... 90
10.5 SELECT ......................................................................... 92
10.6 ............................................................................................... 92
11 ......................................................................................... 93
11.1 ........................................................................................... 93
11.2 ................................................................... 93
11.3 字 ........................................................... 98
11.4 ............................................................................................. 100
12 ................................................................................................ 101
13 ................................................................................... 112
14 ............................................................................................ 122
15 ............................................................................................ 130
16 ............................................................................... 139
17 ................................................................................... 145
18 ............................................................................................ 155
19 ................................................................................... 166
20 ................................................................................... 175
21 ............................................................................................ 183
A .......................................................................................... 203
B .................................................................................. 210
......................................................................................................................... 240
1 SQL
SQL 究 , 。
1.1
本 SQL 书, 以 方式 。SQL
任 , SQL ,
本 有所 。
可 有 , 。 电 邮
字 , 。 ,
。 中 ,
。 ATM ,
。
, 究 不 。
何 人 可 不 ,
。 , 出 , 以 。
提示
的简要 。 定的
,可 下 ,可
的 。 SQL 的重要
提, 要, 或
的 。
1.1.1
, 本书 SQL ,
以 有 方式 。 简
文 。 文 ,不
, 不 何 。
的 的 文 或 文 。
注意
的 ,
的, 。 ,
DBMS 。 DBMS 建 的 ,
, , 。
1.1.2
文 , 不 ,
文 中 文 , 文 中。
中, 文 。 文 ,可
。 可以 ,或者
。
某 定 的 清单。
, 中 或 。
不 中, 以
。 , 。
中 有 字 。 字 ,
中 有 有 字。
说明
的, 上 的 。 的
的 的 。 就 ,
中 能 的 , 的 中 可
的 。
有 , 中 何 ,
, 何 , 何 。
所 schema , 式可以 中 ,
可以 中 。
的 的信息。
1.1.3
由 。 中 。
中的 。 或 的。
, 电 。
中 。 , 中,
, , 以 邮
中。
提示 分
重要。 ,
的 。 , 可能 定的
出 定 或 定 的 。
中, 或 就
。
可 的 定 。 ,
可 。 问题,
, , 。
中 有 。 datatype 可
以 。 , 中 字 或许 中
, 。 中
文本 , 。
的 的 。 的 , 或
中 的 。
可 中 , 字 中
字 。 , 方面
。 , 必 所 。
注意
SQL 的 要 。
的 , 的 。更 的 ,
的 的 DBMS 中 的 。
法,重要的 建 要 。
1.1.4
中 ,所 内。
, 中 , 。
, 可以 。 中 。
中的 。
说明
可能 提 record 。
可 的, 上 , 的 。
1.1.5
中 有 或 可以 。 可以
, 可以 ID。 可以 ID 或
社 。
或 , 能 中 。
中 或 。
。 有 , 或 中 , 不
。
提示
要 , 建的
, 的 。
中 任何 可以 , 以
任 不 有
必 有 不 许 NULL
中 不 许 或
不 中 , 不 以 。
, 不 必 , 可以
。 , 必 所有 ,
所有 必 可以不 。
有 , , 12 中 。
1.2 SQL
SQL 字 S-Q-L 或 sequel Structured Query Language
。SQL 。
SQL 有 。
SQL 不 有 。 所有 DBMS
SQL,所以 所有 。
SQL 简 。 由有 ,
不 。
SQL 简 , 有 ,
,可以 复 。
面 SQL。
说明
DBMS 或 , SQL 。
的 的 提 定 的 能或简 方法。
, DBMS 的, 上的
。
1.3
任何 , SQL 方 。 ,
SQL 。
本书中所有 SQL 。 A 出
体 , 得 或 , 者
授 内容。 B 中 SQL 所 。
, 者 内容, 以
。
1.4
SQL, 有 。 SQL
,所以, 复 本 。
何 SELECT 中 或 。
2.1 SELECT
1 所 ,SQL 由简 。
字, SQL 由 或 字 。 经
SQL SELECT 。 或 中
。
SQL 的 。 能 或 的 。 E
出 某 的 。
SELECT ,必 出 ,
以 方 。
说明
中的 SQL 出 A中 的
文 。 要 建议 ,
A, 下 或 建 文 。
重要的 ,要 SQL 。
SQL 出, 的 的。
的 的 , B
的 出 中 的 。 要 某
, B中 给出 的建议。
2.2
简 SQL SELECT , 所
输入
SELECT prod_name
FROM Products;
分析
输出
prod_name
-------------------
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll
说明
,可能 现 出的 的
。出现 。 下
, 的 定的 。 的 可能
中的 , 可能 。 要 的 ,就 的。
简 SELECT 中 所有 。 有
得出 , 有 。以 内容。
提示 语
SQL 。 DBMS 要 单 SQL
, DBMS 可能 单 SQL 上 。
, 可 上 。事 上, 定 要, 上
定 。
提示 语
,SQL , SELECT select 的。
, Select 。 SQL SQL
, , 更
。 , 定要 SQL 的,
可能 的 DBMS 。
提示
SQL , 中 。SQL 可
的 , 可 。下 3 法的 的。
SELECT prod_name
FROM Products;
SELECT
prod_name
FROM
Products;
SQL , SQL 更 。
2.3
中 , SELECT 。 不
必 SELECT 字 出 , 必 以 。
提示
, 定要 上 ,
。 , 出现 。
面 SELECT Products 中 3 。
输入
分析
, SELECT Products 中
。 中, 3 , 。
出
输出
说明 示
上 出可 ,SQL 的 的 。
的 问题, 问题。 , 上 的
的 的
中 定。 出的 提
的 。
2.4
所 所 , 或 ,SELECT 可以
所有 不必 出 。 *
可以 , 所 。
输入
SELECT *
FROM Products;
分析
* , 中所有 。
中出 , 不 。不 ,SQL
, , 式 , 出 。 ,
不 。
注意
, 要 中的 , * 。
能 事, 出 ,
要的 的 能。
提示
。 定
, 能 出 的 。
2.5
所 ,SELECT 所有 。 , 不
出 , , products 中所有
ID
输入
SELECT vend_id
FROM Products;
输出
vend_id
----------
BRS01
BRS01
BRS01
DLL01
DLL01
DLL01
DLL01
FNG01
FNG01
SELECT 9 中 有3 , products
中有 9 。 何 出不
DISTINCT 字, , 不
。
输入
分析
输出
vend_id
----------
BRS01
DLL01
FNG01
注意 分 DISTINCT
DISTINCT 的 , 的 。
, 定 SELECT DISTINCT vend_id, prod_price, 定的
, 的 出 。
2.6
SELECT 中所有 , 可 。
或者 , 可 ,
, 中 SQL 不 。
输入
输出
prod_name
-----------------
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Fish bean bag toy
Bird bean bag toy
分析
面 SELECT TOP 5 , 5 。
输入
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;
分析
Oracle, ROWNUM ,
输入
SELECT prod_name
FROM Products
WHERE ROWNUM <=5;
输入
SELECT prod_name
FROM Products
LIMIT 5;
分析
得 面 5 , 以 ,
输入
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
分析
输出
prod_name
-------------------
Rabbit bean bag toy
Raggedy Ann
King doll
Queen doll
注意
的 0 , 1 。 ,LIMIT 1 OFFSET
1 2 , 1 。
提示
MySQL MariaDB 简 的 LIMIT 4 OFFSET 3 , LIMIT 3,4。
法, 的 OFFSET, 的 LIMIT。
说明
,就 要 ,SQL
的 现, 能 。 的
的, 较 的 就 。 某 问题 SQL
方 , 定要 。
2.7
可以 ,SQL 由 DBMS 。 不
文本, 有以 。
SQL , 简 。 , SQL
,复 , ,
,或者 人 。 SQL
本中, 不 DBMS 。 可以
B中 create.sql populate.sql。
SQL 文 内容, 可 方
式 以 。 可 B中 .sql
文 。
SQL 。
SQL , , ,
以 DBMS 以 。
DBMS 式 。 内
输入
SELECT prod_name --
FROM Products;
分析
-- 字 内。-- 文本 , ,
CREATE TABLE 中 不 。
面 式 内 式 得 。
输入
#
SELECT prod_name
FROM Products;
分析
#, 。 本书 本
create.sql populate.sql 中可以 式 。
可以 , 可以 本 任何 。
输入
分析
/* , */ ,/* */ 任何内容 。 方式
, , SELECT
, 不 , 经 。
2.8
何 SQL SELECT
以 所有 。 何 不 , 何 。 不
, 复 SQL 得 SQL 得不 。 授 何
出 。
授 何 SELECT ORDER BY ,
出 。
3.1
所 , 面 SQL 。
出, 有 。
输入
SELECT prod_name
FROM Products;
输出
prod_name
--------------------
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll
, 出 不 。 不 , 以
中出 , 有可 中 。 ,
或 , DBMS
方式 。 , 不 制 , 不
不 。 , 不
, 不 出 有任何 。
SQL , 的, 可 的。
上 提 的 。 的
的 SELECT 的 FROM 。
SELECT 出 ,可 ORDER BY 。
ORDER BY 或 字, 出 。 面
输入
SELECT prod_name
FROM Products
ORDER BY prod_name;
分析
输出
prod_name
--------------------
12 inch teddy bear
注意 ORDER BY
定 ORDER BY , SELECT 中
。 的 , 出现 息。
提示
,ORDER BY 中 的 的 。 ,
上 定要 , 的 法的。
3.2
经 不 。 , ,可
, 中 。
有 , 有 。
,简 , 可
。
面 3 , 中
, 。
输入
输出
, 。
, 中 出, 有 prod_price
prod_name 。 prod_price 中所有
, 不 prod_name 。
3.3
出 ,ORDER BY
。 内容,
输入
输出
分析
可以 , 出 面 ,不 ORDER BY
。SELECT 中 不 。ORDER BY 2
SELECT 中 prod_name 。ORDER BY 2,
3 prod_price, prod_name 。
不 。 有 。 ,不
出 有可 。 , SELECT
容 ORDER BY 。
, 不 SELECT 中, 不 。
提示
, 出现 SELECT 清单中的 , 能
。 , 要,可 。
3.4
不 A Z , 。 可以
ORDER BY Z A 。 ,
必 DESC 字。
面 以 面
输入
输出
, 面 以
面 ,
输入
输出
分析
DESC 字 面 。 中, prod_price
DESC, prod_name 不 。 ,prod_price 以
, prod_name 内 。
上 , 定 DESC 。
提示 分
文 ,A a a B , Z
问题 论问题, 的 方 。
dictionary 中,A a ,
的 。 , DBMS
要 的 ,可能
。
的 问题 , 要 , 简单的 ORDER
BY 可能 。 的 。
3.5
何 SELECT ORDER BY 出
。 必 SELECT 中 。 ,可
以 或 。
授 何 SELECT WHERE 。
4.1 WHERE
, 中 所有 。
或 。 所
search criteria , filter condition 。
SELECT 中, WHERE 中 。
WHERE FROM 出, 所
输入
分析
products 中 , 不 所有 ,
prod_price 3.49 , 所
输出
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.49
Bird bean bag toy 3.49
Rabbit bean bag toy 3.49
简 ,
。不 ,SQL 不 , 。
提示
, 现 的 可能 3.49 3.490 3.4900
。出现 的 , DBMS 定 的
。 , 的 出可能 上的 , ,
,3.49 3.4900 的。
提示
可 。 ,SQL 的 SELECT
出 的 , ,
提 出 要的 。
, 法 。 可 更
。 或 的
的 能, 建的 可 。 ,
, 务 的 ,
的 。
注意 WHERE
ORDER BY WHERE , ORDER BY
WHERE , ORDER BY 的 ,
3 。
4.2 WHERE
WHERE ,
。SQL 4-1 出 所有 。
4-1 WHERE
明 明
= >
<> 不 >=
!= 不 !> 不
< BETWEEN
注意
4-1 中 出的某 的 <> != ,!< >= 。
DBMS 。 定 的 DBMS
, 的文 。
4.2.1
经 , 。
出所有 10 。
输入
输出
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.49
Bird bean bag toy 3.49
Rabbit bean bag toy 3.49
8 inch teddy bear 5.99
12 inch teddy bear 8.99
Raggedy Ann 4.99
King doll 9.49
Queen doll 9.49
所有 10 有
10 ,所以
输入
4.2.2
出所有不 DLL01 制
输入
输出
vend_id prod_name
---------- ------------------
BRS01 8 inch teddy bear
提示
上 WHERE 中的 , 的 单 ,
的 。单 定 。 的
比较,就 要 定 。 比较的 。
面 , 中 != 不 <>
输入
注意 != <>
!= <> 可 。 , DBMS
。 ,Microsoft Access <> !=。 问,
的 DBMS 文 。
4.2.3
,可以 BETWEEN 。 WHERE
有不 , , 。
,BETWEEN 可 5 10 所有
,或 所有 。
面 何 BETWEEN , 5 10
所有 。
输入
输出
prod_name prod_price
------------------- ----------
8 inch teddy bear 5.99
12 inch teddy bear 8.99
King doll 9.49
Queen doll 9.49
分析
可以 , BETWEEN ,必 所
。 必 AND 字 。BETWEEN
中所有 , 。
4.2.4
, 人 可以 中 不 。 不
, NULL。
NULL
no value , 0 或 。
NULL,不 简 = NULL。SELECT 有
WHERE ,可 有 NULL 。 WHERE
IS NULL 。
输入
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
所有 有 prod_price 字 ,不 0
,由 中 有 ,所以 有 。 ,Customers
有 NULL 有电 邮 , cust_email
NULL
输入
SELECT cust_name
FROM CUSTOMERS
WHERE cust_email IS NULL;
输出
cust_name
----------
Kids Place
The Toy Store
提示
DBMS 的 ,提 更 的 。更
信息 的 DBMS 文 。
注意 NULL
定 的 , 可能 NULL
的 。 。 unknown 的 义,
, 或 ,
。
, 定要 中 NULL 的 出现 的
中。
4.3
何 SELECT WHERE 。
何 不 以 NULL
。
授 何 WHERE 以 。
何 NOT IN 。
5.1 WHERE
4 所有 WHERE 。
制,SQL 许 出 WHERE 。 有
方式, 以 AND 或 OR 方式 。
或 WHERE 中的 的 ,
logical operator 。
5.1.1 AND
输入
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
分析
SQL 由 DLL01 制 4 所有
。 SELECT 中 WHERE , AND
字 。AND DBMS 所有 。
由 DLL01 制 , 4 , 不 。
, 4 , 不 由 制 不
。 SQL 出
输出
AND
WHERE 中的 , 给定 的 。
AND , 有 。可以
, AND 字。
说明 ORDER BY
, 的 , ORDER
BY 。 , 的 出 可能 上的 出 。
的 的, 的 可能 。 , 可
上 ORDER BY , WHERE 。
5.1.2 OR
OR AND , DBMS 任
。 ,许 DBMS OR WHERE 得
, 不 ,不
, 出 。
SELECT
输入
分析
SQL 由任 制 所有 。
OR DBMS 任 不 。
AND , 有 有 WHERE
。 SQL 出
输出
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900
Rabbit bean bag toy 3.4900
8 inch teddy bear 5.9900
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900
OR
WHERE 中 的 , 任 给定 的 。
5.1.3
WHERE 可以 任 AND OR 。 许 者 以
复 。
, AND OR 有 。 ,
。 出 10 以 , 由 DLL01 或 BRS01
制 所有 。 面 SELECT AND OR
WHERE
输入
输出
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900
Rabbit bean bag toy 3.4900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900
分析
面 。 中有 4 10 , ,
未 。 。SQL
OR , AND 。 SQL
WHERE , 由 BRS01 制 10 以
所有 ,以 由 DLL01 制 所有 , 不 何。
,由 AND 中 , 。
方 。 面
SELECT 出
输入
输出
prod_name prod_price
------------------- ----------
18 inch teddy bear 11.9900
分析
SELECT ,
。 有 AND 或 OR ,所以 DBMS
内 OR 。 ,SQL 由 DLL01
或 BRS01 制 10 以 所有 ,
。
提示 WHERE
任 AND OR 的 WHERE ,
。 要 ,
的 。 , 能 义。
5.2 IN
IN , 中 可以 。IN
由 中 。 面 。
输入
输出
prod_name prod_price
------------------- ----------
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
8 inch teddy bear 5.9900
Bird bean bag toy 3.4900
Fish bean bag toy 3.4900
Rabbit bean bag toy 3.4900
Raggedy Ann 4.9900
分析
可 IN OR , 面
SQL 面 。
输入
输出
prod_name prod_price
------------------- ----------
IN 。
有 ,IN , 。
AND OR IN , 容 。
IN OR 得 面
中, 不出 。
IN 可以 SELECT ,
WHERE 。 11 。
IN
WHERE 中 定要 的清单的 , 能 OR 。
5.3 NOT
WHERE 中 NOT 有 有 , 所
任何 。 NOT 不 独 ,所
以 有所不 。NOT 字可以 ,
不 。
NOT
WHERE 中 定 的 。
面 NOT 。 出 DLL01 所有 制
,可 。
输入
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
输出
prod_name
------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
King doll
Queen doll
分析
面 可以 <> , 所 。
输入
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;
输出
prod_name
------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
King doll
Queen doll
分析
说明 NOT
MariaDB NOT 定 IN BETWEEN EXISTS 。
DBMS NOT 定任 。
5.4
授 何 AND OR WHERE , 授 何
, 何 IN NOT 。
何 以 LIKE
,以 复 。
6.1 LIKE
面 所有 。不
, ,或者 ,
中 。
, 方 不 任何 。 , 中
文本 bean bag 所有 简 不 ,必
。 ,可以 式。
中, 出 bean bag 所有 ,可以
式, 出 任何 出 bean bag 。
的 的 。
或 的 。
, 词 。 上 ,LIKE
词 。 的 的,
, 免 SQL 文 或 中 。
文本字 字 , 文本 字 不
。
6.1.1 %
% 。 中,% 任何字 出 任
。 , 出所有以 Fish ,可 以 SELECT
输入
输出
prod_id prod_name
------- ------------------
BNBG01 Fish bean bag toy
分析
式 'Fish%' 。 , 任 以
说明
的 Microsoft Access, 要 * %。
说明 分
DBMS 的 , 可 的。
, 'fish%' Fish bean bag toy 就 。
可 式中 任 , 可以 。
面 , 式
输入
输出
prod_id prod_name
-------- --------------------
BNBG01 Fish bean bag toy
BNBG02 Bird bean bag toy
BNBG03 Rabbit bean bag toy
分析
可以出 式 中 , 不 有 。 面
出以 F 以y 所有
输入
SELECT prod_name
FROM Products
WHERE prod_name LIKE 'F%y';
提示 分
下 中 的,就
的 , WHERE email LIKE
'b%@forta.com'。
, 或 字 ,% 0 字 。%
式中 0 1 或 字 。
说明 注意
Access 的 DBMS 的 。 ,
某 50 , 的文 Fish bean bag toy 17
, 要 文 33 。
, 可能 上 SQL 。 WHERE
prod_name LIKE 'F%y' F y 的 prod_name。
, y , Fish bean bag toy 就
出 。简单的 法 给 % 'F%y%'
y 的 或 。更 的 法 。
8 。
注意 注意 NULL
% 可 任 , , 就 NULL。
WHERE prod_name LIKE '%' NULL 的 。
6.1.2 _
有 _ 。 % ,
字 , 不 字 。
说明
DB2 _。
说明
的 Microsoft Access, 要 ? _。
输入
说明 注意
上 ,可能 要给 。
输出
prod_id prod_name
-------- --------------------
BR02 12 inch teddy bear
BR03 18 inch teddy bear
分析
WHERE 中 式 出 面 有文本 。
式 中 12, 中
18。8 inch teddy bear 有 , 式
不 。 , 面 SELECT % ,
输入
输出
prod_id prod_name
-------- --------------------
BR01 8 inch teddy bear
BR02 12 inch teddy bear
BNR3 18 inch teddy bear
% 0 字 不 ,_ 字 ,不 不 。
6.1.3 []
方 [] 字 , 必
字 。
说明
的 , DBMS 建
的[]。 的 Access SQL Server 。 定 的
DBMS , 的文 。
, 出所有 字以 J 或 M 人,可
输入
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
输出
cust_contact
-----------------
Jim Jones
John Smith
Michelle Green
分析
WHERE 中 式 '[JM]%'。 式 不
。[JM] 方 中任 字 , 字 。
,任何 字 字 不 。[JM] %
字 任 字 , 所 。
^
可以 字 字 。 , 面 以
J M 任 字 任 人
输入
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[ JM]%'
^
ORDER BY cust_contact;
说明
的 Microsoft Access, 要 ! ^
定 ,
, 的 [!JM] [ JM]。
^
, 可以 NOT 得出 。^
WHERE 可以简
输入
SELECT cust_contact
FROM Customers
WHERE NOT cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
6.2
所 ,SQL 有 。 有 ,
面 。 出
。
不 。 ,
。
, 不 式
。 , 。
。 方,可 不 。
, 有 ,以 经
。
6.3
, 何 WHERE 中 SQL ,
,不 。
字 , 何 字 ,以 何
中 。
7.1
中 不 所 式, 面
。
, ,
不 中。
邮 不 中 , 邮
有 式 字 出 。
, 所有 出 。
,不
以 可 。 , 。
。
中, 中 不 所 。
中 出 或 式 , 不
出 , 中 式 。
这就是计算字段可以派上用场的地方了。与前几课介绍的列不同,计算
字段并不实际存在于数据库表中。计算字段是运行时在 SELECT 语句内
创建的。
字段(field)
基本上与列(column)的意思相同,经常互换使用,不过数据库列一
般称为列,而术语字段通常与计算字段一起使用。
提示:客户端与服务器的格式
邮
在 SQL 语句内可完成的许多转换和格式化工作都可以直接在客户端
电 应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在
客户端中完成要快得多。
7.2
为了说明如何使用计算字段,我们来举一个简单例子,创建由两列组成
的标题。
Vendors 表包含供应商名和地址信息。假如要生成一个供应商报表,需
要在格式化的名称(位置)中列出供应商的位置。
单 。
说明 + ||
Access SQL Server + 。DB2 Oracle PostgreSQL SQLite
Open Office Base ||。 的 DBMS 文 。
面 DBMS
输入
输出
-----------------------------------------------------------
Bear Emporium (USA )
Bears R Us (USA )
Doll House Inc. (USA )
Fun and Games (England )
Furball Inc. (USA )
Jouets et ours (France )
面 , ||
输入
FROM Vendors
ORDER BY vend_name;
输出
-----------------------------------------------------------
Bear Emporium (USA )
Bears R Us (USA )
Doll House Inc. (USA )
Fun and Games (England )
Furball Inc. (USA )
Jouets et ours (France )
面 MySQL 或 MariaDB
输入
分析
面 SELECT 以
vend_name 中 字
字
vend_country 中 家
字 。
出中可以 ,SELECT
字 。
SELECT 出。 字
。许 不 所有 文本 ,
不 。 式 ,必
。 可以 SQL RTRIM() , 所
输入
输出
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
面 , ||
输入
输出
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
分析
RTRIM() 所有 。 RTRIM(),
。
说明
DBMS RTRIM() , 的
LTRIM() 的 TRIM()
的 。
面 出可以 ,SELECT 可以 字 。 ,
字 有 字, 。
SQL 中 , 有 不 。 ,
未 不 中, 有 。
,SQL 。 alias 字 或
。 AS 字 。 面 SELECT
输入
输出
vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
面 , ||
输入
面 MySQL MariaDB 中
输入
分析
SELECT 本 以 , 不 字 文
本 AS vend_title。 SQL
vend_title 字 。 出可以 , 以 ,
vend_title,任何 可以 ,
。
说明
DBMS 中,AS 可 的, ,
。
提示
。 的 的 法的
重新 , 的 或 。
注意
的 可 单词, 可 。 ,
中。 法 法的, 建议 。
单词的 可 , 给 问题。 ,
的 单词的 重 单词的 。
说明 出
出 derived column , ,
的 的 。
7.3
字 出 。 ,
Orders 所有 ,OrderItems 中
。 面 SQL 20008 中 所有
输入
输出
item_price 中 。
输入
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
输出
分析
出中 expanded_price 字 , quantity*
item_price。 可以 ,
。
SQL 7-1 中 出 本 。 , 可
。 , 5 。
7-1 SQL
明
+
-
*
/
提示
SELECT 提 的方法。 SELECT
中 , FROM 就 简单 问
, SELECT 3 * 2; 6,SELECT Trim(' abc ');
abc,SELECT Now(); Now() 。
现 ,可 要 SELECT 。
7.4
字 以 何 字 。
字 字 中 。 , 何
,以 字 。
,DBMS 何 ,以 何
SQL 可 。
8.1
,SQL 可以 。
, 方 。
中 字 RTRIM() 。
, SQL 所
。
8-1 DBMS
可以 , SQL 不 ,SQL 不 可 。
SQL 中可 不 。
的 可 上 。
可 ,许 SQL 不 。
有 , 有 不 。 不
, 。必 方
DBMS 可以 有 。
提示
现 , 的 。 定 , 或
。 定 , ,
或 能 的 SQL 的 义。
8.2
SQL 以 。
文本字 或 , 或 文
本 。
,
。
中
, 有 。
DBMS 。
SELECT 面 , 不
。 可以 SELECT , WHERE 中 ,
SQL 中 , 面 。
8.2.1
, 经 文本 , 中 RTRIM()
。 面 , UPPER()
输入
输出
vend_name vend_name_upcase
--------------------------- ----------------------------
Bear Emporium BEAR EMPORIUM
Bears R Us BEARS R US
Doll House Inc. DOLL HOUSE INC.
Fun and Games FUN AND GAMES
可以 ,UPPER() 文本 , 本 中
出 , Vendors 中 , vend_name_
upcase 。
8-2 出 文本 。
8-2
明
LEFT() 或 字 字 字
LENGTH() DATALENGTH()或LEN() 字
LOWER() Access LCASE() 字
LTRIM() 字
RIGHT() 或 字 字 字
RTRIM() 字
SOUNDEX() 字 SOUNDEX
UPPER() Access UCASE() 字
说明 SOUNDEX
Microsoft Access PostgreSQL SOUNDEX(), 下的
DBMS。
, 建 SQLite SQLITE_SOUNDEX ,
SOUNDEX() SQLite 中就可 。 SQLITE_SOUNDEX
的 , SQLite 现 SOUNDEX()。
面 出 SOUNDEX() 。Customers 中有
Kids Place, Michelle Green。 ,
Michael Green, ,
不 , 所
输入
输出
cust_name cust_contact
-------------------------- ----------------------------
SOUNDEX() , 所有
Michael Green
输入
输出
cust_name cust_contact
-------------------------- ----------------------------
Kids Place Michelle Green
分析
8.2.2
中, DBMS 有
式。 以 式 ,以 有 或
, 。
不 式,
。由 , SQL
中 有 。 , 不 ,可 。
简 , 。Orders 中
有 。 SQL Server 中 2012 所有 ,可
输入
SELECT order_num
FROM Orders
WHERE DATEPART(yy, order_date) = 2012;
输出
order_num
-----------
20005
20006
20007
20008
20009
Access 中 版本
输入
SELECT order_num
FROM Orders
WHERE DATEPART('yyyy', order_date) = 2012;
分析
面 DATE_PART() PostgreSQL 版本
输入
SELECT order_num
FROM Orders
WHERE DATE_PART('year', order_date) = 2012;
Oracle 有 DATEPART() ,不 有 可
。
输入
SELECT order_num
FROM Orders
WHERE to_number(to_char(order_date, 'YYYY')) = 2012;
分析
中,to_char() ,to_number()
出 ,以 2012 。
方 BETWEEN
输入
SELECT order_num
FROM Orders
WHERE order_date BETWEEN to_date('01-01-2012')
AND to_date('12-31-2012');
分析
中,Oracle to_date() 字 。
2012 1 1 , 2012 12 31 。BETWEEN
出 所有 。 得 ,
SQL Server 中不 , 不 to_date() 。 ,
CONVERT() to_date(), 可以 。
输入
SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2012;
SQLite 中有
输入
SELECT order_num
FROM Orders
WHERE strftime('%Y', order_date) = '2012';
出 。 ,可以
, AND 可以 。
DBMS 不 简 。 DBMS 有
式 。 ,可以 ,
不 DBMS 可 不 。 体 DBMS
, 文 。
8.2.3
。 或
何 , 不 字 或 。
有 , DBMS 中,
。 8-3 出 。
8-3
明
ABS()
COS()
EXP()
PI()
SIN()
SQRT() 方
TAN()
体 DBMS 所 , 文 。
8.3
何 SQL 。 式
中 有 , SQL 中 不 SQL
Server Oracle 。
SQL , 何 。
9.1
经 不 出 , SQL
。 ,SQL 可 ,以
。 有
中 或者 或
得 中
出 或所有 或 。
中 , 不 本 。 ,
不 。 ,
。
方 ,SQL 出 5 , 9-1。
。 不 ,SQL
SQL 中得 。
某 的 , 。
9-1 SQL
明
AVG()
COUNT()
MAX()
MIN()
SUM()
面 。
9.1.1 AVG()
AVG() 中 , 得 。AVG()
可 所有 , 可以 或 。
输入
输出
avg_price
-------------
6.823333
分析
AVG() 可以 或 。 面
所
输入
输出
avg_price
-----------
3.8650
分析
SELECT 不 , WHERE 。
WHERE 出 vend_id DLL01 , avg_price 中
。
注意
AVG() 能 定 定 的 ,
给出。 的 , AVG() 。
说明 NULL
AVG() NULL 的 。
9.1.2 COUNT()
COUNT() 。可 COUNT() 中 或
。
COUNT() 有 方式
COUNT(*) 中 ,不 中
NULL 。
COUNT(column) 中 有 , NULL 。
面 Customers 中
输入
输出
num_cust
--------
5
分析
中, COUNT(*) 所有 ,不 中 有 。
num_cust 中 。
面 有电 邮
输入
输出
num_cust
--------
3
分析
有3 有电 邮 。
说明 NULL
定 , COUNT() 定 的 的 ,
COUNT() 中 的 * , 。
9.1.3 MAX()
MAX() 中 。MAX() , 所
输入
输出
max_price
----------
11.9900
分析
,MAX() Products 中 。
提示 MAX()
MAX() 出 的 或 ,
DBMS 任 中的 , 文 中的
。 文 ,MAX() 的 。
说明 NULL
MAX() NULL 的 。
9.1.4 MIN()
MIN() MAX() , 。 MAX()
,MIN() , 所
输入
输出
min_price
----------
3.4900
分析
中 MIN() Products 中 。
提示 MIN()
MIN() 出 的 或 ,
DBMS 任 中的 , 文 中的
。 文 ,MIN() 的 。
说明 NULL
MIN() NULL 的 。
9.1.5 SUM()
SUM() 。
面 ,OrderItems 中 , 有
。可 所 所有 quantity
输入
输出
items_ordered
----------
200
分析
SUM() 可以 。 面 中,
item_price*quantity,得出
输入
输出
total_price
----------
1648.0000
分析
SUM(item_price*quantity) 中所有 ,
WHERE 中 。
提示
, 的 , 可
上的 。
说明 NULL
SUM() NULL 的 。
9.2
以 5 可以 。
所有 , ALL 或不 ALL
。
不 , DISTINCT 。
提示 ALL
ALL 要 定, 。 定 DISTINCT,
定 ALL。
说明
Microsoft Access 中 DISTINCT, 下 的
Access。要 Access 的 , 要
DISTINCT SELECT COUNT(*) 。
面 AVG() 。
面 SELECT , DISTINCT ,
不
输入
输出
avg_price
-----------
4.2400
分析
可以 , DISTINCT , 中 avg_price ,
有 有 。 。
注意 DISTINCT COUNT(*)
定 , DISTINCT 能 COUNT()。DISTINCT 能
COUNT(*)。 ,DISTINCT , 能 或
。
说明
的 DISTINCT ALL , 的 DBMS ,
的 的 TOP TOP PERCENT。
的 DBMS , 的文 。
9.3
所有 。 ,SELECT
可 。 面
输入
输出
分析
SELECT 4 , 4 Products
中 , 以 。
注意
定 某 的 , 中 的
。 法, SQL 现 ,可能
的 息。
9.4
。SQL 5 ,可以 方
, 所 。 ,
中 得 。
10
何 ,以 内容 。
SELECT GROUP BY HAVING 。
10.1
得 , SQL 可以 。 ,
, ,不 所有 得
。
所有 所有 或 WHERE
。 面 DLL01
输入
输出
num_prods
-----------
4
, 或者
,或者 10 以 ,
。 可以 ,
。
10.2
SELECT GROUP BY 。
输入
输出
vend_id num_prods
------- ---------
BRS01 3
DLL01 4
FNG01 2
分析
GROUP BY, 不必 。
。GROUP BY DBMS , 不
。
GROUP BY , 。
GROUP BY 可以 任 , 可以 ,
。
GROUP BY 中 ,
。 , , 所有 所以
不 。
GROUP BY 中 出 必 或有 式
不 。 SELECT 中 式, 必 GROUP BY
中 式。不 。
SQL 不 许 GROUP BY 有 可 文
本或 字 。
,SELECT 中 必 GROUP BY
中 出。
中 有 NULL , NULL 。
中有 NULL , 。
GROUP BY 必 出 WHERE ,ORDER BY 。
提示 ALL
Microsoft SQL Server SQL 现 GROUP BY 中 可 的 ALL
。 可 , 的
下, NULL 。 的 DBMS ALL,
的文 。
注意
的 SQL 现 SELECT 中的 定 GROUP BY 的 。
,GROUP BY 2, 1 可 的 ,
。 法 方 , SQL 现 ,
SQL 出 。
10.3
GROUP BY ,SQL 许 ,
, 。 , 可 出 有 所有
。 ,必 不 。
经 WHERE 4 。 ,
中 WHERE 不 任 , WHERE 不 。
,WHERE 有 。
,不 WHERE SQL ,
HAVING 。HAVING WHERE。 , 所
所有 WHERE 可以 HAVING 。 ,WHERE
, HAVING 。
提示 HAVING WHERE
4 5 中, WHERE 的
的 。 的 WHERE 的
HAVING。 的 法 的, 。
, 以
输入
输出
cust_id orders
---------- -----------
1000000001 2
分析
SELECT 面 。 HAVING
, COUNT(*) >= 2 以 。
可以 ,WHERE 不 , ,
不 。
说明 HAVING WHERE
方法,WHERE ,HAVING
。 重要的 ,WHERE 的
中。 可能 , HAVING 中
的 。
,有 有 中 WHERE HAVING
, 有。 面 , 12 内 有
以 。 ,可 WHERE , 出 12
内 , HAVING 出 有 以 。
, 面 , 出 有 以
4
输入
输出
vend_id num_prods
------- -----------
BRS01 3
FNG01 2
分析
中, 本 SELECT , 面
。WHERE 所有 prod_price 4 , vend_id
,HAVING 2或 2以 。 有 WHERE
, 出 DLL01, 4 , 4
以
输入
输出
vend_id num_prods
------- -----------
BRS01 3
DLL01 4
FNG01 2
说明 HAVING WHERE
HAVING WHERE , 定 GROUP BY, DBMS
。 , 要能 。 HAVING
GROUP BY , WHERE 的 。
10.4
GROUP BY ORDER BY 经 , 不 ,
。 10-1 。
10-1 中 出 。 经 , GROUP BY
以 出 。 不 , 不 SQL
所 。 , DBMS 出 GROUP BY
, 可 以不 。 以 方式
得 , 不 以 方式 出。
ORDER BY , GROUP BY 。
提示 ORDER BY
GROUP BY , 给出 ORDER BY 。
的 方法。 要 GROUP BY 。
输入
输出
order_num items
--------- -----
20006 3
20007 5
20008 5
20009 3
出, ORDER BY , 所
输入
说明
Microsoft Access , Access 中 。
方法 的 或 items ORDER BY 中 ,
ORDER BY COUNT(*), order_num 或 ORDER BY 2, order_num。
输出
order_num items
--------- -----
20006 3
20009 3
20007 5
20008 5
分析
中, GROUP BY order_num
,以 COUNT(*) 中 。HAVING
, 得 或 。 , ORDER BY
出。
10.5 SELECT
面 SELECT 中 。 10-2 以 SELECT 中
必 , 出 所 。
10-2 SELECT
明
SELECT 或 式
FROM 中
WHERE
GROUP BY
HAVING
ORDER BY 出
10.6
何 SQL 。 授
何 GROUP BY , 。
何 HAVING , ORDER BY
GROUP BY 以 WHERE HAVING 。
11
, 何 。
11.1
SELECT SQL 。 所 所有 SELECT
简 , 中 。
任 SQL 。 SELECT 。
SQL 许 subquery , 中 。
方 。
说明
MySQL, 的 4.1 的。
MySQL 的 。
11.2
本书所有 中 ,
A 。 中。 ID
, Orders 中 。
OrderItems 中。Orders 不 , ID。
Customers 中。
, 出 RGAN01 所有 ,
面 出 体 。
(1) RGAN01 所有 。
(2) 有 出 所有 ID。
(3) 所有 ID 。
可以 独 。可以 SELECT
SELECT WHERE 。
可以 3 。
输入
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01';
输出
order_num
-----------
20007
20008
, , 20007
20008 ID。 5 IN , SELECT
输入
SELECT cust_id
FROM Orders
WHERE order_num IN (20007,20008);
输出
cust_id
----------
1000000004
1000000005
, ,
。 面 SELECT
输入
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01');
输出
cust_id
----------
1000000004
1000000005
分析
SELECT 中, 内 。 面 SELECT
,DBMS 。
, 面
20007 20008。 , 以 IN
式 WHERE 。
可以 , 出 , 面 WHERE 所 。
提示
的 SELECT , 较 更
。 上 , 的 ,能
简 的 。
提, 就 的 方, 的 DBMS 出
SQL。
得 RGAN01 所有 ID。
ID 。 SQL
输入
可以 中 WHERE , 不 ID
输入
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));
输出
cust_name cust_contact
----------------------------- --------------------
Fun4All Denise L. Stephens
The Toy Store Kim Howard
分析
可 , WHERE 中 出 SQL
。 有 制,不 由
制,不 。
注意
的 SELECT 能 单 。
。
注意
给出的 , 的 。 ,
的 方法。更 的论 , 12
, 中 给出 。
11.3
方 字 。 Customers 中
。 ID Orders 中。
, 面
(1) Customers 中
(2) 出 , Orders 中 。
输入
COUNT(*), 。 面
输入
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;
输出
分析
中 WHERE 面 WHERE 有不 ,
, 不 cust_id 。
Orders.cust_id Customers.cust_id 。 面 WHERE SQL,
Orders 中 cust_id Customers 中 cust_id
, 有可 必 。
中,有 cust_id Customers 中,
Orders 中。 不 ,DBMS Orders 中
cust_id 。
Orders 中 , 不
输入
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
输出
SELECT 有 , 必 制有 。
注意
要 定 , 定就
, DBMS 的 。 , 出现
的 义 , DBMS 出 信息。 ,WHERE 或 ORDER
BY 定的某 可能 出现 中。 的 法 ,
SELECT 中 ,就 定 避免 义。
提示
, 给出的 ,
的 方法。 JOIN ,
。
11.4
, 何 。 WHERE
IN 中,以 。 。
12
, , 何
SELECT 。
12.1
SQL 中 join 。
SQL SELECT ,
SQL 。
有 ,必 以
。 面 不 所有内容,
经 。
12.1.1
, 。
有 , 中 。
, ,以 。
有 , 何
方 由
, ,
复
, 或电 ,
可
有 复 ,
方式 。不 中 。
, 出 不 ,
。 , 。
所以 。
中可 ,
。Vendors 所有 , , 有
。 primary key ,可以 ID 或任何
。
Products , ID Vendors
, 不 有 。Vendors Vendors
Products , ID Vendors 中 出
。
不 复,不
,可以 Vendors 中 ,
中 不
由 不 复, , 得 简 。
, 可以有 ,方 。 , 可
。
能 的 。 的 或
可 scale well 。
12.1.2
所 , 有 , 方 ,
可 。 有 。
中, SELECT 出
。简 , 制, SELECT
中 , 。 ,可以
出, 中 。
说明
重要的 ,要 。 , 的
中 。DBMS 要建 , 。
DBMS 提 , 定义 。
。 , 中 法
重要的。 的 , Products 中
的 ID, 的 可 问, 某
。 避免 ,可 Products 的
ID 中出现 法 出现 Vendors 中的 。
DBMS 。 提
的 DBMS 。
12.2
简 , 所有 以 方式 可。
面
输入
输出
分析
。SELECT 面所有 。
所 prod_name prod_price
中, vend_name 中。
可以 , Vendors.vend_id Products.vend_id。
, 出 vend_id,DBMS 不
中有 。 面 出可以 , SELECT
不 中 。
就 提 的, 的 可能出现 义 , 定
。 的
义的 , DBMS 。
12.2.1 WHERE
WHERE 有 , 有
由 。 , SELECT 中 ,
中 。 中 有 DBMS 何
内容。 必 。 ,
中 中 。WHERE
, 。 有 WHERE
, 中 中 , 不
。
的 的 。 出的 的
中的 中的 。
, 面 SELECT 出
输入
输出
分析
面 出可以 , 不 。
, 不
本 有 。
注意 WHERE
要 WHERE , DBMS 比 要的
的 。 ,要 WHERE 的 。 的
DBMS 的 。
提示
, 的 , cross join 。
12.2.2
equijoin ,
。 内 inner join 。 ,可以
不 , 。 面 SELECT
面
输入
分析
, 体 DBMS 文 。
说明 语
ANSI SQL INNER JOIN 法, 的 简单的
法。 ,SQL 论 的 简单 法的。 就
,DBMS 的 简单 , 建议 要
, 就 更 。
12.2.3
SQL 不 制 SELECT 中可以 。 本
。 出所有 , 。
输入
输出
分析
20007 中 。 OrderItems 中。
ID , Products 中 。
ID Vendors 中 , ID
中。 FROM 出 ,WHERE
, 出 20007 中 。
注意
DBMS 定的 , 。 可能
, , 要 要的 。 的 ,
能下 。
注意
SQL 中 的 , 上 DBMS
。 的 DBMS 文 。
11 中 , SELECT
RGAN01
输入
11 所 , 不 复 SELECT 有 方 ,
面
输入
输出
cust_name cust_contact
----------------------------- --------------------
Fun4All Denise L. Stephens
The Toy Store Kim Howard
分析
11 所 , 中 3 。 ,
有 中 , 。 有
WHERE 。 中 , RGAN01
。
提示
可 , 任 给定的 SQL 方法。
或 的方法。 能可能 的 DBMS
中 或 的 。 , 要
的 , 出 的方法。
12.3
SQL 中 ,有
有 本 。本 ,
本 , 内 。
何 。
13
本 方 , 何
, 何 。
13.1
7 何 。
输入
SQL 可以 字 , 许 。
有 由
SQL
许 SELECT 中 。
面 SELECT 。 中所 本 ,
输入
分析
可以 ,FROM 中 有 。Customers AS C C
Customers , 。 , 可以 C 不
Customers。 中, WHERE 。 不
WHERE , 可以 SELECT ORDER BY 以
。
注意 AS
Oracle AS 。要 Oracle 中 ,可 AS,简单
定 可 , Customers C, Customers AS C 。
, 中 。 不 , 不
。
13.2
, 内 或 简 。
self-join natural join outer join 。
13.2.1
所 , SELECT 中不
。 面 。
Jim Jones 所有 。
出 Jim Jones , 出 。 面
方
输入
输出
分析
方 , 。内 SELECT 简
, Jim Jones cust_name。 字
WHERE 中,以 出 所有 11 中 授
, 。
输入
输出
提示 AS
Oracle AS。
分析
中 , Customers FROM
中出 。 , Customers 有
, DBMS 不 Customers 。
, 。Customers 出 C1,
出 C2。 可以 。 ,SELECT
C1 出所 。 不 ,DBMS ,
cust_id cust_name cust_contact 有 。DBMS
不 。WHERE
, 中 cust_contact , 所 。
提示
, 中 的
。 的 的, DBMS 比
。 下 方法, 定 的 能更 。
13.2.2
何 , 有 不 出 中
。 中 内 所有 ,
出 。 出 , 。
, 不 ,由 。
,
SELECT * , 。 面
输入
提示 AS
Oracle AS。
分析
中, 。所有 出,所以
有 复 出 。
, 内 , 可
不 不 内 。
13.2.3
许 中 中 , 有
有 。 ,可 以
, 未
出所有 以 , 有人
, 未 。
中, 中 有 。
。
注意 语
要 , 建 的 法 的 SQL 现中可能
。下 中 的 法 现,
的 DBMS 文 , 定 法。
面 SELECT 出 简 内 。 所有
输入
。 有 内 所有 ,可
输入
输出
cust_id order_num
---------- ---------
1000000001 20005
1000000001 20009
1000000002 NULL
1000000003 20006
1000000004 20007
1000000005 20008
分析
输入
注意
SQLite LEFT OUTER JOIN, RIGHT OUTER JOIN。 ,
要 SQLite 中 RIGHT OUTER JOIN, 更简单
的 法, 下 的提 中 。
提示
要 , 的 。
的 的 的 。 , FROM 或 WHERE
中 的 , 可 。 ,
可 , 方 就 。
输入
13.3
9 所 , 。
中 , 可以
。
, 所有 所 , 面
COUNT()
输入
SELECT Customers.cust_id,
COUNT(Orders.order_num) AS num_ord
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;
输出
cust_id num_ord
---------- --------
1000000001 2
1000000003 1
1000000004 1
1000000005 1
分析
可以方 。 面
输入
SELECT Customers.cust_id,
COUNT(Orders.order_num) AS num_ord
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;
提示 AS
提醒 Oracle , AS。
输出
cust_id num_ord
---------- -------
1000000001 2
1000000002 0
1000000003 1
1000000004 1
1000000005 1
分析
所有 , 有任何
。 中 1000000002, 有0 。
13.4
,有必 。
所 。 内 , 有 。
, 体 文 , DBMS 何
DBMS 中 。
不 , 不
。
, 得出 。
中可以 , 可以 不
。 , 有 ,
。 简 。
13.5
本 , 授 何以 ,
不 以 所 。 何
,以 。
14
本 何 UNION SELECT
。
14.1
SQL 或 中 SELECT 。
,SQL 许 SELECT ,
。 union 或复
compound query 。
中 不
, 。
提示 WHERE
下, 的 的 WHERE
的 的 。 ,任
WHERE 的 SELECT 可 , 下 可
。
14.2
可 UNION SQL 。 UNION,可 出
SELECT , 。
14.2.1 UNION
UNION 简 ,所 出 SELECT ,
字 UNION。
所 , UNION SELECT 。
输入
输出
输入
输出
分析
,可以
输入
输出
分析
由 面 SELECT , UNION 字 。
UNION DBMS SELECT , 出
, 出 WHERE 不 UNION
输入
简 中, UNION 可 WHERE 复 。
复 ,或者 不 中
, UNION 可 简 。
提示 UNION
UNION SELECT 的 ,SQL 。 ,
下 的 DBMS 文 , UNION 能 的
。
注意
的 DBMS , SELECT
。 论上 , 能上 WHERE
UNION 的 。 的 论上, 中
能 , 下 方法,
更 。
14.2.2 UNION
可以 ,UNION 容 , 。
UNION 必 由 或 以 SELECT ,
字 UNION , SELECT , UNION
字 。
UNION 中 必 式或 不 ,
不 以 出 。
必 容 不必 , 必 DBMS 可以
,不 或不 。
本 或 制, 可以 UNION 任何
。
14.2.3
14.2.1 , 所 SELECT 。
, SELECT 3 , SELECT 2 。
UNION SELECT , 4 不 5 。
UNION 中 复 ,
SELECT 中 WHERE 。 Indiana 有
Fun4All ,所以 SELECT 。 UNION , 复
。
UNION , 可以 。 ,
所有 ,可 UNION ALL 不 UNION。
输入
输出
分析
UNION ALL,DBMS 不 复 。 , 5 , 中
有 出 。
提示 UNION WHERE
,UNION WHERE
的 。UNION ALL UNION 的 , WHERE
的 。 要 的 出现 重 ,
就 UNION ALL, WHERE。
14.2.4
SELECT 出 ORDER BY 。 UNION ,
ORDER BY , 必 SELECT 。
,不 方式 , 方式
, 不 许 ORDER BY 。
面 面 UNION
输入
输出
分析
说明 UNION
某 DBMS UNION EXCEPT MINUS 可
中 中 的
INTERSECT 可 中 的 。 上, UNION
, 的 可 。
提示
简单, 中的 UNION 的
。 上,UNION 要 的 ,
的 , 下,可 UNION ,
。
14.3
授 何 UNION SELECT 。 UNION,可
以 ,不 中有 复。
UNION 可 简 复 WHERE ,简 中
。
15
何 SQL INSERT 中。
15.1
,SELECT SQL , 14
。 , 有 3 SQL 。 INSERT
。
,INSERT 或 。 有
方式
面 内容。
提示 入
INSERT 可能 要 / 务 DBMS 中的 定 。
INSERT , 的 。
15.1.1
中 简 方 本 INSERT ,
中 。 面
输入
分析
Customers 中。 中
VALUES 中 出,必 。 有 ,
面 cust_contact cust_email , NULL
许 。 必 以 中出 。
提示 INTO
某 SQL 现中, INSERT 的 INTO 可 的。
, 定 要, 提 , SQL
DBMS 可 。
简 , 不 , 。 面 SQL
中 , 容 得 。
可以得 , 不
。 , SQL 不
, 出 。
INSERT 不 方
输入
分析
INSERT ,
出 。 ,DBMS VALUES 中
中 。VALUES 中 ,
, 。
,VALUES 必 以 ,不
出 中 。 , ,
INSERT 。
面 INSERT 所有 面 , 以 不
。 出 ,所以
输入
提示
要 给出 的 INSERT 。给出 能 SQL
, 。
注意 VALUES
INSERT 法,VALUES 的 。 提
, 给 提 提 , 给 出的
。 ,就 息, 的 能 。
15.1.2
所 , INSERT 方 出 。
, 可以 , 可以 , 不
。
输入
分析
本 面 中, 有 cust_contact cust_email
。 必 INSERT 中 。 , INSERT
。
注意
的定义 , 可 INSERT 中 某 。 的
下某 。
定义 NULL 或 。
定义中给出 。 给出 , 。
注意
中 NULL 或 , 中的 ,
DBMS 就 息, 的 能 。
15.1.3
INSERT 有 。INSERT
式,可以 SELECT 中, 所
INSERT SELECT。 , 由 INSERT SELECT
。
中 Customers 中。不
INSERT ,可以
输入
说明 新 说明
CustNew 的 中 出 Customers
。 , 建 CustNew 。CustNew
的 A中 的 Customers 。 CustNew ,
Customers 中 的 cust_id 重
, 的 INSERT 。
分析
提示 INSERT SELECT
简单 , INSERT SELECT 中 的 。
, 定要 。事 上,DBMS SELECT
的 。 的 的 , SELECT 中的
中 定的 , 中
定的 , 。
提示 入
INSERT 。要 , INSERT 。
INSERT SELECT , 可 INSERT , SELECT
, INSERT 。
15.2
有 不 INSERT 。 内容复制
中 ,可以 SELECT INTO 。
说明
DB2 的 SELECT INTO。
面 何 SELECT INTO
输入
SELECT *
INTO CustCopy
FROM Customers;
分析
输入
SELECT INTO ,
提示
SELECT INTO 新 SQL 的 。
,可 的 上 SQL , 的 。
说明
INSERT 法的更 , A 中给出的
。
15.3
何 中。 INSERT
方 , , 何 INSERT SELECT 中
, 何 SELECT INTO 出 。 何
UPDATE DELETE 。
16
何 UPDATE DELETE 。
16.1
中 ,可以 UPDATE 。有 UPDATE
方式
中
中 所有 。
面 。
注意 WHERE
UPDATE 定要 。 ,就 更新 中的
。 , 。
提示 UPDATE
/ 务 的 DBMS 中, UPDATE 可能 要 的
。 UPDATE , 的 。
UPDATE 容 , 可以 容 。 本 UPDATE
由 ,
简 。 1000000005 有 电 邮 ,
,
输入
UPDATE Customers
SET cust_email = 'kim@thetoystore.com'
WHERE cust_id = '1000000005';
UPDATE 以 。 中,
Customers。SET 。 ,SET
cust_email
有不
输入
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';
, SET , =
不 。 中, 1000000006
cust_contact cust_email 。
提示 UPDATE 语
UPDATE 中可 , 能 SELECT 出的
更新 。 的更 , 11 。
提示 FROM
的 SQL 现 UPDATE 中 FROM , 的
更新 的 。 的 DBMS ,
的文 。
,可 NULL 许 NULL 。
输入
UPDATE Customers
SET cust_email = NULL
WHERE cust_id = '1000000005';
中 NULL cust_email 中 。 字 不
字 '' , , NULL 有 。
16.2
中 , DELETE 。有 DELETE
方式
中 所有 。
面 。
注意 WHERE
DELETE 定要 。 ,就 中
。 , 。
提示 DELETE
/ 务 的 DBMS 中, DELETE 可能 要 的
。 DELETE , 的 。
面 ,UPDATE 容 , DELETE 容 。
面 Customers 中
输入
容 。DELETE FROM 中 ,
WHERE 。 中, 1000000006。
WHERE , 中 。
提示
12 ,简单 要 中的 。
可 DBMS 定义 A
中 。 ,DBMS 。 要
Products 中 新 ,DBMS 的 id
, vend_id Vendors 的。 ,
DELETE 的 ,
DBMS 可 某 要 的 。 ,要
Products 中 , OrderItems 的
单中, DELETE 出 中 。 要定义 的
。
提示 FROM
某 SQL 现中, DELETE 的 FROM 可 的。
要, 提 。 SQL DBMS
可 。
DELETE 不 或 。DELETE 不 。
, UPDATE 。
说明
DELETE 中 , 中 。 ,DELETE
。
提示
中 , 要 DELETE。可 TRUNCATE TABLE
, 的 , 更 的 。
16.3
UPDATE DELETE 有 WHERE , 由
。 WHERE , UPDATE 或 DELETE
中所有 。 , UPDATE 不 WHERE , 中
。 , DELETE 不 WHERE
, 所有 。
, 不 不 WHERE
UPDATE 或 DELETE 。
有 内容, 12 , 可
WHERE 可以 或 。
UPDATE 或 DELETE WHERE , SELECT
, ,以 WHERE 不 。
制 内容, 12 ,
DBMS 不 许 。
有 DBMS 许 , 不 WHERE
UPDATE 或 DELETE 。 所 DBMS ,
。
16.4
何 UPDATE DELETE 中 。
, 可 , WHERE
UPDATE DELETE ,
。
17
授 本 。
17.1
SQL 不 , 所有 ,
本 。
有 方
DBMS 有 式
可以 SQL 。
注意 语
的 SQL 现中,CREATE TABLE 的 法可能 。
的 DBMS 法, 的文 。
不 可以 所有 , 出 本 ,
出 本 。 , 体 DBMS 文 。
说明
DBMS 的 CREATE TABLE 的 , A 中给出
的 建 。
17.1.1
CREATE TABLE ,必 出
字, 字 CREATE TABLE 出
字 ,
有 DBMS 。
输入
分析
面 可以 , CREATE TABLE 字。
所有 中, 。 由5
。 以 中必 ,
, 1 。 , D 出
容 。 以 。
提示 语
下 SQL 中 的 。 可 上 ,
可 , 。 , 就可 的方
的 。 的 CREATE TABLE 就 SQL
的 , 上, 定义 的 ,更
。 SQL 定,
某 。
提示
建新的 , 定的 , 出 。
的 ,SQL 要 的 ,
重建 , 简单 建 。
17.1.2 NULL
4 ,NULL 有 或 。 许 NULL 许
不 出 。不 许 NULL 不 有 ,
, 或 , 必 有 。
输入
分析
输入
分析
本书中 Vendors 。 ID 字 必
, NOT NULL。 许 NULL ,所以不 NOT
NULL。NULL , 不 NOT NULL, NULL。
注意 NULL
定 NOT NULL , DBMS 定的 NULL,
的 DBMS 。某 DBMS 要 定 NULL, 定
出 。 的 法信息, 的 DBMS 文 。
提示 NULL
1 , 中 的 。 NULL
的 可 , NULL 的 能 。
注意 NULL
要 NULL 。NULL , 。
定'' 单 , , NOT NULL 中
的。 的 , 。NULL NULL
定。
17.1.3
SQL 许 , 不 出 ,DBMS
。 CREATE TABLE 中 字 DEFAULT 。
输入
分析
OrderItems , 本
Orders 中 。quantity 中 。 中,
DEFAULT 1, DBMS, 不 出 1。
经 或 。 ,
或 , 。 MySQL DEFAULT
CURRENT_DATE(),Oracle DEFAULT SYSDATE, SQL Server
DEFAULT GETDATE()。 , 得
不 DBMS 中 不 。 17-1 出 DBMS
中 。 未 出 DBMS, 文 。
17-1
DBMS /
Access NOW()
DB2 CURRENT_DATE
MySQL CURRENT_DATE()
Oracle SYSDATE
PostgreSQL CURRENT_DATE
SQL Server GETDATE()
SQLite date('now')
提示 DEFAULT NULL
DEFAULT NULL ,
或 的 更 。
17.2
,可以 ALTER TABLE 。 所有 DBMS
,不 中 。
中 未 可 ,
。
所有 DBMS 许 有 ,不 所
以 NULL DEFAULT 有所 制。
许 DBMS 不 许 或 中 。
DBMS 许 中 。
许 DBMS 制 经 有 , 未 有
有 制。
可以 出, 有 复 不 。 何
, 体 DBMS 文 。
ALTER TABLE ,必 出 面
ALTER TABLE 出 必 ,
出
出 。
有 可 所有 DBMS ,所以
输入
分析
Vendors vend_phone ,
CHAR。
或 或 , ,
面 所有 DBMS 有
输入
复 , 以
(1)
(2) INSERT SELECT , 15
复制 。有必 ,可以
字
(3) 所
(4) ,可以
(5) 字
(6) , 。
说明 ALTER TABLE
SQLite ALTER TABLE 的 。 重要的
, ALTER TABLE 定义 ,
建 定。
注意 ALTER TABLE
ALTER TABLE 要 , 的
的 。 的更 能 , 要的
, 法 。 , 的 ,可能
中的 。
17.3
不 内容 简 , DROP TABLE
可
输入
分析
CustCopy 15 中 。 有 ,
不 , 。
提示 意
DBMS , 的 。
, 某 DROP TABLE ,
某 的 , DBMS ,
。 , , 能 的 。
17.4
DBMS 有所不 。 ,不
所有 本 。不 ,
DBMS 。 体 , DBMS 文 。
17.5
SQL 。CREATE TABLE ,ALTER
TABLE 或 或 , DROP TABLE
。 必 ,
。由 不 DBMS 中有所不 ,所以
DBMS 文 。
18
, ,何
何 简 中 SQL 。
18.1
。 不 ,
。
说明
Microsoft Access , SQL 的 方 。 ,
的 Microsoft Access。
MySQL 5 , , 的 较
的 MySQL。
SQLite , 可 建,可 , 能
更 。
方 。 12 面 SELECT
中
输入
。任何 人 必
, 何 。
或 ,必 WHERE 。
, 可以 ProductCustomers
, 可以 出
输入
。ProductCustomers , , 不
任何 或 , 面 以 。
提示
, DBMS 建 法。
18.1.1
经 。 面 。
SQL 。
简 复 SQL 。 ,可以方 不必
本 。
不 。
。可以授 权 , 不
权 。
式 。 可 式不 。
,可以 本 方式 。可以
SELECT , , 或 ,
制, 内容 。
, 。
本 不 , 中 出 。
或 中 , 。
注意
, ,
要的 。 建 的 或
, 能可能 下 。 ,
的 , 。
18.1.2
, 制。不 , 制 不 DBMS
不 , 体 DBMS 文 。
面 制。
, 必 不 或
字 。
可以 有 制。
,必 有 权 。 权 由 人
授 。
可以 , 可以 中
。所 许 不 DBMS 中有所不 可
, 中 ,
面 。
许 DBMS 中 ORDER BY 。
有 DBMS 所有 , 字 ,
, 7 。
不 , 不 有 或 。
有 DBMS , 可以 ,
不 。 体 DBMS 文 。
有 DBMS 许 , 不 不
或 。 有 , 有电 邮 。
, 电 邮 , 不 。
, 许 , 有 DBMS 可 。
提示
上 的 , 的 DBMS 文 可能 的 。 ,
建 , 要 的 定。
18.2
以 , 。
不 。
说明
,可 DROP , 法 DROP VIEW viewname;。
或更新 , , 重新 建。
18.2.1
复 SQL, 。 面
输入
分析
ProductCustomers , ,
任 所有 。 SELECT * FROM
ProductCustomers, 出 任 。
RGAN01 ,可
输入
输出
cust_name cust_contact
------------------- ------------------
Fun4All Denise L. Stephens
The Toy Store Kim Howard
分析
WHERE 中 。 DBMS
, WHERE 中 有 WHERE 中,以
。
可以 出, 简 复 SQL 。 ,可
SQL, 。
提示
建 定 定 的 法。 ,上 建的
RGAN01 的 建 。
的 能 重 , 可能更 。 要
建 。
18.2.2
所 , 式 出 。 面
SELECT 7 中
输入
输出
vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
面 , || 7 所
输入
输出
vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
, 经 式 。 不必 ,
, 可。 ,可
输入
面 ||
输入
分析
以 SELECT 。 ,
所有 邮 ,可
输入
SELECT *
FROM VendorLocations;
输出
vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
说明 SELECT
的 提 , DBMS 中 建 的 法 。
, 建 的
SELECT , 的 法 DBMS 的
, 建 的 。
18.2.3
WHERE 有 。 ,可以
CustomerEMailList , 有电 邮 。 ,可
面
输入
分析
, 电 邮 邮 , 有电 邮
。 WHERE cust_email 中 有 NULL
, 不 出 。
,可以 CustomerEMailList。
输入
SELECT *
FROM CustomerEMailList;
输出
说明 WHERE WHERE
WHERE ,
中, 给 的 。
18.2.4
简 字 , 有 。 面 7 中
SELECT , 中 ,
输入
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
输出
输入
item_price,
quantity*item_price AS expanded_price
FROM OrderItems;
20008 内容 面 出 ,
输入
SELECT *
FROM OrderItemsExpanded
WHERE order_num = 20008;
输出
可以 , 容 , 。 , 可
简 复 。
18.3
。 不 。
SELECT ,可 简 ,
式 或 。
19
, , 何
,以 本 。
19.1
, SQL 或
。 所有 简 ,经 有 复
, 以 。
,必 以 中有 。
有 , ,不 出 人,
以 。
中 有 , 。
可以 ,
。
不 , 出 本书中所 ,
以 。 许 SQL
。 , 体 SQL 不 , 可
中 。
, 可以 独 SQL , 有
。 以 中 ,
必 。
可以 。简 , 以
或 SQL 。可 文 , 不 。
说明
Microsoft Access SQLite 。 , 的
。
MySQL 5 。 , 的 MySQL 较
的 。
说明
, 要 。
的 , 给出简单 , 的 能 。
, 给出的 提 Oracle SQL Server 的 法。
19.2
, 由 ,
面 出 。
中,可以简 复 面
所 。
由 不 复 , 。
所有 人 , 所
。
。 ,出 可
。 。
简 。 或 或 内容 有
, 。 人 不
。
。 制 ,
或 所 。
以 式 ,所以 DBMS 所
, 。
中 SQL , 可以
。
, 有 , 简 。
, 。不 , SQL , 必
。
不 DBMS 中 有所不 。 , 可
不可 。不 , 字以
何 可以 可 。 , DBMS,
不 。
, 本 SQL 复 , ,
经 。 ,许 制
。
有 , 有 , 。 ,
DBMS 有 。
体 DBMS 文 。
说明
DBMS 的 问
的 问 。 事 , 能 或
的 , 可 的 的
。
19.3
得 , 。
SQL 简 , EXECUTE。EXECUTE
任何 。 面
输入
分析
AddNewProduct ,
Products 中。 AddNewProduct 有 , ID
Vendors 。 4
中4 。
Products , 。
, Products 中 有 prod_id ,
。 不
ID, ID 不
。 。以 所
, 所有 4 有
ID
Products , 中
。
本 式。 体 DBMS,可 以
可 , 有不
不 出 ,以 = 方式 出 。
出 , 许 中 所 。
SELECT 。
, 许 。
19.4
所 , 。 得 , 简
, 邮 中 有邮 。
面 Oracle 版本
输入
BEGIN
SELECT COUNT(*) INTO v_rows
FROM Customers
WHERE NOT cust_email IS NULL;
ListCount := v_rows;
END;
分析
有 ListCount 。
不 。 字 OUT 。
Oracle IN OUT ,
INOUT 。
BEGIN END 中, 简 SELECT
, 有邮 。 出 ListCount
出 。
Oracle 可以 面
输入
分析
任何 ,
, SELECT 。
输入
AS
DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
FROM Customers
WHERE NOT cust_email IS NULL;
RETURN @cnt;
分析
有 。 SQL Server 。
中 DECLARE @cnt SQL Server 中所
有 以@ SELECT 中 ,
COUNT() , RETURN @cnt
。
SQL Server 可以 面
输入
分析
任何 ,
, SELECT 。
面 , Orders 中 。
SQL Server,
输入
分析
Orders 中 。 有 ,
ID。 中 。
。 ,
MAX() 1 SELECT 。 INSERT 由
GETDATE()
ID 。 , RETURN @order_num
。 , ,
。
说明 注
, 。 能,
。 的 ,
更 更 。
的 方 -- 。 的
DBMS 的 法, DBMS --,
法。
面 SQL Server 不 版本
输入
分析
Orders 中 。 由 DBMS 。
DBMS SQL Server 中
字 identity field , DBMS auto number 或
sequence 。 , ID。
有 出,DBMS GETDATE() ,
。 得 ID SQL Server 可
@@IDENTITY 中得 , SELECT 。
可以 , ,可以有 方 。不 ,所
方 所 DBMS 制 。
19.5
, 。
, 方 。
, 内容 。 DBMS 不
, DBMS 可 , 有 未
, 体 DBMS 文 。
20
, 何 COMMIT ROLLBACK
。
20.1
transaction processing , SQL
, 不 , 。
12 所 , 中, 容
。不 究 何以 ,
, 式 。
面 Orders 。 Orders
OrderItems 中 Orders ,OrderItems
。 1 ID
, 。
(1) 中 , 不 ,
(2) ID
(3) Orders , ID
(4) Orders 中 ID
(5) OrderItems 中 , 出 ID
Orders ID Products 。
由 出 制 ,
。 中 出
, Orders , 不 有
。 有 。 ,所
。可以有 出 方 。
, Orders , OrderItems ,
, 中有 。
, OrderItems 出 ,
中 不 , 不 。
何 。 制,
必 SQL , 不 不
。 ,可以 不 中 ,
, 不 。 有 ,
, ,
复 。
, 何
(1) 中 , 不 ,
(2)
(3) ID
(4) Orders 中
(5) Orders 出 ,
(6) Orders 中 ID
(7) , OrderItems
(8) OrderItems 出 , 所有 OrderItems
Orders 。
,有 复出 。 面
transaction SQL
rollback SQL
commit 未 SQL
savepoint 中 placeholder ,
可以 不 。
提示 语
事务 INSERT UPDATE DELETE 。 能 SELECT
SELECT 要 , 能 CREATE 或 DROP
。事务 中可 , , 。
20.2
经 , 面 中 。
注意
DBMS 现事务 的 法 。 事务
的 DBMS 文 。
SQL , 何
,何 不 。
输入
BEGIN TRANSACTION
...
COMMIT TRANSACTION
分析
MariaDB MySQL 中
输入
START TRANSACTION
...
Oracle
输入
SET TRANSACTION
...
输入
BEGIN
...
DBMS 体。 , 有
何 。 , 中 。 ,COMMITT
,ROLLBACK , 。
20.2.1 ROLLBACK
输入
分析
中, DELETE , ROLLBACK 。 不
有 , , 中,DELETE
INSERT UPDATE 不 。
20.2.2 COMMIT
SQL 。 所
式 implicit commit , 或 。
中, 不 式 。不 ,不 DBMS 有所不
。有 DBMS 式 ,有 不 。
输入
BEGIN TRANSACTION
DELETE OrderItems WHERE order_num = 12345
DELETE Orders WHERE order_num = 12345
COMMIT TRANSACTION
分析
Oracle 中 ,可
输入
SET TRANSACTION
DELETE OrderItems WHERE order_num = 12345;
DELETE Orders WHERE order_num = 12345;
COMMIT;
20.2.3
简 ROLLBACK COMMIT , 可以 或 。
, 简 ,复 可 或 。
面 。 ,
Orders 可。不 Customers
。
,必 中 。
, ,可以 。
输入
SAVEPOINT delete1;
SQL Server 中,
输入
字,以 ,DBMS
何 。 本 出 , SQL Server 中可 。
输入
输入
ROLLBACK TO delete1;
面 SQL Server
输入
BEGIN TRANSACTION
INSERT INTO Customers(cust_id, cust_name)
VALUES('1000000010', 'Toys Emporium');
SAVE TRANSACTION StartOrder;
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20100,'2001/12/1','1000000010');
分析
中 4 INSERT 。 INSERT
, , 面 任何 INSERT ,
。 SQL Server 中,可 @@ERROR
, 。 DBMS 不 或
。 @@ERROR 0 , 有 ,
。 , COMMIT 以 。
提示
可 SQL 中 任 的 , 。
, 就 能 。
20.3
必 SQL 。 何
COMMIT ROLLBACK 何 何
何 , 制 。
, 内容 。 DBMS 不 ,
内容 体 DBMS 文 。
21
授 , 何 。
21.1
SQL , SQL
或 。简 SELECT , 有 得
或 10 。 DBMS 。
SQL 出的 。
有 , 出 中 或 或 ,
所 。 cursor DBMS ,
不 SELECT , 出 。
, 可以 或 中 。
不 DBMS 不 。
。
, , 不 。
制可以
。
可 , 不可 。
, 或 所有
可 。
DBMS 出 不 出 中 复制,
不 。
说明
Microsoft Access , 的 Microsoft Access。
MySQL 5 。 , 的 MySQL 较
的 。
SQLite 的 step , 的
SQLite 的 , 法可能 。
式 , 中 ,
或 出 。
说明
Web 的 ASP ASP.NET ColdFusion PHP Python
Ruby JSP 。 务
, / 务 Web , 务
。 , Web
, 的 要重新 的 能。
21.2
。
,必 。 有 ,
SELECT 。
, 必 以 。 面 SELECT
出 。
有 , 出 。
,必 ,可 , 有
体 DBMS 。
,可 。 ,可
。
21.2.1
输入
面 Oracle PostgreSQL 版本
输入
分析
面 版 本 中 , DECLARE ,
CustCursor。SELECT 有电 邮 NULL
所有 。
, 可以 。
21.2.2
输入
分析
OPEN CURSOR , , 出 以
。
可以 FETCH 。FETCH 出 ,
何 以 何 。 Oracle
中
输入
分析
中,FETCH ,
CustRecord 中。 出 不 任何 。
Oracle 中, , 出
输入
分析
, FETCH ,
CustRecord 中。 不 , FETCH LOOP 内,
输入
分析
中, 出 ,FETCH
中。 WHILE , WHILE
@@FETCH_STATUS = 0 不出 出 。
不 体 , 中, 体
中 ... 。
21.2.3
面 所 , 。 ,SQL Server
DBMS 所 。 面 DB2 Oracle
PostgreSQL 。
输入
CLOSE CustCursor
输入
CLOSE CustCursor
DEALLOCATE CURSOR CustCursor
分析
CLOSE 。 , 不 , 不
。 不 , OPEN 可。
21.3
本 授 , 。 DBMS 可
式 ,以 有 。 内容
体 DBMS 文 。
22 SQL
SQL 所 。
22.1
SQL 经 版本, 。许 有
, 。
经 面 。 所 ,
, 。
由 referential integrity 。
, 方 中 。
, Orders ,OrderItems 内容,
OrderItems 中 任何 ID Orders 中。
, Orders 中 任 必 Customers 中。
可以 SELECT,以 所
有 , 不 , 。
面 ,
, 有 不 。
UPDATE DELETE , 必 。
, DBMS 。
或 的 。
DBMS 。
中 , 17 所 , CREATE TABLE 或 ALTER TABLE
。
注意
的 , DBMS 提 的 。 ,
给出的 的 DBMS 上可能 的 。 ,
的 DBMS 文 。
22.1.1
1 简 。 , 或
中 , 不 。 , 中 或
中 。 方 或 中
。 有 , UPDATE 或 DELETE 不
。
中任 以 , 可以 。
任 不 。
有 中不 许 NULL 。
不 或 。 DBMS 不 许 ,
DBMS 许 , ,
不 。 中 , 不 。
方 , 所 。
输入
分析
输入
分析
, CONSTRAINT 。 可
以 CREATE TABLE ALTER TABLE 。
说明
SQLite ALTER TABLE 定义 ,
要 的 CREATE TABLE
中定义 。
22.1.2
中 , 必 中。
。 。
Orders 中。
Customers 中。Orders 中 ID Customers 中
。 ID Customers , 有
ID。 Orders , 有 。
Orders 中 ID 不 。 有 ,
有 有 ID 有不 。
,Orders 中 ID Customers 中 ID。
。 中, Orders ID
, Customers 。
面 方 。
输入
分析
中 REFERENCES 字, cust_id 中 任何
必 Customers cust_id 中 。
输入
提示 意
6 , , 重要 。
定义 ,DBMS 中 的 。
, 能 单的 。 的 方法
的 单 要 的 单 。 要 的 ,
可 。
22.1.3
或 中 。
, 以 。
可 , 许 。
可 NULL 。
可 或 。
可 复 。
不 , 不 。
employees 。 有 社 ,
不 , 不 容
。 , 社 有 ID 。
ID ,可以 。 可 DBMS
社 不 人 。可以
社 UNIQUE 。
。 可以 UNIQUE
字 中 , 可以 独 CONSTRAINT 。
22.1.4
或 中 。
有以 。
或 。 , 0 0 。
。 , , 不
。
许 。 , 字 中 许 M 或 F。
, 1 制 中可 。
内 制, 制 ,可以
。
不 或
,DBMS 本 任何 。
面 OrderItems , 所有
0。
输入
分析
,任何 或 , quantity
0。
输入
提示
的 DBMS 定义 的 。 定义 或
的 简单 。 , 可 定义 的 gender
的 , 单 的文 , M或F
或 NULL 的 。 ,可
的定义。定 的
定义中 , , 。
的 DBMS 文 , 定义 。
22.2
以 。 本书
本书 ,可以 。
出本书中所有 ,简 1
, 。 可以 任 , 不
。 文字可 , 以 方式 书 不可 。
不 , 出所 。
书 有 。 字 出 书中
。 ,可 中 出 , 出
中。 , 出 。
有 简 , 。 出书中
不 必 , 书 内容 有 。
书 内容 字 , 有必 字 有 。
。 , DBMS 。
, 有 。
, 中 不 。 ,
, 未 ,DBMS 必 出 中所有
, 。 有 书中 出 。
方 。可以 或 , DBMS
内容 。 ,DBMS 以 书
方 。DBMS , 出 ,
。
, 以 内容。
, 。
,DBMS 必 。
可 。
所有 。 不 不 有
可 或 , 得 。
。 经 以
, 可 。
可以 中 , 。 以
有 。 , 有 。
有 ,何 。 DBMS 可
, 经 。
输入
分析
必 。 prod_name_ind 字 CREATE
INDEX 。ON , 中 中
有 中 出。
提示
的 的 或 。 现,
建的某 的 的 可能
。 定 , 要 。
22.3
, 。
可以 INSERT UPDATE DELETE 或 。
不 简 SQL ,
。 Orders INSERT
Orders 中 。 , Customers INSERT
UPDATE 出 。
内 有以 权
INSERT 中 所有
UPDATE 中 所有
DELETE 中 。
所 DBMS 不 , 可 或 。
面 。
。 , INSERT 或 UPDATE 中 所有
。
。 , 或
。
。 , 可
不 , 经 出, 。
或 。
者可 经 ,不 DBMS ,
文 。
面 , 所有 INSERT UPDATE ,
Customers 中 cust_state 。
输入
本 Oracle PostgreSQL 版本
输入
提示
, 的 比 , 可能的 ,
。
22.4
, 有 , ,
不 或任 。 , 必 许
, DBMS 制, 制授
或 制 。
任何 授权 。 ,
, 有权 , 许 。
有 DBMS , 有
, 有 。
, 有
或
或
或
, 许 制
制 。
22.5
本 授 何 SQL 。
, 可 , 可以
, 可 。不 DBMS 可 以不 式
, 体 DBMS 文 。
SQL 本 。 不
中, 何 , 中 何 ,
SQL 不可 。
者 本书 。所有
文 。 内容,本 所
以 何 或 得 。
A.1
本书中所 经
。 以 任
5
。以 出 。
说明
的 ,现 中的 单
的 信息 信息 。 ,
现 中 的 的 。 可
的 。
面 5 内 。
1. Vendors
Vendors 。 中有 ,
ID vend_id 。
A-1 Vendors
明
vend_id ID
vend_name
vend_address
vend_city 所
vend_state 所
vend_zip 邮
vend_country 所 家
所有 有 。 vend_id 。
2. Products
Products , 。 有 ID
prod_id , vend_id ID 。
A-2 Products
明
prod_id ID
vend_id ID Vendors vend_id
prod_name
prod_price
prod_desc
所有 有 。 prod_id 。
, vend_id , Vendors
vend_id 。
3. Customers
Customers 所有 。 有 ID cust_id 。
A-3 Customers
明
cust_id ID
cust_name
cust_address
cust_city 所
cust_state 所
cust_zip 邮
cust_country 所 家
cust_contact
cust_email 电 邮
所有 有 。 cust_id 。
4. Orders
Orders 不 。
order_num 。Orders cust_id Customers
ID 。
A-4 Orders
明
order_num
order_date
所有 有 。 order_num 。
, cust_id ,
Customers cust_id 。
5. OrderItems
OrderItems 中 , 。
Orders , OrderItems 中有 或 。
由 。
order_num Orders 中 ID
。 , ID
Products 。
A-5 OrderItems
明
order_num Orders order_num
order_item 内
prod_id ID Products prod_id
quantity
item_price
所有 有 。 order_num order_item
。
, order_num prod_id ,
order_num Orders order_num , prod_id Products
prod_id 。
方式。 ,
面 , 。 A-1 本
。
A-1
A.2
, 。所 得
可以 本书 http://www.forta.com/books/0672336073/ 。
A.2.1
可 URL 式 文
文 ,不 任何 SQL 本。
create.text 5 所有
SQL 。
populate.txt SQL INSERT 。
文 中 SQL 体 DBMS,
DBMS 。 本 方 者 , 者
不 任何 任。
本书 ,有以 本可
IBM DB2
Microsoft SQL Server Microsoft SQL Server Express
MariaDB
MySQL
Oracle Oracle Express
PostgreSQL。
DBMS 本可 或 。
B 中 本 。
说明
建 。 的
。 建 , 的问题。
说明
DBMS 的 的 DBMS 。
下 或 , README 文 , 提 定
DBMS 的 。
1 所 ,SQL 不 , 。 本书中
, SQL 。
本 中 SQL 。
可以 面 出 任何 或 SQL
。 ,究
许 DBMS 有 , 出
。 有 有 面。
Web 人 , 可以 任何 Web
, ASP.NET ColdFusion Java JSP PHP Python Ruby
on Rails。
有 方 ,本书 http://www.forta.com/books/
0672336073/ 有 中 。
(1) ColdFusion 内 任 ,必 。
ColdFusion Administrator Web
面 , ColdFusion 文 。
(2) ColdFusion CFM 。
(3) CFML <CFQUERY> </CFQUERY> 。 NAME
DATASOURCE 中 Data Source。
(4) <CFQUERY> </CFQUERY> SQL 。
(5) <CFDUMP>或<CFOUTPUT> 。
(6) Web 任 可 中 面。
(7) Web 中 面 。
B.4 MariaDB
MariaDB 有 , MySQL
容 。 B.10 。
(1) .aspx 文 。
(2) SqlConnection()或 OleDbConnection() 。
(3) SqlCommand()或 OleDbCommand() DBMS 。
(4) ExecuteReader DataReader。
(5) reader 以 得 。
(6) Web 任 可 中 面。
(7) Web 面 。
提示 -
MS-Query Office , 能
。 Start 上 给出,可 Start Find
上 , 给出 。要 的文
MSQRY32.EXE 或 MSQUERY.EXE。
Microsoft Query, 。
B.10 MySQL
有 方式 MySQL。DBMS 有 mysql
。 文本 , MySQL ,
任何 SQL 。 ,MySQL 者 MySQL
Workbench , 独 ,所以 不 出
中。 MySQL , 。
mysql, 。
(1) mysql 。 何 ,可 -u
-p 。
(2) mysql> USE database , USE tysql
tysql 。
(3) mysql> SQL , 必 以 ; 。
。
(4) 可 \h, \s MySQL 版
本 。
(5) \q 出 mysql 。
MySQL Workbench, 。
B.11 Oracle
Oracle 有 。 SQL Oracle SQL Developer,
可以 MySQL DBMS , 可以独 。 面
何 。
B.13 PHP
PHP Web 本 。
, , SQL 可 所 以 何
DBMS 。 , DBMS ,
MySQL 。 何 体 DBMS
, PHP 文 。
B.14 PostgreSQL
有 方式 PostgreSQL。DBMS 有 psql
, 文本 , PostgreSQL , 任
SQL 。 ,有 pgAdmin , DBMS
,可 SQL 。
psql, 。
(1) psql 。 ,
, 式 psql database PostgreSQL 不 USE 。
(2) => SQL , 以 ; 。
。
(3) \?,可 出可 。
(4) \h,可得 SQL \h statement \h SELECT ,
可得 SQL 。
(5) \q 出 psql 。
pgAdmin, 。
B.15 SQLite
SQLite 中 ,不 独 。
,SQLite 有 ,可以 SQLite
。 SQLite sqlite3 或 Windows
sqlite3.exe 。 sqlite3, 。
B.16 ODBC
面 ODBC , , 简
ODBC,以 ODBC 。
ODBC , 不 或
。 ODBC, 中 ,
所有 或 DBMS 。
ODBC 本 不 , , 所有 以
方式 。 有
。 , 本 或 , 。
, 。
ODBC 所 SQL。
ODBC 不 , ODBC
。 ,
有 何 文
。
注意
的 ODBC , 可能提 的
。 的 , 的提 。
C SQL
者 ,本 出
SQL 。 以简 , 出 。
方 , 所 。
, 以 。
输入
...
);
C.2 COMMIT
COMMIT 。 内容 20 。
输入
COMMIT [TRANSACTION];
输入
输入
输入
输入
C.7 DELETE
DELETE 中 或 。 内容 16 。
输入
C.8 DROP
DROP 。 内容 17
18 。
输入
DROP INDEX|PROCEDURE|TABLE|VIEW
indexname|procedurename|tablename|viewname;
C.9 INSERT
INSERT 。 内容 15 。
输入
输入
C.11 ROLLBACK
ROLLBACK 。 内容 20 。
输入
ROLLBACK [ TO savepointname];
或者
输入
ROLLBACK TRANSACTION;
C.12 SELECT
SELECT 或 中 。 本 ,
2 3 4 2 14 SELECT 有 。
输入
C.13 UPDATE
UPDATE 中 或 。 内容 16 。
输入
UPDATE tablename
SET columname = value, ...
[WHERE ...];
D SQL
1 所 , 中可以 以
本 。
以 。
许 制可 中 。 ,
。
许 内 有 。可以 文本字
简 式 。
许 。 所有 字 ,
1 10 , 10 2 字 以字 ,
, 字 。 ,
。
, 所 。 可
。 不
可 。
本 不 何 ,
容 。
注意 意
,现 要 提醒。 DBMS 的 可能
的 。 DBMS 中, 的 可能
的 。 的 DBMS
的 信息, 的 DBMS 文 。
D.1
字 。 字 , 字
电 邮 。有 本 字 , 字
字 D-1 。
字 字 , 。 ,
字 可 许 30 字 , 社 许 11 字 许 字
中 。 不 许 字 。
。 , 字 Ben 30 字
字字 , 30 字 , 字 ,或
NULL。
字 任 文本 不
DBMS 。有 有 , 有
。不 , 有 得以 不 。
,
。DBMS 得 。 ,许 DBMS 不
许 或 可 ,
22 。
D-1
明
CHAR 1 255 字 字 。 必
NCHAR CHAR 式, 字 或Unicode字
不
NVARCHAR TEXT 式, 字 或Unicode字
不
TEXT LONG MEMO 文本
或VARCHAR
提示
的 , 单 。
注意
可能 中
, 可 。 中
01234, 的 1234, 上 。
要 的 中 的
, 中 可能
, 中。
D.2
。 DBMS ,
有不 。 , ,所
。 ,有 制 ,
有 。 D-2 出 。 所有 DBMS
所 出 。
D-2
明
BIT 制 ,或者 0或者 1, /
DECIMAL 或NUMERIC 或 可
FLOAT 或NUMBER
INT 或INTEGER 4字 , 2147483648 2147483647
REAL 4字
SMALLINT 2字 , 32768 32767
TINYINT 1字 , 0 255
提示
, 。
提示
DBMS 的 。
MONEY 或 CURRENCY , 上 定 的
DECIMAL ,更 。
D.3
所有 DBMS D-3 。
, DBMS , 有不 。
注意
DBMS 的定义 的 方法。 现
2015-12-30 或 Dec 30th, 2015 , , 的 DBMS
。 的 DBMS 能 ,
的文 。
D-3
明
DATE
DATETIME 或TIMESTAMP
SMALLDATETIME , 或
TIME
提示
DBMS 定的 , ODBC 建
的 , ODBC 。ODBC
{d '2005-12-30'}, {t '21:46:29'},
{ts '2005-12-30 21:46:29'} 。
ODBC SQL, 方 。
D.4
制 不 有 容 ,
。 所有 有 不 ,
制 可 任何 , 可 制 ,
体 字 文 D-4 。
D-4
明
BINARY 制 255B 8000B,有
体
LONG RAW 制 , 2 GB
RAW BINARY 制 , 255B
VARBINARY 制 255B 8000B
, 体
说明
比较的 , 中 建
的 建 A 。 比较 DBMS 的
,可 的任务。
E SQL
SQL 由 字 , 字 SQL
。 , 不
字。 , 字 。
本 出 DBMS 中 字。 以 。
字 不 DBMS , 面 所有 字 所有
DBMS 。
许 DBMS SQL 字, 。
DBMS 字未 面。
以 容 可 , 字,
不 DBMS 字。
ABORT AS BETWEEN
ABSOLUTE ASC BIGINT
ACTION ASCENDING BINARY
ACTIVE ASSERTION BIT
ADD AT BLOB
AFTER AUTHORIZATION BOOLEAN
ALL AUTO BOTH
ALLOCATE AUTO-INCREMENT BREAK
ALTER AUTOINC BROWSE
ANALYZE AVG BULK
AND BACKUP BY
ANY BEFORE BYTES
ARE BEGIN CACHE
SQL
ALTER TABLE
ALTER TABLE 式。可以 CREATE TABLE
。 可 17 。
COMMIT
COMMIT 。 可 20 。
CREATE INDEX
CREATE INDEX 或 。 可 22 。
CREATE TABLE
CREATE TABLE 。可以 ALTER TABLE
式。 可 17 。
CREATE VIEW
CREATE VIEW 或 。 可 18 。
DELETE
DELETE 中 或 。 可 16 。
DROP
DROP 。 可
17 18 。
INSERT
INSERT 。 可 15 。
INSERT SELECT
INSERT SELECT SELECT 中。 可 15 。
ROLLBACK
ROLLBACK 。 可 20 。
SELECT
SELECT 或 或 中 。 可 2
3 4 2 14 不 方面 SELECT 。
UPDATE
UPDATE 中 或 。 可 16 。