rollup(a[,b,...])的邏輯
先記一下,看完課程再想。
代碼如下:
SQL> select deptno,avg(sal) from emp group by rollup(deptno);
DEPTNO? ?AVG(SAL)
------ ----------
? ? 10 2916.66666
? ? 20? ? ? ?2175
? ? 30 1566.66666
? ? ? ?2073.21428
SQL> select deptno,empno,avg(sal) from emp group by rollup(deptno,empno);
DEPTNO EMPNO? ?AVG(SAL)
------ ----- ----------
? ? 10? 7782? ? ? ?2450
? ? 10? 7839? ? ? ?5000
? ? 10? 7934? ? ? ?1300
? ? 10? ? ? ?2916.66666
? ? 20? 7369? ? ? ? 800
? ? 20? 7566? ? ? ?2975
? ? 20? 7788? ? ? ?3000
? ? 20? 7876? ? ? ?1100
? ? 20? 7902? ? ? ?3000
? ? 20? ? ? ? ? ? ?2175
? ? 30? 7900? ? ? ? 950
? ? ? ? ? ? ? ? ? ? ? ? ?.........
? ? ? ? ? ? ?2073.21428
18 rows selected
SQL> select deptno,empno,job,avg(sal) from emp group by rollup(deptno,empno,job);
DEPTNO EMPNO JOB? ? ? ? ?AVG(SAL)
------ ----- --------- ----------
? ? 10? 7782 MANAGER? ? ? ? ?2450
? ? 10? 7782? ? ? ? ? ? ? ? ? ? ? ? ? ? 2450
? ? 10? 7839 PRESIDENT? ? ? ?5000
? ? 10? 7839? ? ? ? ? ? ? ? ? ? ? ? ? 5000
? ? 10? 7934 CLERK? ? ? ? ? ? ? 1300
? ? 10? 7934? ? ? ? ? ? ? ? ? ? ? ? ?1300
? ? 10? ? ? ? ? ? ? ? ? ? ? ? ? 2916.66666
? ? 20? 7369 CLERK? ? ? ? ? ? ?800
????????????????????????????????.........
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2073.21428
??
32 rows selected
按上面的規(guī)則:
用第三條語句的口語化說明:
select deptno,empno,job,avg(sal) from emp group by rollup(deptno,empno,job);
它的排序規(guī)則是用 第一個字段deptno 排序的
查出第一條數(shù)據(jù)之后,【如果select_list有分組函數(shù),分組函數(shù)這一列就顯示對應的數(shù)據(jù)的值(不是分組函數(shù)的值),】如果相同的deptno和empno有不同于第一條的job,有就繼續(xù)走下去。
走完就返回到deptno,empno這一層 (不懂,這行的值怎么算的)
接著看有沒有不同于上面查詢出來的job,有的話重復上面步驟,沒有的走到deptno,(這一行做分組函數(shù)這一列顯示分組函數(shù)的值,為什么,是因為它是rollup函數(shù)或者select_list的第一個元素?,感覺要寫一個表看看)
接著就用新的empno繼續(xù)走,用上面的規(guī)則繼續(xù)走,直到所有分組都走完,最后顯示sum(sal);
2019-01-08
abcdefg