友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第20部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
现在回要原来的表中 我们已经对联合进行了充分的准备 可以用它来完成一些实际
的工作了 找一下我们卖 road bikes 共卖了多少钱
INPUT/OUTPUT
SELECT SUM O。QUANTITY * P。PRICE TOTAL FROM ORDERS O; PART P
WHERE O。PARTNUM = P。PARTNUM AND P。DESCRIPTION = 'ROAD BIKE'
TOTAL
19610。00
在这种设置中 销售人员可以保证 ORDERS 表的更新 生产部门则可以保持 PART 表
的更新 而你则无需对数据库的底层进行重新设计
注 注意在 SQL 语句中表以及列的别名的使用 你可能会因为别名多按了许多许多个按键
但是它可以让你的语句更具有可读性
我们可以对更多的表进行联合吗 例如 我们需要生成发票所要的信息 可以这样写
INPUT/OUTPUT
SELECT C。NAME C。ADDRESS O。QUANTITY * P。PRICE TOTAL
FROM ORDER O PART P CUSTOMER C
WHERE O。PARTNUM = P。PARTNUM AND O。NAME = C。NAME
NAME ADDRESS TOTAL
TRUE WHEEL 55O HUSKER 1200。00
BIKE SPEC CPT SHRIVE 2400。00
128
…………………………………………………………Page 129……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
LE SHOPPE HOMETOWN 3600。00
AAA BIKE 10 OLDTOWN 1200。00
TRUE WHEEL 55O HUSKER 2102。70
BIKE SPEC CPT SHRIVE 2803。60
TRUE WHEEL 55O HUSKER 196。00
AAA BIKE 10 OLDTOWN 213。50
BIKE SPEC CPT SHRIVE 542。50
TRUE WHEEL 55O HUSKER 1590。00
BIKE SPEC CPT SHRIVE 5830。00
JACKS BIKE 24 EGLIN 7420。00
LE SHOPPE HOMETOWN 2650。00
AAA BIKE 10 OLDTOWN 2120。00
把语句写成如下格式会更具有可读性
INPUT/OUTPUT
SELECT C。NAME C。ADDRESS O。QUANTITY * P。PRICE TOTAL
FROM ORDERS O PART P CUSTOMER C
WHERE O。PARTNUM = P。PARTNUM
AND O。NAME = C。NAME ORDER BY C。NAME
NAME ADDRESS TOTAL
AAA BIKE 10 OLDTOWN 213。50
AAA BIKE 10 OLDTOWN 2120。00
AAA BIKE 10 OLDTOWN 1200。00
BIKE SPEC CPT SHRIVE 542。50
BIKE SPEC CPT SHRIVE 2803。60
BIKE SPEC CPT SHRIVE 5830。00
BIKE SPEC CPT SHRIVE 2400。00
JACKS BIKE 24 EGLIN 7420。00
LE SHOPPE HOMETOWN 2650。00
LE SHOPPE HOMETOWN 3600。00
TRUE WHEEL 55O HUSKER 196。00
TRUE WHEEL 55O HUSKER 2102。70
TRUE WHEEL 55O HUSKER 1590。00
TRUE WHEEL 55O HUSKER 1200。00
注 注意当将三个表进行联合的时候 ORDERS PART CUSTOMER ORDERS 表
129
…………………………………………………………Page 130……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
被使用了两次 而其它的表只使用了一次 通常 根据给定的条件返回行数最少的表会作
为驱动表— — 也就是基表 在查询中除基表以外的其它表通常是向基表联合以便更有效地
获得数据 所以 在本例中 ORDERS 表是基表 在大多数的数据库中只有很少的几个基表
直接或间接地 与其它的所有表联合 见第 15 天 高性能的 SQL 语句流 for more on
base tables 。
在下边的使用中我们通过使用 DESCRIPTION 列来使上述的查询更精确 因而也就更
有效
INPUT/OUTPUT
SELECT C。NAME C。ADDRESS O。QUANTITY * P。PRICE TOTAL P。DESCRIPTION
FROM ORDERS O PART P CUSTOMER C
WHERE O。PARTNUM=P。PARTNUM AND O。NAME = C。NAME ORDER BY C。NAME
NAME ADDRESS TOTAL DESCRIPTION
AAA BIKE 10 OLDTOWN 213。50 TIRES
AAA BIKE 10 OLDTOWN 2120。00 ROAD BIKE
AAA BIKE 10 OLDTOWN 1200。00 TANDEM
BIKE SPEC CPT SHRIVE 542。50 PEDALS
BIKE SPEC CPT SHRIVE 2803。60 MOUNTAIN BIKE
BIKE SPEC CPT SHRIVE 5830。00 ROAD BIKE
BIKE SPEC CPT SHRIVE 2400。00 TANDEM
JACKS BIKE 24 EGLIN 7420。00 ROAD BIKE
LE SHOPPE HOMETOWN 2650。00 ROAD BIKE
LE SHOPPE HOMETOWN 3600。00 TANDEM
TRUE WHEEL 55O HUSKER 196。00 SEATS
TRUE WHEEL 55O HUSKER 2102。70 MOUNTAIN BIKE
TRUE WHEEL 55O HUSKER 1590。00 ROAD BIKE
TRUE WHEEL 55O HUSKER 1200。00 TANDEM
分析
这是三个表联合后的结果 我们可以所得到的信息来开发票了
注 在今天的开始 SQL 曾经联合过 TABEL1 和 TABEL2 并生成了一个新表有 X(TABLE1
的行数) Y(TABLE2 的行数)列 联合并没有生成确实存在的表格 但它生成了一个虚
拟的表格 对两个表联合 包括自我联合 后会根据 WHERE 所指定的条件生成一个
新的集合 SELECT 语句减少了显示的列数 但是 WHERE 语句仍然把所有的列全返
回了 在今天的例子中我们的表中只有为数不多的几列 而现实生活中的数据可能会
130
…………………………………………………………Page 131……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
有成千上万列 如果你所使用的平台足够快 那么多表联合可能对系统的性能没有影
响 可是如果你工作在一个比较慢的平台上 联合可能会导致死机
不等值联合
既然 SQL 支持等值联合 你也许会推想它也支持不等值联合 你猜对了 等值联合是
在 WHERE 子句中使用等号 而不等值联合则是在 WHERE 子句中使用除了等号以外的其
它比较运算符 现下例
INPUT
SELECT O。NAME O。PARTNUM P。PARTNUM O。QUANTITY * P。PRICE TOTAL
FROM ORDERS O PART P WHERE O。PARTNUM 》 P。PARTNUM
OUTPUT
NAME PARTNUM PARTNUM TOTAL
TRUE WHEEL 76 54 162。75
BIKE SPEC 76 54 596。75
LE SHOPPE 76 54 271。25
AAA BIKE 76 54 217。00
JACKS BIKE 76 54 759。50
TRUE WHEEL 76 42 73。50
BIKE SPEC 54 42 245。00
BIKE SPEC 76 42 269。50
LE SHOPPE 76 42 122。50
AAA BIKE 76 42 98。00
AAA BIKE 46 42 343。00
JACKS BIKE 76 42 343。00
TRUE WHEEL 76 46 45。75
BIKE SPEC 54 46 152。50
BIKE SPEC 76 46 167。75
LE SHOPPE 76 46 76。25
AAA BIKE 76 46 61。00
JACKS BIKE 76 46 213。50
TRUE WHEEL 76 23 1051。35
TRUE WHEEL 42 23 2803。60
分析
上边的表给出了满足条件 WHERE O。PARTNUM 》 P。PARTNUM 的所有联合内容 结合
131
…………………………………………………………Page 132……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
你上边的自行车行的例子 这些信息似乎没有太多的意义 在现实世界中等值联合的使用
要远远多于不等值联合 但是你的编程时可能会遇到使用不等值联合的情况
外部联合与内部联合
就像不等值联合与等值联合相对应一样 外部联合是与内部联合相对应的 内部联合
是指与个表内的行与本表内的数据相互进行联合 产生的结果行数取决于参加联合的行数
也就是说内部联合的行数取决于 WHERE 子句的结果 外部联合则是表间的联合 如上例
中的 ORDERS 表与 PART 表的联合 内部联合的例子如下
INPUT
SELECT P。PARTNUM P。DESCRIPTION P。PRICE O。NAME O。PARTNUM
FROM PART P JOIN ORDERS O ON ORDERS。PARTNUM = 54
OUTPUT
PARTNUM DESCRIPTION PRICE NAME PARTNUM
54 PEDALS 54。25 BIKESPEC 54
42 SEATS 24。50 BIKESPEC 54
46 TIRES 15。25 BIKESPEC 54
23 MOUNTAIN BIKE 350。45 BIKESPEC 54
76 ROAD BIKE 530。00 BIKESPEC 54
10 TANDEM 1200。00 BIKESPEC 54
注 在这里你使用的语法中的 JOIN ON 不是 ANSI 标准中所指定的 而是我们所使用的解
释器的附加语法 你可以用它来指明是内部联合还是外部联合 大多数解释器对些都进行
了类似的扩充 注意这种类型的联合没有 WHERE 子句
分析
结果表明 PART 表中的所有的行都与 PARTNUM 为 54 的行进行了组合 再来看一个
外部右联合的例子
INPUT/OUTPUT
SELECT P。PARTNUM P。DESCRIPTION P。PRICE O。NAME O。PARTNUM FROM PART P
RIGHT OUTER JOIN ORDERS O ON ORDERS。PARTNUM = 54
PARTNUM DESCRIPTION PRICE NAME PARTNUM
132
…………………………………………………………Page 133……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
PARTNUM DESCRIPTION PRICE NAME PARTNUM
TRUE WHEEL 23
TRUE WHEEL 76
TRUE WHEEL 10
TRUE WHEEL 42
54 PEDALS 54。25 BIKE SPEC 54
42 SEATS 24。50 BIKE SPEC 54
46 TIRES 15。25 BIKE SPEC 54
23 MOUNTAIN BIKE 350。45 BIKE SPEC 54
76 ROAD BIKE 530。00 BIKE SPEC 54
10 TANDEM 1200。00 BIKE SPEC 54
BIKE SPEC 10
BIKE SPEC 23
BIKE SPEC 76
LE SHOPPE 76
LE SHOPPE 10
AAA BIKE 10
AAA BIKE 76
AAA BIKE 46
JACKS BIKE 76
分析
这是一种新型的查询 这里我们第一次使用了 RIGHT OUTER JOIN 它会令 SQL 返
回右边表集内的全部记录 如果当 ORDERS。PARTNUM54 则补以空值 下边是一个左
联合的例子
INPUT/OUTPUT:
SELECT P。PARTNUM P。DESCRIPTION P。PRICE O。NAME O。PARTNUM
FROM PART P LEFT OUTER JOIN ORDERS O ON ORDERS。PARTNUM = 54
PARTNUM DESCRIPTION PRICE NAME PARTNUM
54 PEDALS 54。25 BIKE SPEC 54
42 SEATS 24。50 BIKE SPEC 54
46 TIRES 15。25 BIKE SPEC 54
23 MOUNTAIN BIKE 350。45 BIKE SPEC 54
76 ROAD BIKE 530。00 BIKE SPEC 54
10 TANDEM 1200。00 BIKE SPEC 54
分析
133
…………………………………………………………Page 134……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
与内部联合的结果一样 都是六行 因为你使用的是左联合 PART 表决定返回的行
数 而 PART 表比 ORDERS 表小 所以 SQL 把其余的行数都扔掉了
不要对内部联合和外部联合操太多的心 大多数的 SQL 产品会判断应该在你的查询中
使用哪一种联合 事实上 如果你在过程中使用它 或在程序内使用这 包括存储过程和
将在第 13 天提到的 高级 SQL 使用 你无需指明联合类型 解释器会为你选择合适的
语法形式 如果你指明的联合类型 解释器会用你指明的类型来代替优化的类型
在一些解释器中使用+号来代替外部联合 +号的意思就是— — 显示我的全部内容包括
不匹配的内容 语法如下
SYNTAX
SQL》 select e。name e。employee_id ep。salary ep。marital_status from e;ployee_tbl e;
employee_pay_tbl ep
where e。employee_id = ep。employee_id(+) and e。name like '%MITH'
分析
这条语句将会联合两个表 标有+号的 employee_id 将会全部显示 包括不满足条件的
记录
表的自我联合
今天的最后一个内容是经常使用的自我联合 它的语法与联合两个表的语法相似 例
如 表 1 的自我联合可以写成如下格式
INPUT
SELECT * FROM TABLE1 TABLE1
OUTPUT
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!