You are on page 1of 258

图灵社区会员 maik000 专享 尊重版权

图灵社区的电子书没有采用专有
客户端,您可以在任意设备上,
用自己喜欢的浏览器和PDF阅读
器进行阅读。

但您购买的电子书仅供您个人使
用,未经授权,不得进行传播。

我们愿意相信读者具有这样的良
知和觉悟,与我们共同保护知识
产权。

如果购买者有侵权行为,我们可
能对该用户实施包括但不限于关
闭该帐号等维权措施,并可能追
究法律责任。

图灵社区会员 maik000 专享 尊重版权


图灵社区会员 maik000 专享 尊重版权
图灵社区会员 maik000 专享 尊重版权
(2014.4 重印)

内容提要
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

版权声明

Authorized translation from the English language edition, entitled Sams


Teach Yourself SQL in 10 Minutes, 4th Edition by Ben Forta, published by
Pearson Education, Inc., publishing as Sams. Copyright © 2013 by Pearson
Education Inc.
All rights reserved. No part of this book may be reproduced or transmitted
in any form or by any means, electronic or mechanical, including photocopying,
recording or by any information storage retrieval system, without permission
from Pearson Education, Inc.
Simplified Chinese-language edition copyright © 2013 by Posts & Telecom
Press. All rights reserved.

本书中文简体字版由 Pearson Education Inc.授权人民邮电出版社独


家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。

版权所有,侵权必究。

图灵社区会员 maik000 专享 尊重版权


引 言| 1

SQL 。不 者

Web 人 , Microsoft Office,


SQL 。

本书可以 。 授 Web , 经
SQL 书。SQL 方面 书 ,有 不 ,
有 , 授 内容 , 人 不

。 书 不 SQL 本 ,
以 , 。 , 内容
, 者 SQL, 未必 。

, 不 书 , 授 SQL
本书。本书 授 者 SQL , 简

, 复 内容,
以 。 者 本书中
SQL 。

图灵社区会员 maik000 专享 尊重版权


2| 引 言

本书 4 版, 经 家 30 者 SQL,
出版 版本。 ,
1 , 。 出 SQL。

本书 以 者

SQL
SQL
何 SQL
人 有 SQL。

DBMS
,本书中所 授 SQL 可以 任何

DBMS 。 , SQL 不 ,本书 SQL


以 出

Apache Open Office Base


IBM DB2
Microsoft Access
Microsoft SQL Server Microsoft SQL Server Express
MariaDB
MySQL
Oracle Oracle Express
PostgreSQL
SQLite。

图灵社区会员 maik000 专享 尊重版权


引 言| 3

本书中 所有 或者 SQL 本
DBMS , 可以 本书 http://forta.com/books/
0672336073/ 得。

本书 字体 , 者 文本 出 文
本 以 字体 出。

It will look like this to mimic the way text looks on your screen.

式 体 , 可以 体 。

➥ , 容 不 。 ➥
所有字 内容。

说明
给出上下文讨论中比较重要的信息。

提示
就某任务给出建议或更简单的方法。

注意
提醒可能出现的问题,避免出现事故。

新术语
清晰定义重要的新词汇。

图灵社区会员 maik000 专享 尊重版权


4| 引 言

输入

者可以 , 出 。

输出

出, 出 。

分析

图灵社区会员 maik000 专享 尊重版权


|1

Sams 出版 。 Mark
Taber, 本 书, 书 。

Greg Wilson, 本书 面 。

者 本书 版 。 ,
, 得本版
。 家 版 出 。

有 所 本书 IT 或 书,
。 得 授 任,
, 。

, 本书 版 30 者, 本书不
本书, SQL 方面 书 。
者 得 。

Ben Forta

图灵社区会员 maik000 专享 尊重版权


|1

目 录

1 SQL ................................................................................................. 1

1.1 ....................................................................................... 1
1.2 SQL ...................................................................................... 6
1.3 ........................................................................................... 7
1.4 ................................................................................................... 8

2 .................................................................................................. 9

2.1 SELECT ..................................................................................... 9


2.2 ..................................................................................... 10
2.3 ..................................................................................... 12
2.4 所有 ..................................................................................... 13
2.5 不 ................................................................................. 14
2.6 制 ......................................................................................... 15
2.7 ......................................................................................... 18
2.8 ................................................................................................. 20

3 ....................................................................................... 21

3.1 ......................................................................................... 21
3.2 ................................................................................. 23
3.3 ................................................................................. 24

图灵社区会员 maik000 专享 尊重版权


2|

3.4 方 ................................................................................. 25
3.5 ................................................................................................. 28

4 ................................................................................................ 29

4.1 WHERE ............................................................................ 29


4.2 WHERE ......................................................................... 31
4.3 ................................................................................................. 36

5 ........................................................................................ 37

5.1 WHERE ............................................................................ 37


5.2 IN ........................................................................................ 41
5.3 NOT ..................................................................................... 43
5.4 ................................................................................................. 45

6 ............................................................................... 46

6.1 LIKE ................................................................................... 46


6.2 ......................................................................... 53
6.3 ................................................................................................. 53

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

图灵社区会员 maik000 专享 尊重版权


|3

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

12.1 ............................................................................................. 101


12.2 ..................................................................................... 104
12.3 ..............................................................................................111

13 ................................................................................... 112

13.1 ................................................................................. 112


13.2 不 ................................................................. 113
13.3 ............................................................. 119
13.4 ................................................................. 121
13.5 ............................................................................................. 121

14 ............................................................................................ 122

14.1 ..................................................................................... 122

图灵社区会员 maik000 专享 尊重版权


4|

14.2 ............................................................................. 123


14.3 ............................................................................................. 129

15 ............................................................................................ 130

15.1 ..................................................................................... 130


15.2 复制 ......................................................... 137
15.3 ............................................................................................. 138

16 ............................................................................... 139

16.1 ..................................................................................... 139


16.2 ..................................................................................... 141
16.3 ............................................................. 143
16.4 ............................................................................................. 144

17 ................................................................................... 145

17.1 ......................................................................................... 145


17.2 ......................................................................................... 150
17.3 ......................................................................................... 153
17.4 ..................................................................................... 153
17.5 ............................................................................................. 154

18 ............................................................................................ 155

18.1 ............................................................................................. 155


18.2 ..................................................................................... 158
18.3 ............................................................................................. 165

19 ................................................................................... 166

19.1 ..................................................................................... 166


19.2 ............................................................. 167
19.3 ............................................................................. 169
19.4 ............................................................................. 170
19.5 ............................................................................................. 174

图灵社区会员 maik000 专享 尊重版权


|5

20 ................................................................................... 175

20.1 ..................................................................................... 175


20.2 制 ............................................................................. 177
20.3 ............................................................................................. 182

21 ............................................................................................ 183

21.1 ............................................................................................. 183


21.2 ..................................................................................... 184
21.3 ............................................................................................. 189

22 SQL ................................................................................. 190

22.1 ............................................................................................. 190


22.2 ............................................................................................. 197
22.3 ......................................................................................... 199
22.4 ................................................................................. 201
22.5 ............................................................................................. 202

A .......................................................................................... 203

B .................................................................................. 210

C SQL ................................................................................ 223

D SQL ..................................................................................... 228

E SQL ......................................................................................... 234

SQL ............................................................................................ 238

......................................................................................................................... 240

图灵社区会员 maik000 专享 尊重版权


|1

1 SQL

SQL 究 , 。

1.1
本 SQL 书, 以 方式 。SQL
任 , SQL ,
本 有所 。

可 有 , 。 电 邮
字 , 。 ,
。 中 ,
。 ATM ,

, 究 不 。
何 人 可 不 ,
。 , 出 , 以 。

提示
的简要 。 定的
,可 下 ,可

图灵社区会员 maik000 专享 尊重版权


2|

的 。 SQL 的重要
提, 要, 或
的 。

1.1.1

, 本书 SQL ,
以 有 方式 。 简
文 。 文 ,不
, 不 何 。

的 的 文 或 文 。

注意
的 ,
的, 。 ,
DBMS 。 DBMS 建 的 ,
, , 。

1.1.2

文 , 不 ,
文 中 文 , 文 中。

中, 文 。 文 ,可
。 可以 ,或者

图灵社区会员 maik000 专享 尊重版权


|3

某 定 的 清单。

, 中 或 。
不 中, 以
。 , 。

中 有 字 。 字 ,
中 有 有 字。

说明
的, 上 的 。 的
的 的 。 就 ,
中 能 的 , 的 中 可
的 。

有 , 中 何 ,
, 何 , 何 。
所 schema , 式可以 中 ,
可以 中 。

的 的信息。

1.1.3
由 。 中 。

中的 。 或 的。

图灵社区会员 maik000 专享 尊重版权


4|

, 电 。
中 。 , 中,
, , 以 邮
中。

提示 分
重要。 ,
的 。 , 可能 定的
出 定 或 定 的 。
中, 或 就

可 的 定 。 ,
可 。 问题,
, , 。

中 有 。 datatype 可
以 。 , 中 字 或许 中
, 。 中
文本 , 。

的 的 。 的 , 或
中 的 。

可 中 , 字 中
字 。 , 方面
。 , 必 所 。

图灵社区会员 maik000 专享 尊重版权


|5

注意
SQL 的 要 。
的 , 的 。更 的 ,
的 的 DBMS 中 的 。
法,重要的 建 要 。

1.1.4

中 ,所 内。
, 中 , 。

, 可以 。 中 。

中的 。

说明
可能 提 record 。
可 的, 上 , 的 。

1.1.5

中 有 或 可以 。 可以
, 可以 ID。 可以 ID 或
社 。

或 , 能 中 。

图灵社区会员 maik000 专享 尊重版权


6|

中 或 。
。 有 , 或 中 , 不

提示
要 , 建的
, 的 。

中 任何 可以 , 以

任 不 有
必 有 不 许 NULL
中 不 许 或
不 中 , 不 以 。

, 不 必 , 可以
。 , 必 所有 ,
所有 必 可以不 。

有 , , 12 中 。

1.2 SQL
SQL 字 S-Q-L 或 sequel Structured Query Language
。SQL 。

或 Java C PHP 不 ,SQL


中 有 , 有 。 SQL
任 中 简 有 方 。

图灵社区会员 maik000 专享 尊重版权


|7

SQL 有 。

SQL 不 有 。 所有 DBMS
SQL,所以 所有 。
SQL 简 。 由有 ,
不 。
SQL 简 , 有 ,
,可以 复 。

面 SQL。

说明
DBMS 或 , SQL 。
的 的 提 定 的 能或简 方法。
, DBMS 的, 上的

SQL ANSI , ANSI SQL。 要


的 DBMS, 的 , ANSI SQL。 现
的 , PL/SQL Transact-SQL 。

的 SQL 要 ANSI SQL。 某 DBMS 定的 SQL


, 。

1.3
任何 , SQL 方 。 ,
SQL 。

图灵社区会员 maik000 专享 尊重版权


8|

本书中所有 SQL 。 A 出
体 , 得 或 , 者
授 内容。 B 中 SQL 所 。
, 者 内容, 以

1.4
SQL, 有 。 SQL
,所以, 复 本 。

图灵社区会员 maik000 专享 尊重版权


|9

何 SELECT 中 或 。

2.1 SELECT
1 所 ,SQL 由简 。
字, SQL 由 或 字 。 经
SQL SELECT 。 或 中

SQL 的 。 能 或 的 。 E
出 某 的 。

SELECT ,必 出 ,
以 方 。

说明
中的 SQL 出 A中 的
文 。 要 建议 ,
A, 下 或 建 文 。

图灵社区会员 maik000 专享 尊重版权


10 |

重要的 ,要 SQL 。
SQL 出, 的 的。
的 的 , B
的 出 中 的 。 要 某
, B中 给出 的建议。

2.2
简 SQL SELECT , 所

输入

SELECT prod_name
FROM Products;

分析

SELECT Products 中 prod_name


。所 SELECT 字 ,FROM 字 出
中 。 出 所

输出

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

图灵社区会员 maik000 专享 尊重版权


| 11

说明
,可能 现 出的 的
。出现 。 下
, 的 定的 。 的 可能
中的 , 可能 。 要 的 ,就 的。

简 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;

图灵社区会员 maik000 专享 尊重版权


12 |

SELECT
prod_name
FROM
Products;

SQL , SQL 更 。

2.3
中 , SELECT 。 不
必 SELECT 字 出 , 必 以 。

提示
, 定要 上 ,
。 , 出现 。

面 SELECT Products 中 3 。

输入

SELECT prod_id, prod_name, prod_price


FROM Products;

分析

, SELECT Products 中
。 中, 3 , 。

输出

prod_id prod_name prod_price


--------- -------------------- ----------

图灵社区会员 maik000 专享 尊重版权


| 13

BNBG01 Fish bean bag toy 3.4900


BNBG02 Bird bean bag toy 3.4900
BNBG03 Rabbit bean bag toy 3.4900
BR01 8 inch teddy bear 5.9900
BR02 12 inch teddy bear 8.9900
BR03 18 inch teddy bear 11.9900
RGAN01 Raggedy Ann 4.9900
RYL01 King doll 9.4900
RYL02 Queen dool 9.4900

说明 示
上 出可 ,SQL 的 的 。
的 问题, 问题。 , 上 的
的 的
中 定。 出的 提
的 。

2.4
所 所 , 或 ,SELECT 可以
所有 不必 出 。 *
可以 , 所 。

输入

SELECT *
FROM Products;

分析

* , 中所有 。
中出 , 不 。不 ,SQL
, , 式 , 出 。 ,
不 。

图灵社区会员 maik000 专享 尊重版权


14 |

注意
, 要 中的 , * 。
能 事, 出 ,
要的 的 能。

提示
。 定
, 能 出 的 。

2.5
所 ,SELECT 所有 。 , 不
出 , , products 中所有
ID

输入

SELECT vend_id
FROM Products;

输出

vend_id
----------
BRS01
BRS01
BRS01
DLL01
DLL01
DLL01
DLL01
FNG01
FNG01

图灵社区会员 maik000 专享 尊重版权


| 15

SELECT 9 中 有3 , products
中有 9 。 何 出不

DISTINCT 字, , 不

输入

SELECT DISTINCT vend_id


FROM Products;

分析

SELECT DISTINCT vend_id DBMS 不 有


vend_id ,所以 面 出, 有 3 。 DISTINCT
字, 必 面。

输出

vend_id
----------
BRS01
DLL01
FNG01

注意 分 DISTINCT
DISTINCT 的 , 的 。
, 定 SELECT DISTINCT vend_id, prod_price, 定的
, 的 出 。

2.6
SELECT 中所有 , 可 。

图灵社区会员 maik000 专享 尊重版权


16 |

或者 , 可 ,
, 中 SQL 不 。

SQL Server Access 中 SELECT ,可以 TOP 字 制


, 所

输入

SELECT TOP 5 prod_name


FROM Products;

输出

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 。

DB2, 可 面 DBMS SQL


输入

SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;

分析

FETCH FIRST 5 ROWS ONLY 字面 。

图灵社区会员 maik000 专享 尊重版权


| 17

Oracle, ROWNUM ,

输入

SELECT prod_name
FROM Products
WHERE ROWNUM <=5;

MySQL MariaDB PostgreSQL 或者 SQLite, LIMIT


输入

SELECT prod_name
FROM Products
LIMIT 5;

分析

SELECT 独 。LIMIT 5 MySQL


DBMS 不 5 。 出 面 。

得 面 5 , 以 ,

输入

SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;

分析

LIMIT 5 OFFSET 5 MySQL DBMS 5 5 。


字 , 字 。

图灵社区会员 maik000 专享 尊重版权


18 |

输出

prod_name
-------------------
Rabbit bean bag toy
Raggedy Ann
King doll
Queen doll

所以,LIMIT 。LIMIT OFFSET 。


中,Products 中 有9 ,所以 LIMIT 5 OFFSET
5 4 有 5 。

注意
的 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 。 不
文本, 有以 。

图灵社区会员 maik000 专享 尊重版权


| 19

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;

图灵社区会员 maik000 专享 尊重版权


20 |

分析

#, 。 本书 本
create.sql populate.sql 中可以 式 。

可以 , 可以 本 任何 。

输入

/* SELECT prod_name, vend_id


FROM Products; */
SELECT prod_name
FROM Products;

分析

/* , */ ,/* */ 任何内容 。 方式
, , SELECT
, 不 , 经 。

2.8
何 SQL SELECT
以 所有 。 何 不 , 何 。 不
, 复 SQL 得 SQL 得不 。 授 何
出 。

图灵社区会员 maik000 专享 尊重版权


| 21

授 何 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

图灵社区会员 maik000 专享 尊重版权


22 |

, 出 不 。 不 , 以
中出 , 有可 中 。 ,
或 , DBMS
方式 。 , 不 制 , 不
不 。 , 不
, 不 出 有任何 。

SQL , 的, 可 的。
上 提 的 。 的
的 SELECT 的 FROM 。

SELECT 出 ,可 ORDER BY 。
ORDER BY 或 字, 出 。 面

输入

SELECT prod_name
FROM Products
ORDER BY prod_name;

分析

DBMS prod_name 以字 ORDER BY


, 面 。 。

输出

prod_name
--------------------
12 inch teddy bear

图灵社区会员 maik000 专享 尊重版权


| 23

18 inch teddy bear


8 inch teddy bear
Bird bean bag toy
Fish bean bag toy
King doll
Queen doll
Rabbit bean bag toy
Raggedy Ann

注意 ORDER BY
定 ORDER BY , SELECT 中
。 的 , 出现 息。

提示
,ORDER BY 中 的 的 。 ,
上 定要 , 的 法的。

3.2
经 不 。 , ,可
, 中 。
有 , 有 。

,简 , 可

面 3 , 中
, 。

输入

SELECT prod_id, prod_price, prod_name


FROM Products

图灵社区会员 maik000 专享 尊重版权


24 |

ORDER BY prod_price, prod_name;

输出

prod_id prod_price prod_name


------- ---------- --------------------
BNBG02 3.4900 Bird bean bag toy
BNBG01 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy
RGAN01 4.9900 Raggedy Ann
BR01 5.9900 8 inch teddy bear
BR02 8.9900 12 inch teddy bear
RYL01 9.4900 King doll
RYL02 9.4900 Queen doll
BR03 11.9900 18 inch teddy bear

, 。
, 中 出, 有 prod_price
prod_name 。 prod_price 中所有
, 不 prod_name 。

3.3
出 ,ORDER BY
。 内容,

输入

SELECT prod_id, prod_price, prod_name


FROM Products
ORDER BY 2, 3;

输出

prod_id prod_price prod_name

图灵社区会员 maik000 专享 尊重版权


| 25

------- ---------- --------------------


BNBG02 3.4900 Bird bean bag toy
BNBG01 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy
RGAN01 4.9900 Raggedy Ann
BR01 5.9900 8 inch teddy bear
BR02 8.9900 12 inch teddy bear
RYL01 9.4900 King doll
RYL02 9.4900 Queen doll
BR03 11.9900 18 inch teddy bear

分析

可以 , 出 面 ,不 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 字。

图灵社区会员 maik000 专享 尊重版权


26 |

面 以 面

输入

SELECT prod_id, prod_price, prod_name


FROM Products
ORDER BY prod_price DESC;

输出

prod_id prod_price prod_name


------- ---------- --------------------
BR03 11.9900 18 inch teddy bear
RYL01 9.4900 King doll
RYL02 9.4900 Queen doll
BR02 8.9900 12 inch teddy bear
BR01 5.9900 8 inch teddy bear
RGAN01 4.9900 Raggedy Ann
BNBG01 3.4900 Fish bean bag toy
BNBG02 3.4900 Bird bean bag toy
BNBG03 3.4900 Rabbit bean bag toy

, 面 以
面 ,

输入

SELECT prod_id, prod_price, prod_name


FROM Products
ORDER BY prod_price DESC, prod_name;

输出

prod_id prod_price prod_name


------- ---------- --------------------
BR03 11.9900 18 inch teddy bear
RYL01 9.4900 King doll
RYL02 9.4900 Queen doll
BR02 8.9900 12 inch teddy bear

图灵社区会员 maik000 专享 尊重版权


| 27

BR01 5.9900 8 inch teddy bear


RGAN01 4.9900 Raggedy Ann
BNBG02 3.4900 Bird bean bag toy
BNBG01 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy

分析

DESC 字 面 。 中, prod_price
DESC, prod_name 不 。 ,prod_price 以
, prod_name 内 。

上 , 定 DESC 。

,DESC DESCENDING , 字 可以 。 DESC


ASC 或 ASCENDING , 可以 。 ,
ASC 有 , 不 ASC 不
DESC, ASC 。

提示 分
文 ,A a a B , Z
问题 论问题, 的 方 。

dictionary 中,A a ,
的 。 , DBMS
要 的 ,可能

的 问题 , 要 , 简单的 ORDER
BY 可能 。 的 。

图灵社区会员 maik000 专享 尊重版权


28 |

3.5
何 SELECT ORDER BY 出
。 必 SELECT 中 。 ,可
以 或 。

图灵社区会员 maik000 专享 尊重版权


| 29

授 何 SELECT WHERE 。

4.1 WHERE
, 中 所有 。
或 。 所
search criteria , filter condition 。

SELECT 中, WHERE 中 。
WHERE FROM 出, 所

输入

SELECT prod_name, prod_price


FROM Products
WHERE prod_price = 3.49;

分析

products 中 , 不 所有 ,
prod_price 3.49 , 所

输出

prod_name prod_price

图灵社区会员 maik000 专享 尊重版权


30 |

------------------- ----------
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 。

图灵社区会员 maik000 专享 尊重版权


| 31

4.2 WHERE
WHERE ,
。SQL 4-1 出 所有 。

4-1 WHERE
明 明
= >
<> 不 >=
!= 不 !> 不
< BETWEEN

<= IS NULL NULL


!< 不

注意
4-1 中 出的某 的 <> != ,!< >= 。
DBMS 。 定 的 DBMS
, 的文 。

4.2.1

经 , 。

出所有 10 。

输入

SELECT prod_name, prod_price


FROM Products
WHERE prod_price < 10;

图灵社区会员 maik000 专享 尊重版权


32 |

输出

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 ,所以

输入

SELECT prod_name, prod_price


FROM Products
WHERE prod_price <= 10;

4.2.2

出所有不 DLL01 制

输入

SELECT vend_id, prod_name


FROM Products
WHERE vend_id <> 'DLL01';

输出

vend_id prod_name
---------- ------------------
BRS01 8 inch teddy bear

图灵社区会员 maik000 专享 尊重版权


| 33

BRS01 12 inch teddy bear


BRS01 18 inch teddy bear
FNG01 King doll
FNG01 Queen doll

提示
上 WHERE 中的 , 的 单 ,
的 。单 定 。 的
比较,就 要 定 。 比较的 。

面 , 中 != 不 <>

输入

SELECT vend_id, prod_name


FROM Products
WHERE vend_id != 'DLL01';

注意 != <>
!= <> 可 。 , DBMS
。 ,Microsoft Access <> !=。 问,
的 DBMS 文 。

4.2.3
,可以 BETWEEN 。 WHERE
有不 , , 。
,BETWEEN 可 5 10 所有
,或 所有 。

面 何 BETWEEN , 5 10
所有 。

图灵社区会员 maik000 专享 尊重版权


34 |

输入

SELECT prod_name, prod_price


FROM Products
WHERE prod_price BETWEEN 5 AND 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

图灵社区会员 maik000 专享 尊重版权


| 35

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 的 出现 的
中。

图灵社区会员 maik000 专享 尊重版权


36 |

4.3
何 SELECT WHERE 。
何 不 以 NULL

图灵社区会员 maik000 专享 尊重版权


| 37

授 何 WHERE 以 。
何 NOT IN 。

5.1 WHERE
4 所有 WHERE 。
制,SQL 许 出 WHERE 。 有
方式, 以 AND 或 OR 方式 。

或 WHERE 中的 的 ,
logical operator 。

5.1.1 AND

不 ,可以 AND WHERE


。 面 出

输入

SELECT prod_id, prod_price, prod_name

图灵社区会员 maik000 专享 尊重版权


38 |

FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;

分析

SQL 由 DLL01 制 4 所有
。 SELECT 中 WHERE , AND
字 。AND DBMS 所有 。
由 DLL01 制 , 4 , 不 。
, 4 , 不 由 制 不
。 SQL 出

输出

prod_id prod_price prod_name


------- ---------- --------------------
BNBG02 3.4900 Bird bean bag toy
BNBG01 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy

AND
WHERE 中的 , 给定 的 。

AND , 有 。可以
, AND 字。

说明 ORDER BY
, 的 , ORDER
BY 。 , 的 出 可能 上的 出 。
的 的, 的 可能 。 , 可
上 ORDER BY , WHERE 。

图灵社区会员 maik000 专享 尊重版权


| 39

5.1.2 OR

OR AND , DBMS 任
。 ,许 DBMS OR WHERE 得
, 不 ,不
, 出 。

SELECT

输入

SELECT prod_name, prod_price


FROM Products
WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;

分析

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 中 的 , 任 给定 的 。

图灵社区会员 maik000 专享 尊重版权


40 |

5.1.3
WHERE 可以 任 AND OR 。 许 者 以
复 。

, AND OR 有 。 ,
。 出 10 以 , 由 DLL01 或 BRS01
制 所有 。 面 SELECT AND OR
WHERE

输入

SELECT prod_name, prod_price


FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;

输出

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 中 , 。

图灵社区会员 maik000 专享 尊重版权


| 41

方 。 面
SELECT 出

输入

SELECT prod_name, prod_price


FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;

输出

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
由 中 。 面 。

图灵社区会员 maik000 专享 尊重版权


42 |

输入

SELECT prod_name, prod_price


FROM Products
WHERE vend_id IN ( 'DLL01', 'BRS01' )
ORDER BY prod_name;

输出

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

分析

SELECT 由 DLL01 BRS01 制 所有 。IN


由 , 必 中。

可 IN OR , 面
SQL 面 。

输入

SELECT prod_name, prod_price


FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;

输出

prod_name prod_price
------------------- ----------

图灵社区会员 maik000 专享 尊重版权


| 43

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 。

有 ,IN , 。
AND OR IN , 容 。
IN OR 得 面
中, 不出 。
IN 可以 SELECT ,
WHERE 。 11 。

IN
WHERE 中 定要 的清单的 , 能 OR 。

5.3 NOT
WHERE 中 NOT 有 有 , 所
任何 。 NOT 不 独 ,所
以 有所不 。NOT 字可以 ,
不 。

NOT
WHERE 中 定 的 。

面 NOT 。 出 DLL01 所有 制
,可 。

图灵社区会员 maik000 专享 尊重版权


44 |

输入

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

分析

NOT , ,DBMS 不 vend_id


DLL01, DLL01 所有 。

面 可以 <> , 所 。

输入

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

图灵社区会员 maik000 专享 尊重版权


| 45

分析

NOT 简 WHERE , NOT


有 。 复 中, NOT 有 。 ,
IN ,NOT 可以 简 出 不

说明 NOT
MariaDB NOT 定 IN BETWEEN EXISTS 。
DBMS NOT 定任 。

5.4
授 何 AND OR WHERE , 授 何
, 何 IN NOT 。

图灵社区会员 maik000 专享 尊重版权


46 |

何 以 LIKE
,以 复 。

6.1 LIKE
面 所有 。不
, ,或者 ,
中 。

, 方 不 任何 。 , 中
文本 bean bag 所有 简 不 ,必
。 ,可以 式。
中, 出 bean bag 所有 ,可以
式, 出 任何 出 bean bag 。

的 的 。

或 的 。

图灵社区会员 maik000 专享 尊重版权


| 47

本 SQL WHERE 中有 字 ,SQL


。 中 ,必 LIKE 。LIKE
DBMS, 式 不 简

, 词 。 上 ,LIKE
词 。 的 的,
, 免 SQL 文 或 中 。

文本字 字 , 文本 字 不

6.1.1 %

% 。 中,% 任何字 出 任
。 , 出所有以 Fish ,可 以 SELECT

输入

SELECT prod_id, prod_name


FROM Products
WHERE prod_name LIKE 'Fish%';

输出

prod_id prod_name
------- ------------------
BNBG01 Fish bean bag toy

分析

式 'Fish%' 。 , 任 以

图灵社区会员 maik000 专享 尊重版权


48 |

Fish 。% DBMS Fish 任 字 ,不 有


字 。

说明
的 Microsoft Access, 要 * %。

说明 分
DBMS 的 , 可 的。
, 'fish%' Fish bean bag toy 就 。

可 式中 任 , 可以 。
面 , 式

输入

SELECT prod_id, prod_name


FROM Products
WHERE prod_name LIKE '%bean bag%';

输出

prod_id prod_name
-------- --------------------
BNBG01 Fish bean bag toy
BNBG02 Bird bean bag toy
BNBG03 Rabbit bean bag toy

分析

式'%bean bag%' 任何 文本 bean bag ,


不 或 出 字 。

可以出 式 中 , 不 有 。 面
出以 F 以y 所有

图灵社区会员 maik000 专享 尊重版权


| 49

输入

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 的 。

图灵社区会员 maik000 专享 尊重版权


50 |

6.1.2 _

有 _ 。 % ,
字 , 不 字 。

说明
DB2 _。

说明
的 Microsoft Access, 要 ? _。

输入

SELECT prod_id, prod_name


FROM Products
WHERE prod_name LIKE '__ inch teddy bear';

说明 注意
上 ,可能 要给 。

输出

prod_id prod_name
-------- --------------------
BR02 12 inch teddy bear
BR03 18 inch teddy bear

分析

WHERE 中 式 出 面 有文本 。
式 中 12, 中
18。8 inch teddy bear 有 , 式

图灵社区会员 maik000 专享 尊重版权


| 51

不 。 , 面 SELECT % ,

输入

SELECT prod_id, prod_name


FROM Products
WHERE prod_name LIKE '% inch teddy bear';

输出

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

图灵社区会员 maik000 专享 尊重版权


52 |

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 可以简

图灵社区会员 maik000 专享 尊重版权


| 53

输入

SELECT cust_contact
FROM Customers
WHERE NOT cust_contact LIKE '[JM]%'
ORDER BY cust_contact;

6.2
所 ,SQL 有 。 有 ,
面 。 出

不 。 ,

, 不 式
。 , 。
。 方,可 不 。

, 有 ,以 经

6.3
, 何 WHERE 中 SQL ,
,不 。

图灵社区会员 maik000 专享 尊重版权


54 |

字 , 何 字 ,以 何
中 。

7.1
中 不 所 式, 面

, ,
不 中。
邮 不 中 , 邮
有 式 字 出 。
, 所有 出 。
,不
以 可 。 , 。

中, 中 不 所 。
中 出 或 式 , 不
出 , 中 式 。

图灵社区会员 maik000 专享 尊重版权


7.2 拼接字段 | 55

这就是计算字段可以派上用场的地方了。与前几课介绍的列不同,计算
字段并不实际存在于数据库表中。计算字段是运行时在 SELECT 语句内
创建的。

字段(field)
基本上与列(column)的意思相同,经常互换使用,不过数据库列一
般称为列,而术语字段通常与计算字段一起使用。

需要特别注意,只有数据库知道 SELECT 语句中哪些列是实际的表列,


哪些列是计算字段。从客户端(如应用程序)来看,计算字段的数据与
其他列的数据的返回方式相同。

提示:客户端与服务器的格式

  在 SQL 语句内可完成的许多转换和格式化工作都可以直接在客户端
电 应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在
客户端中完成要快得多。

7.2
为了说明如何使用计算字段,我们来举一个简单例子,创建由两列组成
的标题。

Vendors 表包含供应商名和地址信息。假如要生成一个供应商报表,需
要在格式化的名称(位置)中列出供应商的位置。

此报表需要一个值,而表中数据存储在两个列 vend_name 和 vend_


country 中。此外,需要用括号将 vend_country 括起来,这些东西都
没有存储在数据库表中。这个返回供应商名称和地址的 SELECT 语句很
简单,但我们是如何创建这个组合值的呢?

图灵社区会员 maik000 专享 尊重版权


56 |

单 。

。 SQL 中 SELECT 中,可


。 所 DBMS, 可
+ 或 || 。 MySQL MariaDB 中,必

说明 + ||
Access SQL Server + 。DB2 Oracle PostgreSQL SQLite
Open Office Base ||。 的 DBMS 文 。

面 DBMS

输入

SELECT vend_name + ' (' + vend_country + ')'


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 )

面 , ||

输入

SELECT vend_name || ' (' || vend_country || ')'

图灵社区会员 maik000 专享 尊重版权


| 57

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 Concat(vend_name, ' (', vend_country, ')')


FROM Vendors
ORDER BY vend_name;

分析

面 SELECT 以

vend_name 中 字

vend_country 中 家
字 。

出中可以 ,SELECT
字 。

SELECT 出。 字
。许 不 所有 文本 ,
不 。 式 ,必

图灵社区会员 maik000 专享 尊重版权


58 |

。 可以 SQL RTRIM() , 所

输入

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'


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)

面 , ||

输入

SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'


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)

分析

RTRIM() 所有 。 RTRIM(),

图灵社区会员 maik000 专享 尊重版权


| 59

说明
DBMS RTRIM() , 的
LTRIM() 的 TRIM()
的 。

面 出可以 ,SELECT 可以 字 。 ,
字 有 字, 。
SQL 中 , 有 不 。 ,
未 不 中, 有 。

,SQL 。 alias 字 或
。 AS 字 。 面 SELECT

输入

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'


AS vend_title
FROM Vendors
ORDER BY vend_name;

输出

vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

面 , ||

图灵社区会员 maik000 专享 尊重版权


60 |

输入

SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'


AS vend_title
FROM Vendors
ORDER BY vend_name;

面 MySQL MariaDB 中

输入

SELECT Concat(vend_name, ' (', vend_country, ')')


AS vend_title
FROM Vendors
ORDER BY vend_name;

分析

SELECT 本 以 , 不 字 文
本 AS vend_title。 SQL
vend_title 字 。 出可以 , 以 ,
vend_title,任何 可以 ,

说明
DBMS 中,AS 可 的, ,

提示
。 的 的 法的
重新 , 的 或 。

图灵社区会员 maik000 专享 尊重版权


| 61

注意
的 可 单词, 可 。 ,
中。 法 法的, 建议 。
单词的 可 , 给 问题。 ,
的 单词的 重 单词的 。

说明 出
出 derived column , ,
的 的 。

7.3
字 出 。 ,
Orders 所有 ,OrderItems 中
。 面 SQL 20008 中 所有

输入

SELECT prod_id, quantity, item_price


FROM OrderItems
WHERE order_num = 20008;

输出

prod_id quantity item_price


---------- ----------- ---------------------
RGAN01 5 4.9900
BR03 5 11.9900
BNBG01 10 3.4900
BNBG02 10 3.4900
BNBG03 10 3.4900

item_price 中 。

图灵社区会员 maik000 专享 尊重版权


62 |

输入

SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;

输出

prod_id quantity item_price expanded_price


---------- ----------- ------------ -----------------
RGAN01 5 4.9900 24.9500
BR03 5 11.9900 59.9500
BNBG01 10 3.4900 34.9000
BNBG02 10 3.4900 34.9000
BNBG03 10 3.4900 34.9000

分析

出中 expanded_price 字 , quantity*
item_price。 可以 ,

SQL 7-1 中 出 本 。 , 可
。 , 5 。

7-1 SQL

+
-
*
/

图灵社区会员 maik000 专享 尊重版权


| 63

提示
SELECT 提 的方法。 SELECT
中 , FROM 就 简单 问
, SELECT 3 * 2; 6,SELECT Trim(' abc ');
abc,SELECT Now(); Now() 。
现 ,可 要 SELECT 。

7.4
字 以 何 字 。
字 字 中 。 , 何
,以 字 。

图灵社区会员 maik000 专享 尊重版权


64 |

,DBMS 何 ,以 何
SQL 可 。

8.1
,SQL 可以 。
, 方 。

中 字 RTRIM() 。

, SQL 所

所有 DBMS SQL SELECT 不 ,


DBMS 有 。 , 有 所有 DBMS
。 所有 可以 DBMS 中 ,
可 不 。 可 , 8-1
出 3 DBMS 中

图灵社区会员 maik000 专享 尊重版权


| 65

8-1 DBMS

字 Access MID() DB2 Oracle PostgreSQL SQLite


SUBSTR() MySQL SQL Server SUBSTRING()

Access Oracle , 有 DB2


PostgreSQL CAST() MariaDB MySQL SQL Server
CONVERT()
Access NOW() DB2 PostgreSQL CURRENT_DATE
MariaDB MySQL CURDATE() Oracle SYSDATE SQL
Server GETDATE() SQLite DATE()

可以 , SQL 不 ,SQL 不 可 。
SQL 中可 不 。

的 可 上 。

可 ,许 SQL 不 。
有 , 有 不 。 不
, 。必 方
DBMS 可以 有 。

提示
现 , 的 。 定 , 或
。 定 , ,
或 能 的 SQL 的 义。

8.2
SQL 以 。

图灵社区会员 maik000 专享 尊重版权


66 |

文本字 或 , 或 文
本 。



, 有 。
DBMS 。

SELECT 面 , 不
。 可以 SELECT , WHERE 中 ,
SQL 中 , 面 。

8.2.1

, 经 文本 , 中 RTRIM()
。 面 , UPPER()

输入

SELECT vend_name, UPPER(vend_name) AS vend_name_upcase


FROM Vendors
ORDER BY vend_name;

输出

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

图灵社区会员 maik000 专享 尊重版权


| 67

Furball Inc. FURBALL INC.


Jouets et ours JOUETS ET OURS

可以 ,UPPER() 文本 , 本 中
出 , Vendors 中 , vend_name_
upcase 。

8-2 出 文本 。

8-2


LEFT() 或 字 字 字
LENGTH() DATALENGTH()或LEN() 字
LOWER() Access LCASE() 字
LTRIM() 字
RIGHT() 或 字 字 字
RTRIM() 字
SOUNDEX() 字 SOUNDEX
UPPER() Access UCASE() 字

8-2 中 SOUNDEX 。SOUNDEX 任何文


本 字 字 式 。SOUNDEX
字 , 得 字 不 字
。 SOUNDEX 不 SQL , DBMS SOUNDEX

说明 SOUNDEX
Microsoft Access PostgreSQL SOUNDEX(), 下的
DBMS。

图灵社区会员 maik000 专享 尊重版权


68 |

, 建 SQLite SQLITE_SOUNDEX ,
SOUNDEX() SQLite 中就可 。 SQLITE_SOUNDEX
的 , SQLite 现 SOUNDEX()。

面 出 SOUNDEX() 。Customers 中有
Kids Place, Michelle Green。 ,
Michael Green, ,
不 , 所

输入

SELECT cust_name, cust_contact


FROM Customers
WHERE cust_contact = 'Michael Green';

输出

cust_name cust_contact
-------------------------- ----------------------------

SOUNDEX() , 所有
Michael Green

输入

SELECT cust_name, cust_contact


FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');

输出

cust_name cust_contact
-------------------------- ----------------------------
Kids Place Michelle Green

图灵社区会员 maik000 专享 尊重版权


| 69

分析

中,WHERE SOUNDEX() cust_contact


字 SOUNDEX 。 Michael Green
Michelle Green ,所以 SOUNDEX , WHERE
出 所 。

8.2.2
中, DBMS 有
式。 以 式 ,以 有 或
, 。

不 式,
。由 , SQL
中 有 。 , 不 ,可 。

简 , 。Orders 中
有 。 SQL Server 中 2012 所有 ,可

输入

SELECT order_num
FROM Orders
WHERE DATEPART(yy, order_date) = 2012;

输出

order_num
-----------
20005
20006

图灵社区会员 maik000 专享 尊重版权


70 |

20007
20008
20009

Access 中 版本

输入

SELECT order_num
FROM Orders
WHERE DATEPART('yyyy', order_date) = 2012;

分析

SQL Server Sybase 版本以 Access 版本 DATEPART()


, , 。DATEPART() 有
, 中 。 中,
DATEPART() order_date 中 。 2012 ,WHERE
出 。

面 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;

图灵社区会员 maik000 专享 尊重版权


| 71

分析

中,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(), 可以 。

MySQL MariaDB 有 , 有 DATEPART() 。


MySQL MariaDB 可 YEAR() 中

输入

SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2012;

SQLite 中有

输入

SELECT order_num

图灵社区会员 maik000 专享 尊重版权


72 |

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 所 , 文 。

图灵社区会员 maik000 专享 尊重版权


| 73

8.3
何 SQL 。 式
中 有 , SQL 中 不 SQL
Server Oracle 。

图灵社区会员 maik000 专享 尊重版权


74 |

SQL , 何 。

9.1
经 不 出 , SQL
。 ,SQL 可 ,以
。 有

中 或者 或
得 中
出 或所有 或 。

中 , 不 本 。 ,
不 。 ,

方 ,SQL 出 5 , 9-1。
。 不 ,SQL
SQL 中得 。

某 的 , 。

图灵社区会员 maik000 专享 尊重版权


| 75

9-1 SQL

AVG()

COUNT()

MAX()

MIN()

SUM()

面 。

9.1.1 AVG()
AVG() 中 , 得 。AVG()
可 所有 , 可以 或 。

面 AVG() Products 中所有

输入

SELECT AVG(prod_price) AS avg_price


FROM Products;

输出

avg_price
-------------
6.823333

分析

SELECT avg_price, Products 中所有


。 7 所 ,avg_price 。

AVG() 可以 或 。 面

图灵社区会员 maik000 专享 尊重版权


76 |

输入

SELECT AVG(prod_price) AS avg_price


FROM Products
WHERE vend_id = 'DLL01';

输出

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 。

图灵社区会员 maik000 专享 尊重版权


| 77

COUNT(column) 中 有 , NULL 。

面 Customers 中

输入

SELECT COUNT(*) AS num_cust


FROM Customers;

输出

num_cust
--------
5

分析

中, COUNT(*) 所有 ,不 中 有 。
num_cust 中 。

面 有电 邮

输入

SELECT COUNT(cust_email) AS num_cust


FROM Customers;

输出

num_cust
--------
3

分析

SELECT COUNT(cust_email) cust_email 中有


。 中,cust_email 3 5 中

图灵社区会员 maik000 专享 尊重版权


78 |

有3 有电 邮 。

说明 NULL
定 , COUNT() 定 的 的 ,
COUNT() 中 的 * , 。

9.1.3 MAX()
MAX() 中 。MAX() , 所

输入

SELECT MAX(prod_price) AS max_price


FROM Products;

输出

max_price
----------
11.9900

分析

,MAX() Products 中 。

提示 MAX()
MAX() 出 的 或 ,
DBMS 任 中的 , 文 中的
。 文 ,MAX() 的 。

说明 NULL
MAX() NULL 的 。

图灵社区会员 maik000 专享 尊重版权


| 79

9.1.4 MIN()
MIN() MAX() , 。 MAX()
,MIN() , 所

输入

SELECT MIN(prod_price) AS min_price


FROM Products;

输出

min_price
----------
3.4900

分析

中 MIN() Products 中 。

提示 MIN()
MIN() 出 的 或 ,
DBMS 任 中的 , 文 中的
。 文 ,MIN() 的 。

说明 NULL
MIN() NULL 的 。

9.1.5 SUM()
SUM() 。

面 ,OrderItems 中 , 有
。可 所 所有 quantity

图灵社区会员 maik000 专享 尊重版权


80 |

输入

SELECT SUM(quantity) AS items_ordered


FROM OrderItems
WHERE order_num = 20005;

输出

items_ordered
----------
200

分析

SUM(quantity) 中所有 ,WHERE


中 。

SUM() 可以 。 面 中,
item_price*quantity,得出

输入

SELECT SUM(item_price*quantity) AS total_price


FROM OrderItems
WHERE order_num = 20005;

输出

total_price
----------
1648.0000

分析

SUM(item_price*quantity) 中所有 ,
WHERE 中 。

图灵社区会员 maik000 专享 尊重版权


| 81

提示
, 的 , 可
上的 。

说明 NULL
SUM() NULL 的 。

9.2
以 5 可以 。

所有 , ALL 或不 ALL

不 , DISTINCT 。

提示 ALL
ALL 要 定, 。 定 DISTINCT,
定 ALL。

说明
Microsoft Access 中 DISTINCT, 下 的
Access。要 Access 的 , 要
DISTINCT SELECT COUNT(*) 。

面 AVG() 。
面 SELECT , DISTINCT ,

图灵社区会员 maik000 专享 尊重版权


82 |

输入

SELECT AVG(DISTINCT prod_price) AS avg_price


FROM Products
WHERE vend_id = 'DLL01';

输出

avg_price
-----------
4.2400

分析

可以 , DISTINCT , 中 avg_price ,
有 有 。 。

注意 DISTINCT COUNT(*)
定 , DISTINCT 能 COUNT()。DISTINCT 能
COUNT(*)。 ,DISTINCT , 能 或

提示 DISTINCT MIN() MAX()


DISTINCT 上可 MIN() MAX(), 上
。 中的 ,
的。

说明
的 DISTINCT ALL , 的 DBMS ,
的 的 TOP TOP PERCENT。
的 DBMS , 的文 。

图灵社区会员 maik000 专享 尊重版权


| 83

9.3
所有 。 ,SELECT
可 。 面

输入

SELECT COUNT(*) AS num_items,


MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM Products;

输出

num_items price_min price_max price_avg


---------- --------------- --------------- ---------
9 3.4900 11.9900 6.823333

分析

SELECT 4 , 4 Products
中 , 以 。

注意
定 某 的 , 中 的
。 法, SQL 现 ,可能
的 息。

9.4
。SQL 5 ,可以 方
, 所 。 ,
中 得 。

图灵社区会员 maik000 专享 尊重版权


84 |

10

何 ,以 内容 。
SELECT GROUP BY HAVING 。

10.1
得 , SQL 可以 。 ,
, ,不 所有 得

所有 所有 或 WHERE
。 面 DLL01

输入

SELECT COUNT(*) AS num_prods


FROM Products
WHERE vend_id = 'DLL01';

输出

num_prods
-----------
4

图灵社区会员 maik000 专享 尊重版权


| 85

, 或者
,或者 10 以 ,

。 可以 ,

10.2
SELECT GROUP BY 。

输入

SELECT vend_id, COUNT(*) AS num_prods


FROM Products
GROUP BY vend_id;

输出

vend_id num_prods
------- ---------
BRS01 3
DLL01 4
FNG01 2

分析

面 SELECT vend_id ID,


num_prods 字 COUNT(*) 。GROUP BY
DBMS vend_id 。 vend_id 不
num_prods 。 出中可以 , BRS01 有 3
, DLL01 有 4 , FNG01 有 2 。

图灵社区会员 maik000 专享 尊重版权


86 |

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,
的文 。

图灵社区会员 maik000 专享 尊重版权


| 87

注意
的 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。 的 法 的, 。

, 以

图灵社区会员 maik000 专享 尊重版权


88 |

输入

SELECT cust_id, COUNT(*) AS orders


FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;

输出

cust_id orders
---------- -----------
1000000001 2

分析

SELECT 面 。 HAVING
, COUNT(*) >= 2 以 。

可以 ,WHERE 不 , ,
不 。

说明 HAVING WHERE
方法,WHERE ,HAVING
。 重要的 ,WHERE 的
中。 可能 , HAVING 中
的 。

,有 有 中 WHERE HAVING
, 有。 面 , 12 内 有
以 。 ,可 WHERE , 出 12
内 , HAVING 出 有 以 。

, 面 , 出 有 以
4

图灵社区会员 maik000 专享 尊重版权


| 89

输入

SELECT vend_id, COUNT(*) AS num_prods


FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;

输出

vend_id num_prods
------- -----------
BRS01 3
FNG01 2

分析

中, 本 SELECT , 面
。WHERE 所有 prod_price 4 , vend_id
,HAVING 2或 2以 。 有 WHERE
, 出 DLL01, 4 , 4

输入

SELECT vend_id, COUNT(*) AS num_prods


FROM Products
GROUP BY vend_id
HAVING COUNT(*) >= 2;

输出

vend_id num_prods
------- -----------
BRS01 3
DLL01 4
FNG01 2

图灵社区会员 maik000 专享 尊重版权


90 |

说明 HAVING WHERE
HAVING WHERE , 定 GROUP BY, DBMS
。 , 要能 。 HAVING
GROUP BY , WHERE 的 。

10.4
GROUP BY ORDER BY 经 , 不 ,
。 10-1 。

10-1 ORDER BY GROUP BY


ORDER BY GROUP BY
出 , 出可 不
任 可以 可 或 式 , 必
可以 式
不 或 式 , 必

10-1 中 出 。 经 , GROUP BY
以 出 。 不 , 不 SQL
所 。 , DBMS 出 GROUP BY
, 可 以不 。 以 方式
得 , 不 以 方式 出。
ORDER BY , GROUP BY 。

提示 ORDER BY
GROUP BY , 给出 ORDER BY 。
的 方法。 要 GROUP BY 。

GROUP BY ORDER BY 方 , 。 面 SELECT


面 。 或

图灵社区会员 maik000 专享 尊重版权


| 91

输入

SELECT order_num, COUNT(*) AS items


FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3;

输出

order_num items
--------- -----
20006 3
20007 5
20008 5
20009 3

出, ORDER BY , 所

输入

SELECT order_num, COUNT(*) AS items


FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;

说明
Microsoft Access , Access 中 。
方法 的 或 items ORDER BY 中 ,
ORDER BY COUNT(*), order_num 或 ORDER BY 2, order_num。

输出

order_num items
--------- -----
20006 3

图灵社区会员 maik000 专享 尊重版权


92 |

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 。

图灵社区会员 maik000 专享 尊重版权


| 93

11

, 何 。

11.1
SELECT SQL 。 所 所有 SELECT
简 , 中 。

任 SQL 。 SELECT 。

SQL 许 subquery , 中 。
方 。

说明
MySQL, 的 4.1 的。
MySQL 的 。

11.2
本书所有 中 ,
A 。 中。 ID

图灵社区会员 maik000 专享 尊重版权


94 |

, Orders 中 。
OrderItems 中。Orders 不 , ID。
Customers 中。

, 出 RGAN01 所有 ,
面 出 体 。

(1) RGAN01 所有 。
(2) 有 出 所有 ID。
(3) 所有 ID 。

可以 独 。可以 SELECT
SELECT WHERE 。

可以 3 。

SELECT , prod_id RGAN01 所有


, order_num 。 出 出

输入

SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01';

输出

order_num
-----------
20007
20008

, , 20007
20008 ID。 5 IN , SELECT

图灵社区会员 maik000 专享 尊重版权


| 95

输入

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 。

图灵社区会员 maik000 专享 尊重版权


96 |

, 面

SELECT order_num FROM orderitems WHERE prod_id='RGAN01'

20007 20008。 , 以 IN
式 WHERE 。

SELECT cust_id FROM orders WHERE order_num IN (20007,20008)

可以 , 出 , 面 WHERE 所 。

提示
的 SELECT , 较 更
。 上 , 的 ,能
简 的 。

提, 就 的 方, 的 DBMS 出
SQL。

得 RGAN01 所有 ID。
ID 。 SQL

输入

SELECT cust_name, cust_contact


FROM Customers
WHERE cust_id IN ('1000000004','1000000005');

可以 中 WHERE , 不 ID

输入

SELECT cust_name, cust_contact

图灵社区会员 maik000 专享 尊重版权


| 97

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

分析

SELECT ,DBMS 必 SELECT 。


, 面 WHERE
。 面 ID , ID
WHERE 。 所 。

可 , WHERE 中 出 SQL
。 有 制,不 由
制,不 。

注意
的 SELECT 能 单 。

注意
给出的 , 的 。 ,
的 方法。更 的论 , 12
, 中 给出 。

图灵社区会员 maik000 专享 尊重版权


98 |

11.3
方 字 。 Customers 中
。 ID Orders 中。

, 面

(1) Customers 中
(2) 出 , Orders 中 。

所 ,可以 SELECT COUNT(*) 中 ,


WHERE ID,
。 , 面 1000000001

输入

SELECT COUNT(*) AS orders


FROM Orders
WHERE cust_id = '1000000001';

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;

输出

cust_name cust_state orders

图灵社区会员 maik000 专享 尊重版权


| 99

------------------------- ---------- ------


Fun4All IN 1
Fun4All AZ 1
Kids Place OH 0
The Toy Store IL 1
Village Toys MI 2

分析

SELECT Customers 中 cust_name


cust_state orders。orders 字 , 由 中
。 出 。 中,
5 , 出 5 。

中 WHERE 面 WHERE 有不 ,
, 不 cust_id 。
Orders.cust_id Customers.cust_id 。 面 WHERE SQL,
Orders 中 cust_id Customers 中 cust_id

WHERE Orders.cust_id = Customers.cust_id

, 有可 必 。
中,有 cust_id Customers 中,
Orders 中。 不 ,DBMS Orders 中
cust_id 。

SELECT COUNT(*) FROM Orders WHERE cust_id = cust_id

Orders 中 , 不

输入

SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders

图灵社区会员 maik000 专享 尊重版权


100 |

WHERE cust_id = cust_id) AS orders


FROM Customers
ORDER BY cust_name;

输出

cust_name cust_state orders


------------------------- ---------- ------
Fun4All IN 5
Fun4All AZ 5
Kids Place OH 5
The Toy Store IL 5
Village Toys MI 5

SELECT 有 , 必 制有 。

注意
要 定 , 定就
, DBMS 的 。 , 出现
的 义 , DBMS 出 信息。 ,WHERE 或 ORDER
BY 定的某 可能 出现 中。 的 法 ,
SELECT 中 ,就 定 避免 义。

提示
, 给出的 ,
的 方法。 JOIN ,

11.4
, 何 。 WHERE
IN 中,以 。 。

图灵社区会员 maik000 专享 尊重版权


| 101

12

, , 何
SELECT 。

12.1
SQL 中 join 。
SQL SELECT ,
SQL 。

有 ,必 以
。 面 不 所有内容,
经 。

12.1.1

, 。

有 , 中 。
, ,以 。

有 , 何

图灵社区会员 maik000 专享 尊重版权


102 |

方 由

, ,

, 或电 ,

有 复 ,
方式 。不 中 。

, 出 不 ,
。 , 。
所以 。

中可 ,
。Vendors 所有 , , 有
。 primary key ,可以 ID 或任何

Products , ID Vendors
, 不 有 。Vendors Vendors
Products , ID Vendors 中 出

不 复,不
,可以 Vendors 中 ,
中 不
由 不 复, , 得 简 。

图灵社区会员 maik000 专享 尊重版权


| 103

, 可以有 ,方 。 , 可

能 的 。 的 或
可 scale well 。

12.1.2

所 , 有 , 方 ,
可 。 有 。

中, SELECT 出

。简 , 制, SELECT
中 , 。 ,可以
出, 中 。

说明
重要的 ,要 。 , 的
中 。DBMS 要建 , 。

DBMS 提 , 定义 。
。 , 中 法
重要的。 的 , Products 中
的 ID, 的 可 问, 某
。 避免 ,可 Products 的
ID 中出现 法 出现 Vendors 中的 。
DBMS 。 提
的 DBMS 。

图灵社区会员 maik000 专享 尊重版权


104 |

12.2
简 , 所有 以 方式 可。

输入

SELECT vend_name, prod_name, prod_price


FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;

输出

vend_name prod_name prod_price


-------------------- -------------------- ----------
Doll House Inc. Fish bean bag toy 3.4900
Doll House Inc. Bird bean bag toy 3.4900
Doll House Inc. Rabbit bean bag toy 3.4900
Bears R Us 8 inch teddy bear 5.9900
Bears R Us 12 inch teddy bear 8.9900
Bears R Us 18 inch teddy bear 11.9900
Doll House Inc. Raggedy Ann 4.9900
Fun and Games King doll 9.4900
Fun and Games Queen doll 9.4900

分析

。SELECT 面所有 。
所 prod_name prod_price
中, vend_name 中。

FROM 。 以 SELECT 不 , FROM


出 Vendors Products。 SELECT
字。 WHERE ,WHERE
DBMS Vendors 中 vend_id Products 中 vend_id

图灵社区会员 maik000 专享 尊重版权


| 105

可以 , Vendors.vend_id Products.vend_id。
, 出 vend_id,DBMS 不
中有 。 面 出可以 , SELECT
不 中 。

就 提 的, 的 可能出现 义 , 定
。 的
义的 , DBMS 。

12.2.1 WHERE
WHERE 有 , 有
由 。 , SELECT 中 ,
中 。 中 有 DBMS 何
内容。 必 。 ,
中 中 。WHERE
, 。 有 WHERE
, 中 中 , 不

的 的 。 出的 的
中的 中的 。

, 面 SELECT 出

图灵社区会员 maik000 专享 尊重版权


106 |

输入

SELECT vend_name, prod_name, prod_price


FROM Vendors, Products;

输出

vend_name prod_name prod_price


---------------- ---------------------------- ----------
Bears R Us 8 inch teddy bear 5.99
Bears R Us 12 inch teddy bear 8.99
Bears R Us 18 inch teddy bear 11.99
Bears R Us Fish bean bag toy 3.49
Bears R Us Bird bean bag toy 3.49
Bears R Us Rabbit bean bag toy 3.49
Bears R Us Raggedy Ann 4.99
Bears R Us King doll 9.49
Bears R Us Queen doll 9.49
Bear Emporium 8 inch teddy bear 5.99
Bear Emporium 12 inch teddy bear 8.99
Bear Emporium 18 inch teddy bear 11.99
Bear Emporium Fish bean bag toy 3.49
Bear Emporium Bird bean bag toy 3.49
Bear Emporium Rabbit bean bag toy 3.49
Bear Emporium Raggedy Ann 4.99
Bear Emporium King doll 9.49
Bear Emporium Queen doll 9.49
Doll House Inc. 8 inch teddy bear 5.99
Doll House Inc. 12 inch teddy bear 8.99
Doll House Inc. 18 inch teddy bear 11.99
Doll House Inc. Fish bean bag toy 3.49
Doll House Inc. Bird bean bag toy 3.49
Doll House Inc. Rabbit bean bag toy 3.49
Doll House Inc. Raggedy Ann 4.99
Doll House Inc. King doll 9.49
Doll House Inc. Queen doll 9.49
Furball Inc. 8 inch teddy bear 5.99
Furball Inc. 12 inch teddy bear 8.99
Furball Inc. 18 inch teddy bear 11.99
Furball Inc. Fish bean bag toy 3.49
Furball Inc. Bird bean bag toy 3.49

图灵社区会员 maik000 专享 尊重版权


| 107

Furball Inc. Rabbit bean bag toy 3.49


Furball Inc. Raggedy Ann 4.99
Furball Inc. King doll 9.49
Furball Inc. Queen doll 9.49
Fun and Games 8 inch teddy bear 5.99
Fun and Games 12 inch teddy bear 8.99
Fun and Games 18 inch teddy bear 11.99
Fun and Games Fish bean bag toy 3.49
Fun and Games Bird bean bag toy 3.49
Fun and Games Rabbit bean bag toy 3.49
Fun and Games Raggedy Ann 4.99
Fun and Games King doll 9.49
Fun and Games Queen doll 9.49
Jouets et ours 8 inch teddy bear 5.99
Jouets et ours 12 inch teddy bear 8.99
Jouets et ours 18 inch teddy bear 11.99
Jouets et ours Fish bean bag toy 3.49
Jouets et ours Bird bean bag toy 3.49
Jouets et ours Rabbit bean bag toy 3.49
Jouets et ours Raggedy Ann 4.99
Jouets et ours King doll 9.49
Jouets et ours Queen doll 9.49

分析

面 出可以 , 不 。
, 不
本 有 。

注意 WHERE
要 WHERE , DBMS 比 要的
的 。 ,要 WHERE 的 。 的
DBMS 的 。

提示
, 的 , cross join 。

图灵社区会员 maik000 专享 尊重版权


108 |

12.2.2
equijoin ,
。 内 inner join 。 ,可以
不 , 。 面 SELECT

输入

SELECT vend_name, prod_name, prod_price


FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

分析

中 SELECT 面 SELECT , FROM 不 。


, 以 INNER JOIN FROM 。
, ON 不 WHERE 出。
ON WHERE 。

, 体 DBMS 文 。

说明 语
ANSI SQL INNER JOIN 法, 的 简单的
法。 ,SQL 论 的 简单 法的。 就
,DBMS 的 简单 , 建议 要
, 就 更 。

12.2.3
SQL 不 制 SELECT 中可以 。 本
。 出所有 , 。

图灵社区会员 maik000 专享 尊重版权


| 109

输入

SELECT prod_name, vend_name, prod_price, quantity


FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;

输出

prod_name vend_name prod_price quantity


--------------- ------------- ---------- --------
18 inch teddy bear Bears R Us 11.9900 50
Fish bean bag toy Doll House Inc. 3.4900 100
Bird bean bag toy Doll House Inc. 3.4900 100
Rabbit bean bag toy Doll House Inc. 3.4900 100
Raggedy Ann Doll House Inc. 4.9900 50

分析

20007 中 。 OrderItems 中。
ID , Products 中 。
ID Vendors 中 , ID
中。 FROM 出 ,WHERE
, 出 20007 中 。

注意
DBMS 定的 , 。 可能
, , 要 要的 。 的 ,
能下 。

注意
SQL 中 的 , 上 DBMS
。 的 DBMS 文 。

图灵社区会员 maik000 专享 尊重版权


110 |

11 中 , SELECT
RGAN01

输入

SELECT cust_name, cust_contact


FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));

11 所 , 不 复 SELECT 有 方 ,

输入

SELECT cust_name, cust_contact


FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';

输出

cust_name cust_contact
----------------------------- --------------------
Fun4All Denise L. Stephens
The Toy Store Kim Howard

分析

11 所 , 中 3 。 ,
有 中 , 。 有
WHERE 。 中 , RGAN01

图灵社区会员 maik000 专享 尊重版权


| 111

提示
可 , 任 给定的 SQL 方法。
或 的方法。 能可能 的 DBMS
中 或 的 。 , 要
的 , 出 的方法。

12.3
SQL 中 ,有
有 本 。本 ,
本 , 内 。
何 。

图灵社区会员 maik000 专享 尊重版权


112 |

13

本 方 , 何
, 何 。

13.1
7 何 。

输入

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'


AS vend_title
FROM Vendors
ORDER BY vend_name;

SQL 可以 字 , 许 。
有 由

SQL
许 SELECT 中 。

面 SELECT 。 中所 本 ,

图灵社区会员 maik000 专享 尊重版权


| 113

输入

SELECT cust_name, cust_contact


FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';

分析

可以 ,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 中不

图灵社区会员 maik000 专享 尊重版权


114 |

。 面 。

Jim Jones 所有 。
出 Jim Jones , 出 。 面

输入

SELECT cust_id, cust_name, cust_contact


FROM Customers
WHERE cust_name = (SELECT cust_name
FROM Customers
WHERE cust_contact = 'Jim Jones');

输出

cust_id cust_name cust_contact


-------- -------------- --------------
1000000003 Fun4All Jim Jones
1000000004 Fun4All Denise L. Stephens

分析

方 , 。内 SELECT 简
, Jim Jones cust_name。 字
WHERE 中,以 出 所有 11 中 授
, 。

输入

SELECT c1.cust_id, c1.cust_name, c1.cust_contact


FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';

图灵社区会员 maik000 专享 尊重版权


| 115

输出

cust_id cust_name cust_contact


------- ----------- --------------
1000000003 Fun4All Jim Jones
1000000004 Fun4All Denise L. Stephens

提示 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

何 , 有 不 出 中

图灵社区会员 maik000 专享 尊重版权


116 |

。 中 内 所有 ,
出 。 出 , 。

, 不 ,由 。

SELECT * , 。 面

输入

SELECT C.*, O.order_num, O.order_date,


OI.prod_id, OI.quantity, OI.item_price
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';

提示 AS
Oracle AS。

分析

中, 。所有 出,所以
有 复 出 。

, 内 , 可
不 不 内 。

13.2.3

许 中 中 , 有
有 。 ,可 以

图灵社区会员 maik000 专享 尊重版权


| 117

, 未
出所有 以 , 有人
, 未 。

中, 中 有 。

注意 语
要 , 建 的 法 的 SQL 现中可能
。下 中 的 法 现,
的 DBMS 文 , 定 法。

面 SELECT 出 简 内 。 所有

输入

SELECT Customers.cust_id, Orders.order_num


FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id;

。 有 内 所有 ,可

输入

SELECT Customers.cust_id, Orders.order_num


FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;

输出

cust_id order_num
---------- ---------
1000000001 20005
1000000001 20009

图灵社区会员 maik000 专享 尊重版权


118 |

1000000002 NULL
1000000003 20006
1000000004 20007
1000000005 20008

分析

内 , SELECT 字 OUTER JOIN


不 WHERE 中 。 , 内
中 不 , 有 。 OUTER
JOIN ,必 RIGHT 或 LEFT 字 所有
RIGHT 出 OUTER JOIN , LEFT 出 OUTER JOIN
。 面 LEFT OUTER JOIN FROM
Customers 中 所有 。 中 所有 ,
RIGHT OUTER JOIN, 所

输入

SELECT Customers.cust_id, Orders.order_num


FROM Customers RIGHT OUTER JOIN Orders
ON Orders.cust_id = Customers.cust_id;

注意
SQLite LEFT OUTER JOIN, RIGHT OUTER JOIN。 ,
要 SQLite 中 RIGHT OUTER JOIN, 更简单
的 法, 下 的提 中 。

提示
要 , 的 。
的 的 的 。 , FROM 或 WHERE
中 的 , 可 。 ,
可 , 方 就 。

图灵社区会员 maik000 专享 尊重版权


| 119

, full outer join , 中


所有 可以 。 或
不 不 , 不 。

输入

SELECT Customers.cust_id, Orders.order_num


FROM Orders FULL OUTER JOIN Customers
ON Orders.cust_id = Customers.cust_id;

注意 FULL OUTER JOIN


Access MariaDB MySQL Open Office Base SQLite FULL
OUTER JOIN 法。

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;

图灵社区会员 maik000 专享 尊重版权


120 |

输出

cust_id num_ord
---------- --------
1000000001 2
1000000003 1
1000000004 1
1000000005 1

分析

SELECT INNER JOIN Customers Orders 。


GROUP BY , , COUNT(Orders.order_num)
, num_ord 。

可以方 。 面

输入

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

图灵社区会员 maik000 专享 尊重版权


| 121

分析

所有 , 有任何
。 中 1000000002, 有0 。

13.4
,有必 。

所 。 内 , 有 。
, 体 文 , DBMS 何
DBMS 中 。
不 , 不

, 得出 。
中可以 , 可以 不
。 , 有 ,
。 简 。

13.5
本 , 授 何以 ,
不 以 所 。 何
,以 。

图灵社区会员 maik000 专享 尊重版权


122 |

14

本 何 UNION SELECT

14.1
SQL 或 中 SELECT 。
,SQL 许 SELECT ,
。 union 或复
compound query 。

中 不
, 。

提示 WHERE
下, 的 的 WHERE
的 的 。 ,任
WHERE 的 SELECT 可 , 下 可

图灵社区会员 maik000 专享 尊重版权


| 123

14.2
可 UNION SQL 。 UNION,可 出
SELECT , 。

14.2.1 UNION

UNION 简 ,所 出 SELECT ,
字 UNION。

, Illinois Indiana Michigan 所有


, 不 所有 Fun4All。 可以
WHERE ,不 UNION。

所 , UNION SELECT 。

输入

SELECT cust_name, cust_contact, cust_email


FROM Customers
WHERE cust_state IN ('IL','IN','MI');

输出

cust_name cust_contact cust_email


----------- ------------- ------------
Village Toys John Smith sales@villagetoys.com
Fun4All Jim Jones jjones@fun4all.com
The Toy Store Kim Howard NULL

输入

SELECT cust_name, cust_contact, cust_email


FROM Customers
WHERE cust_name = 'Fun4All';

图灵社区会员 maik000 专享 尊重版权


124 |

输出

cust_name cust_contact cust_email


----------- ------------- ------------
Fun4All Jim Jones jjones@fun4all.com
Fun4All Denise L. Stephens dstephens@fun4all.com

分析

SELECT Illinois Indiana Michigan IN ,


出 所有 。 SELECT 简 出所有
Fun4All。

,可以

输入

SELECT cust_name, cust_contact, cust_email


FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';

输出

cust_name cust_contact cust_email


----------- ----------- ----------------
Fun4All Denise L. Stephens dstephens@fun4all.com
Fun4All Jim Jones jjones@fun4all.com
Village Toys John Smith sales@villagetoys.com
The Toy Store Kim Howard NULL

分析

由 面 SELECT , UNION 字 。
UNION DBMS SELECT , 出

图灵社区会员 maik000 专享 尊重版权


| 125

, 出 WHERE 不 UNION

输入

SELECT cust_name, cust_contact, cust_email


FROM Customers
WHERE cust_state IN ('IL','IN','MI')
OR cust_name = 'Fun4All';

简 中, UNION 可 WHERE 复 。
复 ,或者 不 中
, UNION 可 简 。

提示 UNION
UNION SELECT 的 ,SQL 。 ,
下 的 DBMS 文 , UNION 能 的

注意
的 DBMS , SELECT
。 论上 , 能上 WHERE
UNION 的 。 的 论上, 中
能 , 下 方法,
更 。

14.2.2 UNION

可以 ,UNION 容 , 。

图灵社区会员 maik000 专享 尊重版权


126 |

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。

图灵社区会员 maik000 专享 尊重版权


| 127

输入

SELECT cust_name, cust_contact, cust_email


FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION ALL
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';

输出

cust_name cust_contact cust_email


----------- ------------- ------------
Village Toys John Smith sales@villagetoys.com
Fun4All Jim Jones jjones@fun4all.com
The Toy Store Kim Howard NULL
Fun4All Jim Jones jjones@fun4all.com
Fun4All Denise L. Stephens dstephens@fun4all.com

分析

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 。
,不 方式 , 方式

图灵社区会员 maik000 专享 尊重版权


128 |

, 不 许 ORDER BY 。

面 面 UNION

输入

SELECT cust_name, cust_contact, cust_email


FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All'
ORDER BY cust_name, cust_contact;

输出

cust_name cust_contact cust_email


----------- ------------- -------------
Fun4All Denise L. Stephens dstephens@fun4all.com
Fun4All Jim Jones jjones@fun4all.com
The Toy Store Kim Howard NULL
Village Toys John Smith sales@villagetoys.com

分析

UNION SELECT ORDER BY 。 ORDER


BY SELECT , DBMS
所有 SELECT 所有 。

说明 UNION
某 DBMS UNION EXCEPT MINUS 可
中 中 的
INTERSECT 可 中 的 。 上, UNION
, 的 可 。

图灵社区会员 maik000 专享 尊重版权


| 129

提示
简单, 中的 UNION 的
。 上,UNION 要 的 ,
的 , 下,可 UNION ,

14.3
授 何 UNION SELECT 。 UNION,可
以 ,不 中有 复。
UNION 可 简 复 WHERE ,简 中

图灵社区会员 maik000 专享 尊重版权


130 |

15

何 SQL INSERT 中。

15.1
,SELECT SQL , 14
。 , 有 3 SQL 。 INSERT

,INSERT 或 。 有
方式

面 内容。

提示 入
INSERT 可能 要 / 务 DBMS 中的 定 。
INSERT , 的 。

图灵社区会员 maik000 专享 尊重版权


| 131

15.1.1

中 简 方 本 INSERT ,
中 。 面

输入

INSERT INTO Customers


VALUES('1000000006',
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA',
NULL,
NULL);

分析

Customers 中。 中
VALUES 中 出,必 。 有 ,
面 cust_contact cust_email , NULL
许 。 必 以 中出 。

提示 INTO
某 SQL 现中, INSERT 的 INTO 可 的。
, 定 要, 提 , SQL
DBMS 可 。

简 , 不 , 。 面 SQL
中 , 容 得 。
可以得 , 不

图灵社区会员 maik000 专享 尊重版权


132 |

。 , SQL 不
, 出 。

INSERT 不 方

输入

INSERT INTO Customers(cust_id,


cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES('1000000006',
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA',
NULL,
NULL);

分析

INSERT ,
出 。 ,DBMS VALUES 中
中 。VALUES 中 ,
, 。

,VALUES 必 以 ,不
出 中 。 , ,
INSERT 。

图灵社区会员 maik000 专享 尊重版权


| 133

面 INSERT 所有 面 , 以 不
。 出 ,所以

输入

INSERT INTO Customers(cust_id,


cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip)
VALUES('1000000006',
NULL,
NULL,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111');

提示
要 给出 的 INSERT 。给出 能 SQL
, 。

注意 VALUES
INSERT 法,VALUES 的 。 提
, 给 提 提 , 给 出的
。 ,就 息, 的 能 。

15.1.2

所 , INSERT 方 出 。

图灵社区会员 maik000 专享 尊重版权


134 |

, 可以 , 可以 , 不

输入

INSERT INTO Customers(cust_id,


cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES('1000000006',
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA');

分析

本 面 中, 有 cust_contact cust_email
。 必 INSERT 中 。 , INSERT

注意
的定义 , 可 INSERT 中 某 。 的
下某 。

定义 NULL 或 。
定义中给出 。 给出 , 。

图灵社区会员 maik000 专享 尊重版权


| 135

注意
中 NULL 或 , 中的 ,
DBMS 就 息, 的 能 。

15.1.3

INSERT 有 。INSERT
式,可以 SELECT 中, 所
INSERT SELECT。 , 由 INSERT SELECT

中 Customers 中。不
INSERT ,可以

输入

INSERT INTO Customers(cust_id,


cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM CustNew;

图灵社区会员 maik000 专享 尊重版权


136 |

说明 新 说明
CustNew 的 中 出 Customers
。 , 建 CustNew 。CustNew
的 A中 的 Customers 。 CustNew ,
Customers 中 的 cust_id 重
, 的 INSERT 。

分析

INSERT SELECT CustNew 中 所有


Customers。SELECT CustNew 出 , 不 出
。SELECT 中 出 Customers 所 。
CustNew 有 。
, 有 不 , 。
有 , 所有 Customers。

提示 INSERT SELECT
简单 , INSERT SELECT 中 的 。
, 定要 。事 上,DBMS SELECT
的 。 的 的 , SELECT 中的
中 定的 , 中
定的 , 。

INSERT SELECT 中 SELECT 可以 WHERE ,以 。

提示 入
INSERT 。要 , INSERT 。
INSERT SELECT , 可 INSERT , SELECT
, INSERT 。

图灵社区会员 maik000 专享 尊重版权


| 137

15.2
有 不 INSERT 。 内容复制
中 ,可以 SELECT INTO 。

说明
DB2 的 SELECT INTO。

INSERT SELECT 经 不 ,SELECT INTO


复制 有 DBMS 可以 经 ,
所 体 DBMS 。

说明 INSERT SELECT SELECT INTO


的 重要 出 , 。

面 何 SELECT INTO

输入

SELECT *
INTO CustCopy
FROM Customers;

分析

SELECT CustCopy , Customers


内容复制 中。 SELECT * ,所以
CustCopy 中 Customers 。
复制 ,可以 出 , 不 * 。

MariaDB MySQL Oracle PostgreSQL SQLite 有不

图灵社区会员 maik000 专享 尊重版权


138 |

输入

CREATE TABLE CustCopy AS


SELECT * FROM Customers;

SELECT INTO ,

任何 SELECT 可以 , WHERE GROUP BY



不 中 , 中。

提示
SELECT INTO 新 SQL 的 。
,可 的 上 SQL , 的 。

说明
INSERT 法的更 , A 中给出的

15.3
何 中。 INSERT
方 , , 何 INSERT SELECT 中
, 何 SELECT INTO 出 。 何
UPDATE DELETE 。

图灵社区会员 maik000 专享 尊重版权


| 139

16

何 UPDATE DELETE 。

16.1
中 ,可以 UPDATE 。有 UPDATE
方式


中 所有 。

面 。

注意 WHERE
UPDATE 定要 。 ,就 更新 中的
。 , 。

提示 UPDATE
/ 务 的 DBMS 中, UPDATE 可能 要 的
。 UPDATE , 的 。

UPDATE 容 , 可以 容 。 本 UPDATE
由 ,

图灵社区会员 maik000 专享 尊重版权


140 |

简 。 1000000005 有 电 邮 ,

输入

UPDATE Customers
SET cust_email = 'kim@thetoystore.com'
WHERE cust_id = '1000000005';

UPDATE 以 。 中,
Customers。SET 。 ,SET
cust_email

SET cust_email = 'kim@thetoystore.com'

UPDATE 以 WHERE , DBMS 。 有 WHERE


,DBMS 电 邮 Customers 中 所有 ,
不 。

有不

输入

UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';

, SET , =

图灵社区会员 maik000 专享 尊重版权


| 141

不 。 中, 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
方式

图灵社区会员 maik000 专享 尊重版权


142 |

中 所有 。

面 。

注意 WHERE
DELETE 定要 。 ,就 中
。 , 。

提示 DELETE
/ 务 的 DBMS 中, DELETE 可能 要 的
。 DELETE , 的 。

面 ,UPDATE 容 , DELETE 容 。

面 Customers 中

输入

DELETE FROM Customers


WHERE cust_id = '1000000006';

容 。DELETE FROM 中 ,
WHERE 。 中, 1000000006。
WHERE , 中 。

提示
12 ,简单 要 中的 。
可 DBMS 定义 A
中 。 ,DBMS 。 要
Products 中 新 ,DBMS 的 id

图灵社区会员 maik000 专享 尊重版权


| 143

, 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 , 中

图灵社区会员 maik000 专享 尊重版权


144 |

。 , DELETE 不 WHERE
, 所有 。

面 许 SQL UPDATE 或 DELETE 所 。

, 不 不 WHERE
UPDATE 或 DELETE 。
有 内容, 12 , 可
WHERE 可以 或 。
UPDATE 或 DELETE WHERE , SELECT
, ,以 WHERE 不 。
制 内容, 12 ,
DBMS 不 许 。
有 DBMS 许 , 不 WHERE
UPDATE 或 DELETE 。 所 DBMS ,

SQL 有 undo , UPDATE DELETE,


或 。

16.4
何 UPDATE DELETE 中 。
, 可 , WHERE
UPDATE DELETE ,

图灵社区会员 maik000 专享 尊重版权


| 145

17

授 本 。

17.1
SQL 不 , 所有 ,
本 。

有 方

DBMS 有 式
可以 SQL 。

,可以 SQL CREATE TABLE 。 ,


式 SQL 。 不 ,
面 SQL 有 。

注意 语
的 SQL 现中,CREATE TABLE 的 法可能 。
的 DBMS 法, 的文 。

不 可以 所有 , 出 本 ,
出 本 。 , 体 DBMS 文 。

图灵社区会员 maik000 专享 尊重版权


146 |

说明
DBMS 的 CREATE TABLE 的 , A 中给出
的 建 。

17.1.1

CREATE TABLE ,必 出

字, 字 CREATE TABLE 出
字 ,
有 DBMS 。

面 SQL 本书中所 Products

输入

CREATE TABLE Products


(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);

分析

面 可以 , CREATE TABLE 字。
所有 中, 。 由5
。 以 中必 ,
, 1 。 , D 出
容 。 以 。

图灵社区会员 maik000 专享 尊重版权


| 147

面 ,不 DBMS CREATE TABLE 有所不 , 简


本 。 Oracle PostgreSQL SQL Server SQLite
中有 , MySQL,varchar 必 text DB2,必
中 NULL。 不 DBMS, 不
本 A 。

提示 语
下 SQL 中 的 。 可 上 ,
可 , 。 , 就可 的方
的 。 的 CREATE TABLE 就 SQL
的 , 上, 定义 的 ,更
。 SQL 定,
某 。

提示
建新的 , 定的 , 出 。
的 ,SQL 要 的 ,
重建 , 简单 建 。

17.1.2 NULL

4 ,NULL 有 或 。 许 NULL 许
不 出 。不 许 NULL 不 有 ,
, 或 , 必 有 。

NULL , NOT NULL , 由


。 面

图灵社区会员 maik000 专享 尊重版权


148 |

输入

CREATE TABLE Orders


(
order_num INTEGER NOT NULL,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL
);

分析

本书中所 Orders 。Orders


ID。 , 有 字 NOT
NULL。 有 。 有 , ,

NULL NOT NULL

输入

CREATE TABLE Vendors


(
vend_id CHAR(10) NOT NULL,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50) ,
vend_city CHAR(50) ,
vend_state CHAR(5) ,
vend_zip CHAR(10) ,
vend_country CHAR(50)
);

分析

本书中 Vendors 。 ID 字 必
, NOT NULL。 许 NULL ,所以不 NOT
NULL。NULL , 不 NOT NULL, NULL。

图灵社区会员 maik000 专享 尊重版权


| 149

注意 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 。

输入

CREATE TABLE OrderItems


(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL
);

图灵社区会员 maik000 专享 尊重版权


150 |

分析

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

图灵社区会员 maik000 专享 尊重版权


| 151

ALTER TABLE, 所 许 内容 。以 ALTER


TABLE 。

,不 中 。
中 未 可 ,

所有 DBMS 许 有 ,不 所
以 NULL DEFAULT 有所 制。
许 DBMS 不 许 或 中 。
DBMS 许 中 。
许 DBMS 制 经 有 , 未 有
有 制。

可以 出, 有 复 不 。 何
, 体 DBMS 文 。

ALTER TABLE ,必 出 面

ALTER TABLE 出 必 ,

出 。

有 可 所有 DBMS ,所以

输入

ALTER TABLE Vendors


ADD vend_phone CHAR(20);

图灵社区会员 maik000 专享 尊重版权


152 |

分析

Vendors vend_phone ,
CHAR。

或 或 , ,
面 所有 DBMS 有

输入

ALTER TABLE Vendors


DROP COLUMN vend_phone;

复 , 以

(1)
(2) INSERT SELECT , 15
复制 。有必 ,可以

(3) 所
(4) ,可以
(5) 字
(6) , 。

说明 ALTER TABLE
SQLite ALTER TABLE 的 。 重要的
, ALTER TABLE 定义 ,
建 定。

图灵社区会员 maik000 专享 尊重版权


| 153

注意 ALTER TABLE
ALTER TABLE 要 , 的
的 。 的更 能 , 要的
, 法 。 , 的 ,可能
中的 。

17.3
不 内容 简 , DROP TABLE

输入

DROP TABLE CustCopy;

分析

CustCopy 15 中 。 有 ,
不 , 。

提示 意
DBMS , 的 。
, 某 DROP TABLE ,
某 的 , DBMS ,
。 , , 能 的 。

17.4
DBMS 有所不 。 ,不

图灵社区会员 maik000 专享 尊重版权


154 |

。DB2 MariaDB MySQL Oracle PostgreSQL RENAME


,SQL Server sp_rename ,SQLite ALTER
TABLE 。

所有 本 。不 ,
DBMS 。 体 , DBMS 文 。

17.5
SQL 。CREATE TABLE ,ALTER
TABLE 或 或 , DROP TABLE
。 必 ,
。由 不 DBMS 中有所不 ,所以
DBMS 文 。

图灵社区会员 maik000 专享 尊重版权


| 155

18

, ,何
何 简 中 SQL 。

18.1
。 不 ,

说明
Microsoft Access , SQL 的 方 。 ,
的 Microsoft Access。

MySQL 5 , , 的 较
的 MySQL。

SQLite , 可 建,可 , 能
更 。

方 。 12 面 SELECT

图灵社区会员 maik000 专享 尊重版权


156 |

输入

SELECT cust_name, cust_contact


FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';

。任何 人 必
, 何 。
或 ,必 WHERE 。

, 可以 ProductCustomers
, 可以 出

输入

SELECT cust_name, cust_contact


FROM ProductCustomers
WHERE prod_id = 'RGAN01';

。ProductCustomers , , 不
任何 或 , 面 以 。

提示
, DBMS 建 法。

18.1.1

经 。 面 。

SQL 。

图灵社区会员 maik000 专享 尊重版权


| 157

简 复 SQL 。 ,可以方 不必
本 。
不 。
。可以授 权 , 不
权 。
式 。 可 式不 。

,可以 本 方式 。可以
SELECT , , 或 ,
制, 内容 。

, 。
本 不 , 中 出 。
或 中 , 。

注意
, ,
要的 。 建 的 或
, 能可能 下 。 ,
的 , 。

18.1.2

, 制。不 , 制 不 DBMS
不 , 体 DBMS 文 。

面 制。

, 必 不 或
字 。

图灵社区会员 maik000 专享 尊重版权


158 |

可以 有 制。
,必 有 权 。 权 由 人
授 。
可以 , 可以 中
。所 许 不 DBMS 中有所不 可
, 中 ,
面 。
许 DBMS 中 ORDER BY 。
有 DBMS 所有 , 字 ,
, 7 。
不 , 不 有 或 。
有 DBMS , 可以 ,
不 。 体 DBMS 文 。
有 DBMS 许 , 不 不
或 。 有 , 有电 邮 。
, 电 邮 , 不 。
, 许 , 有 DBMS 可 。

提示
上 的 , 的 DBMS 文 可能 的 。 ,
建 , 要 的 定。

18.2
以 , 。

CREATE VIEW 。 CREATE TABLE ,CREATE VIEW

图灵社区会员 maik000 专享 尊重版权


| 159

不 。

说明
,可 DROP , 法 DROP VIEW viewname;。

或更新 , , 重新 建。

18.2.1
复 SQL, 。 面

输入

CREATE VIEW ProductCustomers AS


SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;

分析

ProductCustomers , ,
任 所有 。 SELECT * FROM
ProductCustomers, 出 任 。

RGAN01 ,可

输入

SELECT cust_name, cust_contact


FROM ProductCustomers
WHERE prod_id = 'RGAN01';

图灵社区会员 maik000 专享 尊重版权


160 |

输出

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 中

输入

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'


AS vend_title
FROM Vendors
ORDER BY vend_name;

图灵社区会员 maik000 专享 尊重版权


| 161

输出

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 所

输入

SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'


AS vend_title
FROM Vendors
ORDER BY vend_name;

输出

vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

, 经 式 。 不必 ,
, 可。 ,可

输入

CREATE VIEW VendorLocations AS


SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
AS vend_title
FROM Vendors;

图灵社区会员 maik000 专享 尊重版权


162 |

面 ||

输入

CREATE VIEW VendorLocations AS


SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
AS vend_title
FROM Vendors;

分析

以 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 的
, 建 的 。

图灵社区会员 maik000 专享 尊重版权


| 163

18.2.3

WHERE 有 。 ,可以
CustomerEMailList , 有电 邮 。 ,可

输入

CREATE VIEW CustomerEMailList AS


SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;

分析

, 电 邮 邮 , 有电 邮
。 WHERE cust_email 中 有 NULL
, 不 出 。

,可以 CustomerEMailList。

输入

SELECT *
FROM CustomerEMailList;

输出

cust_id cust_name cust_email


---------- ------------ ---------------------
1000000001 Village Toys sales@villagetoys.com
1000000003 Fun4All jjones@fun4all.com
1000000004 Fun4All dstephens@fun4all.com

图灵社区会员 maik000 专享 尊重版权


164 |

说明 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;

输出

prod_id quantity item_price expanded_price


-------- --------- ----------- --------------
RGAN01 5 4.9900 24.9500
BR03 5 11.9900 59.9500
BNBG01 10 3.4900 34.9000
BNBG02 10 3.4900 34.9000
BNBG03 10 3.4900 34.9000

输入

CREATE VIEW OrderItemsExpanded AS


SELECT order_num,
prod_id,
quantity,

图灵社区会员 maik000 专享 尊重版权


| 165

item_price,
quantity*item_price AS expanded_price
FROM OrderItems;

20008 内容 面 出 ,

输入

SELECT *
FROM OrderItemsExpanded
WHERE order_num = 20008;

输出

order_num prod_id quantity item_price expanded_price


--------- ------- --------- ---------- --------------
20008 RGAN01 5 4.99 24.95
20008 BR03 5 11.99 59.95
20008 BNBG01 10 3.49 34.90
20008 BNBG02 10 3.49 34.90
20008 BNBG03 10 3.49 34.90

可以 , 容 , 。 , 可
简 复 。

18.3
。 不 。
SELECT ,可 简 ,
式 或 。

图灵社区会员 maik000 专享 尊重版权


166 |

19

, , 何
,以 本 。

19.1
, SQL 或
。 所有 简 ,经 有 复
, 以 。

,必 以 中有 。
有 , ,不 出 人,
以 。
中 有 , 。
可以 ,

不 , 出 本书中所 ,
以 。 许 SQL
。 , 体 SQL 不 , 可
中 。

图灵社区会员 maik000 专享 尊重版权


| 167

, 可以 独 SQL , 有
。 以 中 ,
必 。

可以 。简 , 以
或 SQL 。可 文 , 不 。

说明
Microsoft Access SQLite 。 , 的

MySQL 5 。 , 的 MySQL 较
的 。

说明
, 要 。
的 , 给出简单 , 的 能 。
, 给出的 提 Oracle SQL Server 的 法。

19.2
, 由 ,
面 出 。

中,可以简 复 面
所 。
由 不 复 , 。
所有 人 , 所

图灵社区会员 maik000 专享 尊重版权


168 |

。 ,出 可
。 。
简 。 或 或 内容 有
, 。 人 不

。 制 ,
或 所 。
以 式 ,所以 DBMS 所
, 。
中 SQL , 可以

, 有 , 简 。
, 。不 , SQL , 必

不 DBMS 中 有所不 。 , 可
不可 。不 , 字以
何 可以 可 。 , DBMS,
不 。
, 本 SQL 复 , ,
经 。 ,许 制

有 , 有 , 。 ,
DBMS 有 。
体 DBMS 文 。

图灵社区会员 maik000 专享 尊重版权


| 169

说明
DBMS 的 问
的 问 。 事 , 能 或
的 , 可 的 的

19.3
得 , 。
SQL 简 , EXECUTE。EXECUTE
任何 。 面

输入

EXECUTE AddNewProduct( 'JTS01',


'Stuffed Eiffel Tower',
6.49,
'Plush stuffed toy with the text La
➥Tour Eiffel in red white and blue' );

分析

AddNewProduct ,
Products 中。 AddNewProduct 有 , ID
Vendors 。 4
中4 。
Products , 。

, Products 中 有 prod_id ,
。 不
ID, ID 不

图灵社区会员 maik000 专享 尊重版权


170 |

。 。以 所

, 所有 4 有
ID
Products , 中

本 式。 体 DBMS,可 以

可 , 有不
不 出 ,以 = 方式 出 。
出 , 许 中 所 。
SELECT 。
, 许 。

19.4
所 , 。 得 , 简
, 邮 中 有邮 。

面 Oracle 版本

输入

CREATE PROCEDURE MailingListCount (


ListCount OUT INTEGER
)
IS
v_rows INTEGER;

图灵社区会员 maik000 专享 尊重版权


| 171

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 可以 面

输入

var ReturnValue NUMBER


EXEC MailingListCount(:ReturnValue);
SELECT ReturnValue;

分析

任何 ,
, SELECT 。

面 SQL Server 版本。

输入

CREATE PROCEDURE MailingListCount

图灵社区会员 maik000 专享 尊重版权


172 |

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 可以 面

输入

DECLARE @ReturnValue INT


EXECUTE @ReturnValue=MailingListCount;
SELECT @ReturnValue;

分析

任何 ,
, SELECT 。

面 , Orders 中 。
SQL Server,

输入

CREATE PROCEDURE NewOrder @cust_id CHAR(10)


AS

图灵社区会员 maik000 专享 尊重版权


| 173

-- Declare variable for order number


DECLARE @order_num INTEGER
-- Get current highest order number
SELECT @order_num=MAX(order_num)
FROM Orders
-- Determine next order number
SELECT @order_num=@order_num+1
-- Insert new order
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(@order_num, GETDATE(), @cust_id)
-- Return order number
RETURN @order_num;

分析

Orders 中 。 有 ,
ID。 中 。
。 ,
MAX() 1 SELECT 。 INSERT 由
GETDATE()
ID 。 , RETURN @order_num
。 , ,

说明 注
, 。 能,
。 的 ,
更 更 。

的 方 -- 。 的
DBMS 的 法, DBMS --,
法。

图灵社区会员 maik000 专享 尊重版权


174 |

面 SQL Server 不 版本

输入

CREATE PROCEDURE NewOrder @cust_id CHAR(10)


AS
-- Insert new order
INSERT INTO Orders(cust_id)
VALUES(@cust_id)
-- Return order number
SELECT order_num = @@IDENTITY;

分析

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 文 。

图灵社区会员 maik000 专享 尊重版权


| 175

20

, 何 COMMIT ROLLBACK

20.1
transaction processing , SQL
, 不 , 。

12 所 , 中, 容
。不 究 何以 ,
, 式 。

面 Orders 。 Orders
OrderItems 中 Orders ,OrderItems
。 1 ID
, 。

(1) 中 , 不 ,
(2) ID

图灵社区会员 maik000 专享 尊重版权


176 |

(3) Orders , ID
(4) Orders 中 ID
(5) OrderItems 中 , 出 ID
Orders ID Products 。

由 出 制 ,
。 中 出

, Orders , 不 有
。 有 。 ,所
。可以有 出 方 。

, Orders , OrderItems ,
, 中有 。

, OrderItems 出 ,
中 不 , 不 。

何 。 制,
必 SQL , 不 不
。 ,可以 不 中 ,
, 不 。 有 ,
, ,
复 。

, 何

(1) 中 , 不 ,
(2)
(3) ID

图灵社区会员 maik000 专享 尊重版权


| 177

(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 文 。

图灵社区会员 maik000 专享 尊重版权


178 |

SQL , 何
,何 不 。

有 DBMS 。 SQL Server 中,

输入

BEGIN TRANSACTION
...
COMMIT TRANSACTION

分析

中,BEGIN TRANSACTION COMMIT TRANSACTION


SQL 必 或者 不 。

MariaDB MySQL 中

输入

START TRANSACTION
...

Oracle

输入

SET TRANSACTION
...

PostgreSQL ANSI SQL

图灵社区会员 maik000 专享 尊重版权


| 179

输入

BEGIN
...

DBMS 体。 , 有
何 。 , 中 。 ,COMMITT
,ROLLBACK , 。

20.2.1 ROLLBACK

SQL ROLLBACK SQL , 面

输入

DELETE FROM Orders;


ROLLBACK;

分析

中, DELETE , ROLLBACK 。 不
有 , , 中,DELETE
INSERT UPDATE 不 。

20.2.2 COMMIT

SQL 。 所
式 implicit commit , 或 。

中, 不 式 。不 ,不 DBMS 有所不
。有 DBMS 式 ,有 不 。

, COMMIT 。 面 SQL Server

图灵社区会员 maik000 专享 尊重版权


180 |

输入

BEGIN TRANSACTION
DELETE OrderItems WHERE order_num = 12345
DELETE Orders WHERE order_num = 12345
COMMIT TRANSACTION

分析

SQL Server 中, 中 12345。


Orders OrderItems,所以
不 。 COMMIT 不出 出 。
DELETE , , DELETE 不 。

Oracle 中 ,可

输入

SET TRANSACTION
DELETE OrderItems WHERE order_num = 12345;
DELETE Orders WHERE order_num = 12345;
COMMIT;

20.2.3
简 ROLLBACK COMMIT , 可以 或 。
, 简 ,复 可 或 。

面 。 ,
Orders 可。不 Customers

,必 中 。
, ,可以 。

图灵社区会员 maik000 专享 尊重版权


| 181

SQL 中, 。 MariaDB MySQL Oracle 中


,可 SAVEPOINT 。

输入

SAVEPOINT delete1;

SQL Server 中,

输入

SAVE TRANSACTION delete1;

字,以 ,DBMS
何 。 本 出 , SQL Server 中可 。

输入

ROLLBACK TRANSACTION delete1;

MariaDB MySQL Oracle 中,

输入

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');

图灵社区会员 maik000 专享 尊重版权


182 |

IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;


INSERT INTO OrderItems(order_num, order_item, prod_id, quantity,
➥item_price)
VALUES(20100, 1, 'BR01', 100, 5.49);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity,
➥item_price)
VALUES(20100, 2, 'BR03', 100, 10.99);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
COMMIT TRANSACTION

分析

中 4 INSERT 。 INSERT
, , 面 任何 INSERT ,
。 SQL Server 中,可 @@ERROR
, 。 DBMS 不 或
。 @@ERROR 0 , 有 ,
。 , COMMIT 以 。

提示
可 SQL 中 任 的 , 。
, 就 能 。

20.3
必 SQL 。 何
COMMIT ROLLBACK 何 何
何 , 制 。
, 内容 。 DBMS 不 ,
内容 体 DBMS 文 。

图灵社区会员 maik000 专享 尊重版权


| 183

21

授 , 何 。

21.1
SQL , SQL
或 。简 SELECT , 有 得
或 10 。 DBMS 。

SQL 出的 。

有 , 出 中 或 或 ,
所 。 cursor DBMS ,
不 SELECT , 出 。
, 可以 或 中 。

不 DBMS 不 。

, , 不 。
制可以

图灵社区会员 maik000 专享 尊重版权


184 |


可 , 不可 。
, 或 所有
可 。
DBMS 出 不 出 中 复制,
不 。

说明
Microsoft Access , 的 Microsoft Access。

MySQL 5 。 , 的 MySQL 较
的 。

SQLite 的 step , 的
SQLite 的 , 法可能 。

式 , 中 ,
或 出 。

说明
Web 的 ASP ASP.NET ColdFusion PHP Python
Ruby JSP 。 务
, / 务 Web , 务
。 , Web
, 的 要重新 的 能。

21.2

图灵社区会员 maik000 专享 尊重版权


| 185

,必 。 有 ,
SELECT 。
, 必 以 。 面 SELECT
出 。
有 , 出 。
,必 ,可 , 有
体 DBMS 。

,可 。 ,可

21.2.1

DECLARE , 不 DBMS 中有所不 。


DECLARE , SELECT , WHERE
。 , 有电 邮 所
有 , , 人 出 电 邮

面 DB2 MariaDB MySQL SQL Server 版本。

输入

DECLARE CustCursor CURSOR


FOR
SELECT * FROM Customers
WHERE cust_email IS NULL

面 Oracle PostgreSQL 版本

图灵社区会员 maik000 专享 尊重版权


186 |

输入

DECLARE CURSOR CustCursor


IS
SELECT * FROM Customers
WHERE cust_email IS NULL

分析

面 版 本 中 , DECLARE ,
CustCursor。SELECT 有电 邮 NULL
所有 。

, 可以 。

21.2.2

OPEN CURSOR , 简 , DBMS


输入

OPEN CURSOR CustCursor

分析

OPEN CURSOR , , 出 以

可以 FETCH 。FETCH 出 ,
何 以 何 。 Oracle

图灵社区会员 maik000 专享 尊重版权


| 187

输入

DECLARE TYPE CustCursor IS REF CURSOR


RETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
OPEN CustCursor;
FETCH CustCursor INTO CustRecord;
CLOSE CustCursor;
END;

分析

中,FETCH ,
CustRecord 中。 出 不 任何 。

Oracle 中, , 出

输入

DECLARE TYPE CustCursor IS REF CURSOR


RETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
OPEN CustCursor;
LOOP
FETCH CustCursor INTO CustRecord;
EXIT WHEN CustCursor%NOTFOUND;
...
END LOOP;
CLOSE CustCursor;
END;

分析

, FETCH ,
CustRecord 中。 不 , FETCH LOOP 内,

图灵社区会员 maik000 专享 尊重版权


188 |

复 。 EXIT WHEN CustCursor%NOTFOUND 不出


出 。 有 ,
中可 体 ...。

面 , Microsoft SQL Server

输入

DECLARE @cust_id CHAR(10),


@cust_name CHAR(50),
@cust_address CHAR(50),
@cust_city CHAR(50),
@cust_state CHAR(5),
@cust_zip CHAR(10),
@cust_country CHAR(50),
@cust_contact CHAR(50),
@cust_email CHAR(255)
OPEN CustCursor
FETCH NEXT FROM CustCursor
INTO @cust_id, @cust_name, @cust_address,
@cust_city, @cust_state, @cust_zip,
@cust_country, @cust_contact, @cust_email
WHILE @@FETCH_STATUS = 0
BEGIN

FETCH NEXT FROM CustCursor


INTO @cust_id, @cust_name, @cust_address,
@cust_city, @cust_state, @cust_zip,
@cust_country, @cust_contact, @cust_email
END
CLOSE CustCursor

分析

中, 出 ,FETCH
中。 WHILE , WHILE
@@FETCH_STATUS = 0 不出 出 。

图灵社区会员 maik000 专享 尊重版权


| 189

不 体 , 中, 体
中 ... 。

21.2.3

面 所 , 。 ,SQL Server
DBMS 所 。 面 DB2 Oracle
PostgreSQL 。

输入

CLOSE CustCursor

面 Microsoft SQL Server 版本。

输入

CLOSE CustCursor
DEALLOCATE CURSOR CustCursor

分析

CLOSE 。 , 不 , 不
。 不 , OPEN 可。

21.3
本 授 , 。 DBMS 可
式 ,以 有 。 内容
体 DBMS 文 。

图灵社区会员 maik000 专享 尊重版权


190 |

22 SQL

SQL 所 。

22.1
SQL 经 版本, 。许 有
, 。

经 面 。 所 ,
, 。
由 referential integrity 。

, 方 中 。
, Orders ,OrderItems 内容,
OrderItems 中 任何 ID Orders 中。
, Orders 中 任 必 Customers 中。

可以 SELECT,以 所
有 , 不 , 。

面 ,
, 有 不 。

图灵社区会员 maik000 专享 尊重版权


| 191

UPDATE DELETE , 必 。
, DBMS 。

或 的 。

DBMS 。
中 , 17 所 , CREATE TABLE 或 ALTER TABLE

注意
的 , DBMS 提 的 。 ,
给出的 的 DBMS 上可能 的 。 ,
的 DBMS 文 。

22.1.1

1 简 。 , 或
中 , 不 。 , 中 或
中 。 方 或 中
。 有 , UPDATE 或 DELETE 不

中任 以 , 可以 。

任 不 。
有 中不 许 NULL 。
不 或 。 DBMS 不 许 ,
DBMS 许 , ,

图灵社区会员 maik000 专享 尊重版权


192 |

不 。 中 , 不 。

方 , 所 。

输入

CREATE TABLE Vendors


(
vend_id CHAR(10) NOT NULL PRIMARY KEY,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50) NULL,
vend_city CHAR(50) NULL,
vend_state CHAR(5) NULL,
vend_zip CHAR(10) NULL,
vend_country CHAR(50) NULL
);

分析

中, vend_id 字 PRIMARY KEY,


输入

ALTER TABLE Vendors


ADD CONSTRAINT PRIMARY KEY (vend_id);

分析

, CONSTRAINT 。 可
以 CREATE TABLE ALTER TABLE 。

说明
SQLite ALTER TABLE 定义 ,
要 的 CREATE TABLE
中定义 。

图灵社区会员 maik000 专享 尊重版权


| 193

22.1.2

中 , 必 中。
。 。

Orders 中。
Customers 中。Orders 中 ID Customers 中
。 ID Customers , 有
ID。 Orders , 有 。

Orders 中 ID 不 。 有 ,
有 有 ID 有不 。
,Orders 中 ID Customers 中 ID。

。 中, Orders ID
, Customers 。

面 方 。

输入

CREATE TABLE Orders


(
order_num INTEGER NOT NULL PRIMARY KEY,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL REFERENCES
➥Customers(cust_id)
);

分析

中 REFERENCES 字, cust_id 中 任何
必 Customers cust_id 中 。

图灵社区会员 maik000 专享 尊重版权


194 |

可以 ALTER TABLE 中 CONSTRAINT

输入

ALTER TABLE Orders


ADD CONSTRAINT
FOREIGN KEY (cust_id) REFERENCES Customers (cust_id)

提示 意
6 , , 重要 。
定义 ,DBMS 中 的 。
, 能 单的 。 的 方法
的 单 要 的 单 。 要 的 ,
可 。

的 DBMS cascading delete 的 。 ,


中 的 。 ,
Customers 中 某 , 任 的 单

22.1.3

或 中 。
, 以 。

可 , 许 。
可 NULL 。
可 或 。
可 复 。
不 , 不 。

图灵社区会员 maik000 专享 尊重版权


| 195

employees 。 有 社 ,
不 , 不 容
。 , 社 有 ID 。

ID ,可以 。 可 DBMS
社 不 人 。可以
社 UNIQUE 。

。 可以 UNIQUE
字 中 , 可以 独 CONSTRAINT 。

22.1.4

或 中 。
有以 。

或 。 , 0 0 。
。 , , 不

许 。 , 字 中 许 M 或 F。

, 1 制 中可 。
内 制, 制 ,可以

不 或
,DBMS 本 任何 。

面 OrderItems , 所有
0。

图灵社区会员 maik000 专享 尊重版权


196 |

输入

CREATE TABLE OrderItems


(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity > 0),
item_price MONEY NOT NULL
);

分析

,任何 或 , quantity
0。

gender M 或 F,可 ALTER TABLE

输入

ADD CONSTRAINT CHECK (gender LIKE '[MF]')

提示
的 DBMS 定义 的 。 定义 或
的 简单 。 , 可 定义 的 gender
的 , 单 的文 , M或F
或 NULL 的 。 ,可
的定义。定 的
定义中 , , 。
的 DBMS 文 , 定义 。

图灵社区会员 maik000 专享 尊重版权


引| 197

22.2
以 。 本书
本书 ,可以 。

出本书中所有 ,简 1
, 。 可以 任 , 不
。 文字可 , 以 方式 书 不可 。
不 , 出所 。

书 有 。 字 出 书中
。 ,可 中 出 , 出
中。 , 出 。

有 简 , 。 出书中
不 必 , 书 内容 有 。
书 内容 字 , 有必 字 有 。

。 , DBMS 。
, 有 。

, 中 不 。 ,
, 未 ,DBMS 必 出 中所有
, 。 有 书中 出 。

方 。可以 或 , DBMS
内容 。 ,DBMS 以 书
方 。DBMS , 出 ,

图灵社区会员 maik000 专享 尊重版权


198 |

, 以 内容。

, 。
,DBMS 必 。
可 。
所有 。 不 不 有
可 或 , 得 。
。 经 以
, 可 。
可以 中 , 。 以
有 。 , 有 。

有 ,何 。 DBMS 可
, 经 。

CREATE INDEX 不 DBMS 。


面 Products 简 。

输入

CREATE INDEX prod_name_ind


ON Products (prod_name);

分析

必 。 prod_name_ind 字 CREATE
INDEX 。ON , 中 中
有 中 出。

图灵社区会员 maik000 专享 尊重版权


| 199

提示
的 的 或 。 现,
建的某 的 的 可能
。 定 , 要 。

22.3
, 。
可以 INSERT UPDATE DELETE 或 。

不 简 SQL ,
。 Orders INSERT
Orders 中 。 , Customers INSERT
UPDATE 出 。

内 有以 权

INSERT 中 所有
UPDATE 中 所有
DELETE 中 。

所 DBMS 不 , 可 或 。

面 。

。 , INSERT 或 UPDATE 中 所有

。 , 或

图灵社区会员 maik000 专享 尊重版权


200 |

。 , 可
不 , 经 出, 。
或 。

者可 经 ,不 DBMS ,
文 。

面 , 所有 INSERT UPDATE ,
Customers 中 cust_state 。

本 SQL Server 版本。

输入

CREATE TRIGGER customer_state


ON Customers
FOR INSERT, UPDATE
AS
UPDATE Customers
SET cust_state = Upper(cust_state)
WHERE Customers.cust_id = inserted.cust_id;

本 Oracle PostgreSQL 版本

输入

CREATE TRIGGER customer_state


AFTER INSERT OR UPDATE
FOR EACH ROW
BEGIN
UPDATE Customers
SET cust_state = Upper(cust_state)
WHERE Customers.cust_id = :OLD.cust_id
END;

图灵社区会员 maik000 专享 尊重版权


| 201

提示
, 的 比 , 可能的 ,

22.4
, 有 , ,
不 或任 。 , 必 许
, DBMS 制, 制授
或 制 。

任何 授权 。 ,
, 有权 , 许 。
有 DBMS , 有
, 有 。

, 有



, 许 制
制 。

SQL GRANT REVOKE ,不 , DBMS


式 , 内 GRANT
REVOKE 。

图灵社区会员 maik000 专享 尊重版权


202 |

22.5
本 授 何 SQL 。
, 可 , 可以
, 可 。不 DBMS 可 以不 式
, 体 DBMS 文 。

图灵社区会员 maik000 专享 尊重版权


| 203

SQL 本 。 不
中, 何 , 中 何 ,
SQL 不可 。

者 本书 。所有
文 。 内容,本 所
以 何 或 得 。

A.1
本书中所 经
。 以 任

5
。以 出 。

图灵社区会员 maik000 专享 尊重版权


204 |

说明
的 ,现 中的 单
的 信息 信息 。 ,
现 中 的 的 。 可
的 。

面 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

图灵社区会员 maik000 专享 尊重版权


| 205

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 电 邮

图灵社区会员 maik000 专享 尊重版权


206 |

所有 有 。 cust_id 。

4. Orders

Orders 不 。
order_num 。Orders cust_id Customers
ID 。

A-4 Orders

order_num

order_date

cust_id ID Customers cust_id

所有 有 。 order_num 。
, cust_id ,
Customers cust_id 。

5. OrderItems

OrderItems 中 , 。
Orders , OrderItems 中有 或 。
由 。
order_num Orders 中 ID
。 , ID
Products 。

图灵社区会员 maik000 专享 尊重版权


| 207

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

图灵社区会员 maik000 专享 尊重版权


208 |

A.2
, 。所 得
可以 本书 http://www.forta.com/books/0672336073/ 。

A.2.1

可 URL 式 文

Apache Open Office Base


Microsoft Access 2000 2007
SQLite

文 ,不 任何 SQL 本。

A.2.2 DBMS SQL

DBMS 以不 文 式 Access Open


Office Base SQLite 。 DBMS,可以 URL SQL
本。 DBMS,有 文

create.text 5 所有
SQL 。
populate.txt SQL INSERT 。

文 中 SQL 体 DBMS,
DBMS 。 本 方 者 , 者
不 任何 任。

图灵社区会员 maik000 专享 尊重版权


| 209

本书 ,有以 本可

IBM DB2
Microsoft SQL Server Microsoft SQL Server Express
MariaDB
MySQL
Oracle Oracle Express
PostgreSQL。

DBMS 本可 或 。

B 中 本 。

说明
建 。 的
。 建 , 的问题。

说明
DBMS 的 的 DBMS 。
下 或 , README 文 , 提 定
DBMS 的 。

图灵社区会员 maik000 专享 尊重版权


210 |

1 所 ,SQL 不 , 。 本书中
, SQL 。

本 中 SQL 。

可以 面 出 任何 或 SQL
。 ,究

许 DBMS 有 , 出
。 有 有 面。
Web 人 , 可以 任何 Web
, ASP.NET ColdFusion Java JSP PHP Python Ruby
on Rails。
有 方 ,本书 http://www.forta.com/books/
0672336073/ 有 中 。

B.1 Apache Open Office Base


Apache Open Office Base Java Open

Office Base 可以 SQL 。 , 。

(1) Open Office Base 中 。

图灵社区会员 maik000 专享 尊重版权


| 211

(2) Database 面 中 Queries。


(3) Tasks 面 , Create Query In SQL View 以 Query Design

(4) 文本 文本 中 SQL 。
(5) SQL , Run Query 有文 。
可以 F5 或 Edit Run Query, SQL 。

B.2 Adobe ColdFusion


Adobe ColdFusion Web 。ColdFusion
本。 SQL, 可 Web
简 面。 以 。

(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.3 IBM DB2


IBM DB2 有 DBMS。 有 可

图灵社区会员 maik000 专享 尊重版权


212 |

SQL 。 面 Java Control Center


, 简 。

(1) Control Center。


(2) Object View 出 所有可 , All Databases,

(3) Query,或者 中
Selected Query。
(4) 面 中 SQL 。
(5) Execute 有 , 本。
(6) 面 , Query Results ,可以以
式 。

B.4 MariaDB
MariaDB 有 , MySQL
容 。 B.10 。

B.5 Microsoft Access


Microsoft Access 式 , 式
,Access 出 Query Designer,可 式 SQL 。
Query Designer 有 , 许 出
SQL。 , 。

(1) Microsoft Access。 或 。



(2) Database 中 Queries, New Design View。

图灵社区会员 maik000 专享 尊重版权


| 213

(3) 出 Show Table , ,不 任何 。


(4) View SQL View Query 。
(5) Query 中 SQL 。
(6) Run 有 SQL 。
Datasheet View 中 。
(7) SQL View Datasheet View SQL ,
SQL View 。 可以 Design View 式 SQL

B.6 Microsoft ASP


Microsoft ASP Web 本 。 ASP 内 SQL
,必 Web 面。 面
ASP 面内 SQL 所 。

(1) ASP ODBC , 必 出 ODBC


本 面 内容 。
(2) 任 文本 ASP 面 ASP 。
(3) Server.CreateObject ADODB.Connection

(4) Open 方 所 ODBC 。
(5) SQL Execute 方 。Execute 方
。 Set 。
(6) , 出 <% Do While NOT EOF %>

(7) Web 任 可 中 面。
(8) Web , 面。

图灵社区会员 maik000 专享 尊重版权


214 |

B.7 Microsoft ASP.NET


Microsoft ASP.NET .NET , Web 本
。 ASP.NET 面内 SQL ,必 可
面。有 方 , 面 中 方 。

(1) .aspx 文 。
(2) SqlConnection()或 OleDbConnection() 。
(3) SqlCommand()或 OleDbCommand() DBMS 。
(4) ExecuteReader DataReader。
(5) reader 以 得 。
(6) Web 任 可 中 面。
(7) Web 面 。

B.8 Microsoft Query


Microsoft Query 独 SQL , ODBC
SQL 。 Windows 不
Microsoft Query,不 , 可以 Microsoft 以 方
。 可以 。

提示 -
MS-Query Office , 能
。 Start 上 给出,可 Start Find
上 , 给出 。要 的文
MSQRY32.EXE 或 MSQUERY.EXE。

Microsoft Query, 。

图灵社区会员 maik000 专享 尊重版权


| 215

(1) Microsoft Query ODBC , 可以


必 出 ODBC B.16 。
(2) Microsoft Query ,必 。 Start

(3) File 中, Execute SQL, Execute SQL 。
(4) Data Sources 所 ODBC 。 所
未 出, Other 。 , Use 。
(5) SQL Statement 中 SQL 。
(6) Execute SQL 。

B.9 Microsoft SQL Server Microsoft


SQL Server Express
Microsoft SQL Server 出 SQL Server Management Studio
。 制
, 出 SQL 。以 何 SQL
Server Management Studio。

(1) SQL Server Management Studio。


(2) , 。
(3) SQL Server Management Studio 面 。 Object
Explorer 出 所有 , 面
, 文本 SQL 。
(4) 方 , 许
。 出 出 USE 。
, 。

图灵社区会员 maik000 专享 尊重版权


216 |

(5) 文本 SQL , Execute Query 有


, 可 F5 或 Query Execute 。
(6) SQL 独 中。
(7) ,

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, 。

(1) MySQL Workbench。

图灵社区会员 maik000 专享 尊重版权


| 217

(2) MySQL Workbench 出 可 MySQL , 许


。 任何 可以 有
出, New Connection。
(3) , 。 Object Browser 出 可 ,
中 SQL 文本 , 或 方。
(4) SQL , SQL 。
(5) SQL , Execute 有 电 SQL。
面。

B.11 Oracle
Oracle 有 。 SQL Oracle SQL Developer,
可以 MySQL DBMS , 可以独 。 面
何 。

(1) Oracle SQL Developer Windows 文


,不 本 。
(2) , 。 可以 Connections
面 中 。
(3) , SQL Worksheet , Query Builder 中
SQL 。
(4) SQL , Execute 电 。
面 面 中。

B.12 Oracle Express


Oracle Express 有 DBMS,有

图灵社区会员 maik000 专享 尊重版权


218 |

Web 面。 Oracle Express, 有 Getting Started


Web 面 , 可以 面 SQL 。 ,
以 。

(1) Oracle Express Web 面。


(2) 出 , 。
(3) 可以 , SQL 。
可以 。
(4) SQL Commands,可 SQL 。
SQL Scripts, 经 SQL 本 有 , 本书
可 本。 SQL Commands , SQL Commands 。
(5) 方 SQL 。
(6) SQL , 方 Run 。 SQL 。

B.13 PHP
PHP Web 本 。
, , SQL 可 所 以 何
DBMS 。 , DBMS ,
MySQL 。 何 体 DBMS
, PHP 文 。

(1) PHP 面 PHP 。


(2) 。 mysql_connect() MySQL

(3) SQL 。 MySQL, mysql_query()。
(4) , 以 。

图灵社区会员 maik000 专享 尊重版权


| 219

(5) 面 Web 任何可 中。


(6) Web 面。

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, 。

(1) pgAdmin 可 pgAdmin III 。


(2) 出 , 。
(3) pgAdmin 出 。 ,pgAdmin
, 。
(4) , 可 。

图灵社区会员 maik000 专享 尊重版权


220 |

(5) Execute Arbitrary SQL Queries , 字,


SQL 。
(6) 。 方
中。
(7) 可以 方 文本 中 SQL 。
(8) Execute Query 有 , SQL 。
面。

B.15 SQLite
SQLite 中 ,不 独 。
,SQLite 有 ,可以 SQLite
。 SQLite sqlite3 或 Windows
sqlite3.exe 。 sqlite3, 。

(1) ,sqlite3 可以 文 。 SQLite


有.sqlite 或.db 独文 中, 可以 任
,或者 有 。
(2) sqlite3 database.sqlite 文
database.sqlite 。
(3) 可以 sqlite> , SQL 。所有 必
; 。
(4) ,sqlite3 字 , 有
。 , .mode column ,
.header on 。
(5) .quit , 出 sqlite3。

图灵社区会员 maik000 专享 尊重版权


| 221

B.16 ODBC
面 ODBC , , 简
ODBC,以 ODBC 。

ODBC , 不 或
。 ODBC, 中 ,
所有 或 DBMS 。

ODBC 本 不 , , 所有 以
方式 。 有
。 , 本 或 , 。
, 。
ODBC 所 SQL。

ODBC 不 , ODBC
。 ,
有 何 文

ODBC ,任何 容 ODBC 可以


。ODBC 不 体 , 。

注意
的 ODBC , 可能提 的
。 的 , 的提 。

ODBC Windows Control Panel ODBC 。 ODBC


, 。

图灵社区会员 maik000 专享 尊重版权


222 |

(1) Windows Control Panel ODBC 。


(2) ODBC
, , 可以, System DSN。
(3) Add 。
(4) 。 有 ,
。 可以 。必

(5) 或 DBMS , 或文
,以 可 。 ,

图灵社区会员 maik000 专享 尊重版权


| 223

C SQL

者 ,本 出
SQL 。 以简 , 出 。
方 , 所 。

, 以 。

| 出 中 , ,NULL | NOT NULL 或


者 出 NULL 或者 出 NOT NULL。
方 中 字或 [like this] 可 。
面 出 所有 DBMS 有 。 体 可
, 者 DBMS 文 。

C.1 ALTER TABLE


ALTER TABLE 。 ,
CREATE TABLE。 , 17 。

输入

ALTER TABLE tablename


(
ADD|DROP column datatype [NULL|NOT NULL] [CONSTRAINTS],
ADD|DROP column datatype [NULL|NOT NULL] [CONSTRAINTS],

图灵社区会员 maik000 专享 尊重版权


224 |

...
);

C.2 COMMIT
COMMIT 。 内容 20 。

输入

COMMIT [TRANSACTION];

C.3 CREATE INDEX


CREATE INDEX 或 。 内容
22 。

输入

CREATE INDEX indexname


ON tablename (column, ...);

C.4 CREATE PROCEDURE


CREATE PROCEDURE 。 内容 19 。
所 ,Oracle 有不 。

输入

CREATE PROCEDURE procedurename [parameters] [options]


AS
SQL statement;

图灵社区会员 maik000 专享 尊重版权


| 225

C.5 CREATE TABLE


CREATE TABLE 。 经 ,
ALTER TABLE。 内容 17 。

输入

CREATE TABLE tablename


(
column datatype [NULL|NOT NULL] [CONSTRAINTS],
column datatype [NULL|NOT NULL] [CONSTRAINTS],
...
);

C.6 CREATE VIEW


CREATE VIEW 或 。 内容 18 。

输入

CREATE VIEW viewname AS


SELECT columns, ...
FROM tables, ...
[WHERE ...]
[GROUP BY ...]
[HAVING ...];

C.7 DELETE
DELETE 中 或 。 内容 16 。

输入

DELETE FROM tablename


[WHERE ...];

图灵社区会员 maik000 专享 尊重版权


226 |

C.8 DROP
DROP 。 内容 17
18 。

输入

DROP INDEX|PROCEDURE|TABLE|VIEW
indexname|procedurename|tablename|viewname;

C.9 INSERT
INSERT 。 内容 15 。

输入

INSERT INTO tablename [(columns, ...)]


VALUES(values, ...);

C.10 INSERT SELECT


INSERT SELECT SELECT 。 内容
15 。

输入

INSERT INTO tablename [(columns, ...)]


SELECT columns, ... FROM tablename, ...
[WHERE ...];

C.11 ROLLBACK
ROLLBACK 。 内容 20 。

图灵社区会员 maik000 专享 尊重版权


| 227

输入

ROLLBACK [ TO savepointname];

或者

输入

ROLLBACK TRANSACTION;

C.12 SELECT
SELECT 或 中 。 本 ,
2 3 4 2 14 SELECT 有 。

输入

SELECT columnname, ...


FROM tablename, ...
[WHERE ...]
[UNION ...]
[GROUP BY ...]
[HAVING ...]
[ORDER BY ...];

C.13 UPDATE
UPDATE 中 或 。 内容 16 。

输入

UPDATE tablename
SET columname = value, ...
[WHERE ...];

图灵社区会员 maik000 专享 尊重版权


228 |

D SQL

1 所 , 中可以 以
本 。

以 。

许 制可 中 。 ,

许 内 有 。可以 文本字
简 式 。
许 。 所有 字 ,
1 10 , 10 2 字 以字 ,
, 字 。 ,

, 所 。 可
。 不
可 。

本 不 何 ,
容 。

图灵社区会员 maik000 专享 尊重版权


| 229

注意 意
,现 要 提醒。 DBMS 的 可能
的 。 DBMS 中, 的 可能
的 。 的 DBMS
的 信息, 的 DBMS 文 。

D.1
字 。 字 , 字
电 邮 。有 本 字 , 字
字 D-1 。

字 字 , 。 ,
字 可 许 30 字 , 社 许 11 字 许 字
中 。 不 许 字 。
。 , 字 Ben 30 字
字字 , 30 字 , 字 ,或
NULL。

字 任 文本 不
DBMS 。有 有 , 有
。不 , 有 得以 不 。


。DBMS 得 。 ,许 DBMS 不
许 或 可 ,
22 。

图灵社区会员 maik000 专享 尊重版权


230 |

D-1

CHAR 1 255 字 字 。 必
NCHAR CHAR 式, 字 或Unicode字

NVARCHAR TEXT 式, 字 或Unicode字

TEXT LONG MEMO 文本
或VARCHAR

提示
的 , 单 。

注意
可能 中
, 可 。 中
01234, 的 1234, 上 。

要 的 中 的
, 中 可能
, 中。

D.2
。 DBMS ,
有不 。 , ,所
。 ,有 制 ,
有 。 D-2 出 。 所有 DBMS
所 出 。

图灵社区会员 maik000 专享 尊重版权


| 231

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 能 ,
的文 。

图灵社区会员 maik000 专享 尊重版权


232 |

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
, 体

图灵社区会员 maik000 专享 尊重版权


| 233

说明
比较的 , 中 建
的 建 A 。 比较 DBMS 的
,可 的任务。

图灵社区会员 maik000 专享 尊重版权


234 |

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

图灵社区会员 maik000 专享 尊重版权


| 235

CALL CURRENT EXCEPT


CASCADE CURRENT_DATE EXCEPTION
CASCADED CURRENT_TIME EXEC
CASE CURRENT_TIMESTAMP EXECUTE
CAST CURRENT_USER EXISTS
CATALOG CURSOR EXIT
CHANGE DATABASE EXPLAIN
CHAR DATABASES EXTEND
CHARACTER DATE EXTERNAL
CHARACTER_LENGTH DATETIME EXTRACT
CHECK DAY FALSE
CHECKPOINT DBCC FETCH
CLOSE DEALLOCATE FIELD
CLUSTER DEBUG FIELDS
CLUSTERED DEC FILE
COALESCE DECIMAL FILLFACTOR
COLLATE DECLARE FILTER
COLUMN DEFAULT FLOAT
COLUMNS DELETE FLOPPY
COMMENT DENY FOR
COMMIT DESC FORCE
COMMITTED DESCENDING FOREIGN
COMPUTE DESCRIBE FOUND
COMPUTED DISCONNECT FREETEXT
CONDITIONAL DISK FREETEXTTABLE
CONFIRM DISTINCT FROM
CONNECT DISTRIBUTED FULL
CONNECTION DIV FUNCTION
CONSTRAINT DO GENERATOR
CONSTRAINTS DOMAIN GET
CONTAINING DOUBLE GLOBAL
CONTAINS DROP GO
CONTAINSTABLE DUMMY GOTO
CONTINUE DUMP GRANT
CONTROLROW ELSE GROUP
CONVERT ELSEIF HAVING
COPY ENCLOSED HOLDLOCK
COUNT END HOUR
CREATE ERRLVL IDENTITY
CROSS ERROREXIT IF
CSTRING ESCAPE IN
CUBE ESCAPED INACTIVE

图灵社区会员 maik000 专享 尊重版权


236 |

INDEX MIRROREXIT PERM


INDICATOR MODULE PERMANENT
INFILE MONEY PIPE
INNER MONTH PLAN
INOUT MOVE POSITION
INPUT NAMES PRECISION
INSENSITIVE NATIONAL PREPARE
INSERT NATURAL PRIMARY
INT NCHAR PRINT
INTEGER NEXT PRIOR
INTERSECT NEW PRIVILEGES
INTERVAL NO PROC
INTO NOCHECK PROCEDURE
IS NONCLUSTERED PROCESSEXIT
ISOLATION NONE PROTECTED
JOIN NOT PUBLIC
KEY NULL PURGE
KILL NULLIF RAISERROR
LANGUAGE NUMERIC READ
LAST OF READTEXT
LEADING OFF REAL
LEFT OFFSET REFERENCES
LENGTH OFFSETS REGEXP
LEVEL ON RELATIVE
LIKE ONCE RENAME
LIMIT ONLY REPEAT
LINENO OPEN REPLACE
LINES OPTION REPLICATION
LISTEN OR REQUIRE
LOAD ORDER RESERV
LOCAL OUTER RESERVING
LOCK OUTPUT RESET
LOGFILE OVER RESTORE
LONG OVERFLOW RESTRICT
LOWER OVERLAPS RETAIN
MANUAL PAD RETURN
MATCH PAGE RETURNS
MAX PAGES REVOKE
MERGE PARAMETER RIGHT
MESSAGE PARTIAL ROLLBACK
MIN PASSWORD ROLLUP
MINUTE PERCENT ROWCOUNT

图灵社区会员 maik000 专享 尊重版权


| 237

RULE STARTING UNTIL


SAVE STARTS UPDATE
SAVEPOINT STATISTICS UPDATETEXT
SCHEMA SUBSTRING UPPER
SECOND SUM USAGE
SECTION SUSPEND USE
SEGMENT TABLE USER
SELECT TABLES USING
SENSITIVE TAPE VALUE
SEPARATOR TEMP VALUES
SEQUENCE TEMPORARY VARCHAR
SESSION_USER TEXT VARIABLE
SET TEXTSIZE VARYING
SETUSER THEN VERBOSE
SHADOW TIME VIEW
SHARED TIMESTAMP VOLUME
SHOW TO WAIT
SHUTDOWN TOP WAITFOR
SINGULAR TRAILING WHEN
SIZE TRAN WHERE
SMALLINT TRANSACTION WHILE
SNAPSHOT TRANSLATE WITH
SOME TRIGGER WORK
SORT TRIM WRITE
SPACE TRUE WRITETEXT
SQL TRUNCATE XOR
SQLCODE UNCOMMITTED YEAR
SQLERROR UNION ZONE
STABILITY UNIQUE

图灵社区会员 maik000 专享 尊重版权


238 |

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 。 可

图灵社区会员 maik000 专享 尊重版权


| 239

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 。

图灵社区会员 maik000 专享 尊重版权


240 |

%,47 复 ,122 N ,116


[ ],51 ,
_,50 G 内 ,108 100
SQL,6 ,194
,139 P
,101 ,47
B
,29 ,56
Y
,177,181
H S
,3 ,33
,3 ,177 ,141 ,190
,59,112 ,5 ,177 式 ,179
,122 ,175 ,183
J ,155 ,118
C ,190
,5 ,130
,37 ,183 ,4
Z
,107 ,2
,93 K ,4 ,5,191
,199 式,46 ,18
可 ,103
,166 ,61 ,93
可 ,65
,197 ,22
D L 字 ,55
T
,113
出 ,61 ,101
,177 ,115
,108 ,3
,14,46 ,122
,105 ,177
,118
F M W

,85 式,3 ,142,193

图灵社区会员 maik000 专享 尊重版权


图灵社区会员 maik000 专享 尊重版权
图灵社区会员 maik000 专享 尊重版权

You might also like