按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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