SQL 21日自学通(V3.0)(PDF格式)-第25部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 * FRO