友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第17部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
17 Joans Gas 25。1 Gas
9 Abes Cleaners 24。35 X…Tra Starch
20 Abes Cleaners 10。5 All Dry Clean
8 Cash 60 Trip to Boston
21 Cash 34 Trip to Dayton
30 Local Utilities 87。5 Water
31 Local Utilities 34 Sewer
25 Joans Gas 15。75 Gas
你会输入如下语句
INPUT/OUTPUT
SELECT SUM AMOUNT FROM CHECKS
SUM
1159。87
分析
这条语句返回了对 AMOUNT 列的合计结果 可是如果你想知道的是对每一个 PAYEE
花了多少钱时又该怎么办呢 使用 GROUP BY 语句可以帮助你 对本例它的使用方法如
下
INPUT/OUTPUT
SELECT PAYEE SUM AMOUNT FROM CHECKS GROUP BY PAYEE
PAYEE SUM
EMAIL wyhsillypig@163。 106
…………………………………………………………Page 107……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
Abes Cleaners 34。849998
Cash 119
Joans Gas 40。849998
Joes Stale Dent 150
Local Utilities 219。5
Ma Bell 350。33002
Reading R。R 。245。34
SELECT 子句有一个正常的列 之后是一个汇总函数 如果它的后边只有 FROM
CHECKS 子句的话 那么你将会看到
INPUT/OUTPUT
SELECT PAYEE SUM AMOUNT FROM CHECKS
Dynamic SQL Error
…SQL error code = …104
…invalid column reference
分析
该信息表明 SQL 无法把正常的列和汇总函数结合在一起 这时就需要 GROUP BY 子
句 它可以对 SELECT 的结果进行分组后在应用汇总函数 查询 SELECT * FROM CHECKS
返回了 14 行 而 SELECT PAYEE SUM AMOUNT FROM CHECKS GROUP BY
PAYEE 则把返回的 14 行分成了 7 组 然后对每组应用了汇总函数
INPUT/OUTPUT
SELECT PAYEE SUM AMOUNT COUNT PAYEE FROM CHECKS
GROUP BY PAYEE
PAYEE SUM COUNT
Abes Cleaners 34。849998 2
Cash 119 3
Joans Gas 40。849998 2
Joes Stale Dent 150 1
Local Utilities 219。5 3
Ma Bell 350。33002 2
Reading R。R 。245。34 1
分析
SQL 现在越来越变得有用了 在上一个例子中 我们只是应用 GROUP BY 对数据结
果进行了唯一的分组 注意结果是按 PAYEE 排序的 GROUP BY 也可以像 ORDER BY 那
EMAIL wyhsillypig@163。 107
…………………………………………………………Page 108……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
样工作 如果我们对多个列进行分组会有什么结果呢 请看
INPUT/OUTPUT
SELECT PAYEE SUM AMOUNT COUNT PAYEE FROM CHECKS
GROUP BY PAYEE REMARKS
PAYEE SUM COUNT
Abes Cleaners 10。5 1
Abes Cleaners 24。35 1
Cash 60 1
Cash 34 1
Cash 25 1
Joans Gas 40。849998 2
Joes Stale Dent 150 1
Local Utilities 98 1
Local Utilities 34 1
Local Utilities 87。5 1
Ma Bell 200。33 1
Ma Bell 150 1
Reading R。R 。245。34 1
分析
输出结果由原来的将 14 行分成 7 组变成了 13 组 为什么它会多出了这么多组呢 我
们来看一下
INPUT/OUTPUT
SELECT PAYEE REMARKS FROM CHECKS WHERE PAYEE Joans Gas
PAYEE REMARKS
Joans Gas Gas
Joans Gas Gas
分析
你可以看到这两个记录的内容是完全一样的 所以在运行 GROUP BY 以后把它们合并
成了一个记录 而其它行则是唯一的 所以合并以后仍然是唯一的
下例是对 REMARKS 进行分组并找出组中的最大值和最小值
INPUT/OUTPUT
SELECT MIN AMOUNT MAX AMOUNT FROM CHECKS GROUP BY
REMARKS
EMAIL wyhsillypig@163。 108
…………………………………………………………Page 109……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
MIN MAX
245。34 245。34
10。5 10。5
200。33 200。33
15。75 98
150 150
150 150
34 34
60 60
34 34
87。5 87。5
25 25
24。35 24。35
如果我们在分组时指定的列名与 SELECT 中所指定的列名不相同时会有什么情况发生
呢
INPUT/OUTPUT
SELECT PAYEE MAX AMOUNT MIN AMOUNT FROM CHECKS
GROUP BY REMARKS
Dynamic SQL Error
…SQL error code = …104
…invalid column reference
分析
查询无法对 REMARK 进行分组 当查询在 REMARK 字段中找到了两个重复的数值
但它们的 PAYEE 不同 这表明 GAS 有两个 PAYEE 这将会导致错误的产生
规则是 当要求分组结果返回多个数值时不能在在 SELECT 子句中使用除分组列以外
的列 这将会导致错误的返回值 你可以使用在 SELECT 中未列出的列进行分组 例如
INPUT/OUTPUT
SELECT PAYEE COUNT AMOUNT FROM CHECKS
GROUP BY PAYEE; AMOUNT;
PAYEE COUNT
Abes Cleaners 1
Abes Cleaners 1
Cash 1
EMAIL wyhsillypig@163。 109
…………………………………………………………Page 110……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
Cash 1
Cash 1
Joans Gas 1
Joans Gas 1
Joes Stale Dent 1
Local Utilities 1
Local Utilities 1
Local Utilities 1
Ma Bell 1
Ma Bell 1
Reading R。R 1
分析
这个愚蠢的查询显示的记录与你在表中输入的记录数一样多 这表明你可以在 GROUP
BY 中使用 AMOUNT 尽管在 SELECT 中没有提到过该字段 现在试着将 AMOUNT 字段
从 GROUN 部分移动到 SELECT 部分 如下例
SELECT PAYEE AMOUNT COUNT AMOUNT FROM CHECKS GROUP BY
PAYEE
Dynamic SQL Error
…SQL error code = …104
…invalid column reference
SQL 不能运行查询 因为在 SELECT 中出现的字段没有在 GROUP BY 中指出 所以我们
不得不采用下边的方法进行分组
INPUT/OUTPUT
SELECT PAYEE AMOUNT REMARKS FROM CHECKS WHERE PAYEE
Cash
PAYEE AMOUNT REMARKS
Cash 25 Wild Night Out
Cash 60 Trip to Boston
Cash 34 Trip to Dayton
如果你的用户要求你将这三行数据输出并按 PAYEE 进行分组的话 那么请问数据并不
重复的 REMARKS 字段的内容应该放在哪里 切记 当进行分组以后由于这三行数据是同
一组 所以结果只有一行 SQL 无法在同时为你做两种工作 所以它会说 Error #31 Can't
do two things at once。
EMAIL wyhsillypig@163。 110
…………………………………………………………Page 111……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
HAVING 子句
如何对你需要进行分组的数据进行限制呢 这里我们使用 ORGCHART 表 内容如下
INPUT
SELECT * FROM ORGCHART
OUTPUT
NAME TEAM SALARY SICKLEAVE ANNUALLEAVE
ADAMS RESEARCH 34000。00 34 12
WILKES MARKETING 31000。00 40 9
STOKES MARKETING 36000。00 20 19
MEZA COLLECTIONS 40000。00 30 27
MERRICK RESEARCH 45000。00 20 17
RICHARDSON MARKETING 42000。00 25 18
FURY COLLECTIONS 35000。00 22 14
PRECOURT PR 37500。00 24 24
如果你想对输出的结果进行分组并显示每一组的平均工资 你可以输入如下语句
INPUT/OUTPUT
SELECT TEAM AVG SALARY FROM ORGCHART GROUP BY TEAM
TEAM AVG
COLLECTIONS 37500。00
MARKETING 36333。33
PR 37500。00
RESEARCH 39500。00
下边的这条语句的目的是返回分组后平均工资低于 38000 的组
INPUT/OUTPUT
SELECT TEAM AVG SALARY FROM ORGCHART
WHERE AVG SALARY 38000 GROUP BY TEAM
Dynamic SQL Error
…SQL error code = …104
…Invalid aggregate reference
分析
EMAIL wyhsillypig@163。 111
…………………………………………………………Page 112……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
错误产生的原因是由于汇总函数不能工作在 WHERE 子句中 如果想要让这个查询工
作的话 我们需要一些新东西――HAVING 子句 输入下边的查询就会得到你想要的结果
了
INPUT/OUTPUT
SELECT TEAM AVG SALARY FROM ORGCHART GROUP BY TEAM
HAVING AVG SALARY 38000
TEAM AVG
COLLECTIONS 37500。00
MARKETING 36333。33
PR 37500。00
分析
HAVING 子句允许你将汇总函数作为条件 但是如果 HAVING 后边没有汇总函数时会
有什么结果呢 看下例
INPUT/OUTPUT
SELECT TEAM AVG SALARY FROM ORGCHART GROUP BY TEAM
HAVING SALARY 38000
TEAM AVG
PR 37500。00
分析
为什么这一次的结果与上一次的不同 子句 HAVING AVG(SALARY) 《 38000 是对每一
组的 SALARY 求平均数并将数值大于 38000 的组返回 正像你所想到的那样 HAVING
SALARY 《 38000 则是用另外一种处理方式 所以就会有不同的结果 根据 SQL 的解释规
则 如果用户要求对分组数据执行 HAVING SALARY 《 38000 它么它会对数据库中的每
个记录均进行检查 并且剔除 SALARY 大于 38000 的 这样的话就只有 PR 符合条件了
在其它组中都至少有一条 SALARY 大于 38000 的记录 并不是所有的解释器都执行这条
语句 ACCESS 就不能— — 译者
INPUT/OUTPUT
SELECT NAME TEAM SALARY FROM ORGCHART ORDER BY TEAM
NAME TEAM SALARY
FURY COLLECTIONS 35000。00
MEZA COLLECTIONS 40000。00
EMAIL wyhsillypig@163。 112
…………………………………………………………Page 113……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
WILKES MARKETING 31000。00
STOKES MARKETING 36000。00
RICHARDSON MARKETING 42000。00
PRECOURT PR 37500。00
ADAMS RESEARCH 34000。00
MERRICK RESEARCH 45000。00
分析
结果就是除了 PR 外所有的组都被剔除了 事实上你的要求是返回组中内容
SALARY
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!