按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
答 很简单 因为并没有这种事情发生 当你联合时 你只是从多个表中选出了特定
的列
校练场
1 如果一个表有 50000 行而另一个表有 100000 行时联合的结果会有多少行
2 下边的联合属于哪一种类型的联合
SELECT E 。NAME ; E 。EMPLOYEE_ID; EP 。SALARY FROM EMPLOYEE_TBL E; EMPLOYEE_PAY_TBL EP
WHERE E 。EMPLOYEE_ID = EP 。EMPLOYEE_ID
3 下边的查询语句能否工作
A 。 SELECT NAME; EMPLOYEE_ID; SALARY FROM EMPLOYEE_TBL E; EMPLOYEE_PAY_TBL EP
WHERE EMPLOYEE_ID = EMPLOYEE_ID AND NAME LIKE '%MITH';
136
…………………………………………………………Page 137……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
B。 SELECT E。NAME ; E。EMPLOYEE_ID; EP。SALARY FROM EMPLOYEE_TBL E; EMPLOYEE_PAY_TBL EP
WHERE NAME LIKE '%MITH';
C。 SELECT E。NAME ; E。EMPLOYEE_ID; EP。SALARY FROM EMPLOYEE_TBL E;EMPLOYEE_PAY_TBL EP
WHERE E 。EMPLOYEE_ID = EP 。EMPLOYEE_ID AND E。NAME LIKE '%MITH';
4 是否在联合语句中 WHERE 子句中的第一个条件应该是联合条件
5 联合的限制为一列 是否可以有更多的列
练习
1 在表的自我联合这部分 最后的一个例子返回了两个结果 请重写这个查询使它对
多余的记录只返回一个结果
2 重写下边的查询使它更可读和简炼
INPUT:
select orders。orderedon; orders。name; part。partnum;part。price; part。description
from orders; part
where orders。partnum = part。partnum and orders。orderedon
between '1…SEP…96' and '30…SEP…96' order by part。partnum
3 使用 ORDERS 表和 PART 表 返回下边的结果
OUTPUT
ORDEREDON NAME PARTNUM QUANTITY
2…SEP…96 TRUE WHEEL 10 1
137
…………………………………………………………Page 138……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第七天 子查询 内嵌的 SQL 子句
目标
子查询是一种把查询的结果作为参数返回给另一个查询的一种查询 子查询可以让你
将多个查询绑定在一起 到今天结束以后 你将掌握以下内容
l 建立一个子查询
l 在你的子查询中使用 EXIST ANY 和 ALL 关键字
l 建立和使用子查询的关联
注 今天的例子是使用 BORLAND 公司的 ISQL 建立的 我们在第六天使用的也是这种解
释器 切记 这种查询没有 SQL》提示符以及行号
建立一个子查询
简而言之 子查询可以让你把查询的结果与另一个查询绑定在一起 通用的语法格式
如下
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