友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第21部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
INPUT
SELECT * FROM TABLE1 TABLE1
OUTPUT
ROW REMARKS ROW REMARKS
row 1 Table 1 row 1 Table 1
row 1 Table 1 row 2 Table 1
row 1 Table 1 row 3 Table 1
row 1 Table 1 row 4 Table 1
row 1 Table 1 row 5 Table 1
row 1 Table 1 row 6 Table 1
row 2 Table 1 row 1 Table 1
row 2 Table 1 row 2 Table 1
134
…………………………………………………………Page 135……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
ROW REMARKS ROW REMARKS
row 2 Table 1 row 3 Table 1
row 2 Table 1 row 4 Table 1
row 2 Table 1 row 5 Table 1
row 2 Table 1 row 6 Table 1
分析
如果把这个表的内容全部列出的话它与联合两个有 6 行的表是相同的 这种联合
对于检查内部数据的一致性 如果你的零件生产部门的某人犯了迷糊输入了一个已经存在
的零件号时将会发生什么呢 这对于每一个人来说都是一个坏消息 发票会开错 你的应
用程序会崩溃 会耗掉你许多宝贵的时光 在下表中 重复的 PARTNUM 会导致问题的产
生
INPUT/OUTPUT
SELECT * FROM PART
PARTNUM DESCRIPTION PRICE
54 PEDALS 54。25
42 SEATS 24。50
46 TIRES 15。25
23 MOUNTAIN BIKE 350。45
76 ROAD BIKE 530。00
10 TANDEM 1200。00
76 CLIPPLESS SHOE 65。00提示符以及行号
建立一个子查询
简而言之 子查询可以让你把查询的结果与另一个查询绑定在一起 通用的语法格式
如下
SYNTAX
SELECT * FROM TABLE1 WHERE TABLE1。SOMECOLUMN =
(SELECT SOMEOTHERCOLUMN FROM TABLE2
WHERE SOMEOTHERCOLUMN = SOMEVALUE)
注意一下第二个查询是如何嵌入到第一个查询之中的 这里用 ORDERS 和 PART 表来
举一个实例
INPUT
SELECT * FROM PART
OUTPUT
PARTNUM DESCRIPTION PRICE
54 PEDALS 54。25
42 SEATS 24。50
46 TIRES 15。25
138
…………………………………………………………Page 139……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
PARTNUM DESCRIPTION PRICE
23 MOUNTAIN BIKE 350。45
76 ROAD BIKE 530。00
10 TANDEM 1200。00
INPUT/OUTPUT
SELECT *
FROM ORDERS
ORDEREDON NAME PARTNUM QUANTITY REMARKS
15…MAY…1996 TRUE WHEEL 23 6 PAID
19…MAY…1996 TRUE WHEEL 76 3 PAID
2…SEP…1996 TRUE WHEEL 10 1 PAID
30…JUN…1996 TRUE WHEEL 42 8 PAID
30…JUN…1996 BIKE SPEC 54 10 PAID
30…MAY…1996 BIKE SPEC 10 2 PAID
30…MAY…1996 BIKE SPEC 23 8 PAID
17…JAN…1996 BIKE SPEC 76 11 PAID
17…JAN…1996 LE SHOPPE 76 5 PAID
1…JUN…1996 LE SHOPPE 10 3 PAID
1…JUN…1996 AAA BIKE 10 1 PAID
1…JUL…1996 AAA BIKE 76 4 PAID
1…JUL…1996 AAA BIKE 46 14 PAID
11…JUL…1996 JACKS BIKE 76 14 PAID
分析
两表的共有字段是 PARTNUM 假如你不知道 或者是不想知道 这个字段 但是你
又想用 PART 表的 description 字段来工作 这时可以使用子查询 语句如下
INPUT/OUTPUT
SELECT * FROM ORDERS WHERE PARTNUM =
(SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃)
ORDEREDON NAME PARTNUM QUANTITY REMARKS
19…MAY…1996 TRUE WHEEL 76 3 PAID
17…JAN…1996 BIKE SPEC 76 11 PAID
17…JAN…1996 LE SHOPPE 76 5 PAID
1…JUL…1996 AAA BIKE 76 4 PAID
11…JUL…1996 JACKS BIKE 76 14 PAID
分析
139
…………………………………………………………Page 140……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
更进一步 如果你使用了在第六天中的概念 你可以使 PARTNUM 列带有
DESCRIPTION 这样就会使那些对 PARTNUM 还不太清楚的人看得更明白些 如下例
INPUT/OUTPUT
SELECT O。ORDEREDON O。PARTNUM P。DESCRIPTION O。QUANTITY O。REMARKS
FROM ORDERS O PART P WHERE O。PARTNUM = P。PARTNUM
AND O。PARTNUM =(SELECT PARTNUM FROM PART
WHERE DESCRIPTION LIKE 〃ROAD%〃)
ORDEREDON PARTNUM DESCRIPTION QUANTITY REMARKS
19…MAY…1996 76 ROAD BIKE 3 PAID
1…JUL…1996 76 ROAD BIKE 4 PAID
17…JAN…1996 76 ROAD BIKE 5 PAID
17…JAN…1996 76 ROAD BIKE 11 PAID
11…JUL…1996 76 ROAD BIKE 14 PAID
分析
查询的第一部分非常熟悉
SELECT O。ORDEREDON O。PARTNUM P。DESCRIPTION O。QUANTITY
O。REMARKS FROM ORDERS O PART P
这里使用了别名 O 和 P 来指定了在 ORDERS 和 PART 表中你所感兴趣的 5 列 对于
你要访问的在两个表中的名字唯一的列别名是没有必要的 可是它可以使你的语句更具有
可读性 你看到的第一个 WHERE 子句内容如下
WHERE O。PARTNUM = P。PARTNUM
它是将 ORDERS 与 PART 表进行归并的标准语句 如果你没有使用 WHERE 子句 那
么你将会得到两个表的记录的所有可能的组合 接下来就是子查询语句 内容如下
AND O。PARTNUM =(SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃)
增加的限制使你的 PARTNUM 内容必须与你的子查询所返回的结果相等 子查询则非常简
单 它要求返回以 ROAD%相符的 PARTNUM 使用 LIKE 语句是一种懒人的办法 使得
你不必键入 ROAD BIKE 但是这只是你侥幸 如果在 PART 表中加入了一个新的记录名
字为 ROADKILL 时呢 这时 PART 表的内容如下
INPUT/OUTPUT
SELECT * FROM PART
PARTNUM DESCRIPTION PRICE
140
…………………………………………………………Page 141……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
PARTNUM DESCRIPTION PRICE
54 PEDALS 54。25
42 SEATS 24。50
46 TIRES 15。25
23 MOUNTAIN BIKE 350。45
76 ROAD BIKE 530。00
10 TANDEM 1200。00
77 ROADKILL 7。99
如果你没有觉察到这些改变而仍然使用原来的查询的话 你将会得到如下信息
multiple rows in singleton select
你没有得到任何结果 SQL 的响应信息可能不会相同 但是你都会同样地得不到任何结果
想知道为什么会有这样的结果 请想一个 SQL 引擎的处理规则 你需要重新核查一下你的
子查询 请输入
INPUT/OUTPUT
SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃
PARTNUM
76
77
你会把这个结果赋给 O。PARTNUM = 就是这一步导致的错误
分析
PARTNUM 怎么能同时匹配 76 和 77 呢 解释器一定会给你这样的信息的 因为你是
一个懒家伙 当你使用 LIKE 子句的时候 你就已经开始了犯错误的道路 如果你想使用
比较运算符如》
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!