1. 程式人生 > >有關group by;

有關group by;

並不是 劃分 表達 avi 最小 tin select tno 執行過程

作為一個ORACLE數據庫初學者,基本上都會經歷的一個階段,讓人看到就想要吐的練習題,第一波,第二波,第三波......第n波

現在在網上也可以找到諸多波的答案,可是,我想說的是,復制答案,解決不了問題,不如大家來學會方法。在做題過程中,經常會遇到的一些問題:

不是group by 表達式;

非正常結束語句;

單行子查詢返回多行;

等等.....諸多。

所以在這裏給大家分享一些可以盡量避免這些問題的‘基礎知識’。


分組函數概述
分組函數是對數據行的集合進行操作並按組給出一個結果,這個結果可直接輸出,或者用來做判斷條件
分組函數的使用SELECT [column,] group_function(column)
FROM table
[WHERE condition]
[GROUP BY column]
[HAVING group_function(column)expression
[ORDER BY column|group_function(column)expression]
分組函數
MIN函數和MAX函數
MIN([DISTINCT|ALL] column|expression):返回每組中的最小值
MAX([DISTINCT|ALL] column|expression):返回每組中的最大值
MIN和MAX函數可以用於任何數據類型-- 查詢入職日期最早和最晚的日期
SELECT MIN(hiredate),MAX(hiredate)
FROM emp
SUM函數和AVG函數
SUM([DISTINCT|ALL] column|expression):返回每組的總和
AVG([DISTINCT|ALL] column|expression):返回每組的平均值
SUM和AVG函數只能夠對數值類型的列或表達式操作-- 查詢職位以SALES開頭的所有員工的平均工資、工資和
SELECT AVG(sal),SUM(sal)
FROM emp
WHERE job LIKE ‘SALES%‘
COUNT函數
COUNT(*):返回表中滿足條件的行記錄數-- 查詢部門30有多少個員工
SELECT COUNT(*)
FROM emp
WHERE deptno=30
COUNT([DISTINCT|ALL] column|expression):返回表中滿足條件的非空行記錄數-- 查詢部門30有多少個員工領取獎金
SELECT COUNT(comm)
FROM emp
WHERE deptno=30
分組函數中的DISTINCT
DISTINCT會消除重復記錄後再使用組函數-- 查詢有員工的部門數量
SELECT COUNT(DISTINCT deptno)
FROM emp
分組函數中的空值處理
除了COUNT(*)之外,其他所有分組函數都會忽略列表中的空值,然後再進行計算-- 查詢獎金的平均值
SELECT AVG(comm)
FROM emp
在分組函數中使用NVL函數可以使分組函數強制包含含有空值的記錄-- 查詢所有員工領取到的獎金的平均值
SELECT AVG(NVL(comm,0))
FROM emp
GROUP BY子句
創建數據組
使用GROUP BY子句可將表中滿足WHERE條件的記錄按照指定的列劃分成若幹個小組,其中GROUP BY子句指定要分組的列-- 用GROUP BY子句創建數據組
SELECT column,group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column]
使用GROUP BY子句
在SELECT列表中除了分組函數那些項,所有列都必須包含在GROUP BY子句中SELECT deptno,AVG(sal)
FROM emp
GROUP BY deptno
GROUP BY所指定的列並不是必須出現在SELECT列表中SELECT AVG(sal)
FROM emp
GROUP BY deptno
按多列分組的GROUP BY子句SELECT deptno,job,SUM(sal)
FROM emp
GROUP BY deptno,job
HAVING子句
?不能在WHERE子句中限制組,要在HAVING子句中對數據組進行限制-- 用HAVNG子句限制數據組
SELECT column,group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column]
使用HAVING子句限制數據組SELECT deptno,MAX(sal)
FROM emp
GROUP BY deptno
HAVING MAX(sal)>2900
SELECT語句執行過程
1.通過FROM子句中找到需要查詢的表
2.通過WHERE子句進行非分組函數篩選判斷
3.通過GROUP BY子句完成分組操作
4.通過HAVING子句完成組函數篩選操作
5.通過SELECT子句選擇顯示的列或表達式及組函數
6.通過ORDER BY子句進行排序操作
組函數的嵌套
與單行函數不同,組函數只能嵌套兩層SELECT MAX(AVG(sal))
FROM emp
GROUP BY deptno

還有什麽問題的話可以到這裏來留言,我們一起來探究問題奧!

有關group by;