7、高級查詢
7.1:UNION ALL:返回查詢檢索出的所有行,包括重複的行
7.2:UNION:返回查詢檢索出的所有非重複行。
7.3:INTERSECT:返回查詢檢查出來的共有行。
7.4:MINUS:返回將第二個查詢檢索出的行從第一個查詢檢索出的行中減去之後剩餘的行。
7.5:GROUP BY 之ROLLUP,可以爲每個分組返回小計記錄以及爲所有分組返回總計記錄。
eg:
select divid,sum(salary) from employee group by divid order by divid;
DIV SUM(SALARY)
---- ----------
bus 1610000
ope 1320000
sal 4936000
sup 1015000
向ROLLUP傳遞一列
eg:
select divid,sum(salary) from employee group by rollup(divid) order by divid;
DIV SUM(SALARY)
---- ----------
bus 1610000
ope 1320000
sal 4936000
sup 1015000
8881000
向ROLLUP傳遞多列
eg:
select divid,jobid,sum(salary) from employee group by rollup(divid,jobid) order by divid,jobid;
DIV JOB SUM(SALARY)
----- ------ -------------------
BUS MGR 530000
BUS PRE 800000
BUS WOR 180000
BUS 1610000
OPE ENG 240000
OPE MGR 805000
OPE WOR 270000
OPE 1320000
SAL MGR 4446000
SAL WOR 490000
SAL 1936000
SUP MGR 465000
SUP TEC 115000
SUP WOR 435000
SUP 1015000
8881000
修改傳遞給ROLLUP的列的位置,則會得到以jobid爲準的一組數字統計
7.6:GROUP BY 之CUBE,返回CUBE中所有列組合的小計信息,同時在最後顯示總計信息
7.7:GROUPING函數
GROUPING函數可以接受一列,返回0或者1,如果列值爲空,那麼GROUPING()返回1;如果列值非空,則返回0,GROUPING()只能在使用ROLLUP或CUBE的查詢中使用
7.8:GROUPING SETS子句
使用GROUPING SETS子句可以只返回小計記錄.
eg:
select divid,jobid,sum(salary) from employee group by GROUPING SETS(divid,jobid) order by divid,jobid;
DIV JOB SUM(SALARY)
------ ------- ---------------------
BUS 1610000
OPE 1320000
SAL 4936000
SUP 1015000
ENG 245000
MGR 6246000
PRE 800000
TEC 115000
WOR 1475000
GROUPING SETS子句的性能一般比CUBE好,因此,應該儘可能使用GROUPING SETS,少使用CUBE..
7.9:GROUPING_ID函數
GROUPING位向量
divid jobid 位向量 grouping_id返回值
非空 非空 00 0
非空 空 01 1
空 非空 10 2
空 空 11 3
/** 位向量是2進制,grouping_id是10進制 */
GROUPING_ID()用武之地在於使用HAVING子句過濾記錄,HAVING子句可以將不包含小計或總計的記錄除去,這隻要簡單的檢查grouping_id()的返回值,看其大於0就可以實現
select divid,jobid,grouping_id(divid,jobid) grpId,sum(salary) from employee group by cube(divid,jobid) having grouping_id(divid,jobid) > 0 order by divid,jobid;
8.0:在GROUP_ID函數
GROUP_ID函數可用於消除GROUP BY子句返回重複記錄,GROUP_ID()不接受任何參數,如果某個特定的分組重複出現N次,那麼GROUP_ID返回0到N-1之間的一個整數
如果出現兩次,那麼GROUP_ID()函數等於1
去重
eg:
select divid,jobid,group_id(),sum(salary) from employee group by divid,rollup(divid,jobid) having group_id = 0;