Java知识点整理

排序函数、高级分组函数以及集合操作

2018-01-18  本文已影响0人  程序员必修课

排序函数

ROW_NUMBER

ROW_NUMBER() OVER(
PARTITION BY col1 ORDER BY col2);
表示根据col1分组,在分组内部根据col2排序;
此函数计算的值就表示每组内排序后的顺序编号,组内连续且唯一;
Rownum是伪列,ROW_NUMBER功能更强,可以直接从结果集中取出子集。

ROW_NUMBER组内连续且唯一;

RANK

RANK() OVER(
PARTITION BY col1 ORDER BY col2);
表示根据col1分组,在分组内部根据col2给予等级标识;
等级标识即排名,相同的数据返回相同排名,和ROW_NUMBER的区别是有重复值,而ROW_NUMBER没有;
RANK组内相同值返回一致,不同值有跳跃。

DENSE_RANK

DENSE_RANK() OVER(
PARTITION BY col1 ORDER BY col2)
与RANK的区别在于不跳跃了。

高级分组函数

高级分组函数通常是用于统计。
ROLUJP、CUBE和GROUPING SETS运算符是 GROUP BY子句的扩展。

可使用UNION ALL来组合单个分组査询时相同的结果集,用来简化和高效 的实现统计查询。

ROLLUP

ROLLUP是把几组不同的分组的结果合在一起;
先按照a,b,c分组一次,查询结果再依次减去一个列,进行分组,顺序为:
1:abc,2:ab,3:a,4:整张表为1组。分n+1次

MySQL采用的是WITH ROLLUP语句,注意的是,oracle可以使用ORDER BY进行排序,而MySQl不能再用ORDER BY语句了,它会自动排序,但是顺序不满意的话就只能在程序中解决。

CUBE

GROUP BY CUBE(a, b, c)
对cube的每个参数,都可以理解为取值为参与分组和不参与分组两个值的一个维度,所有维度取值组合的集合就是分组后的集合
对于n个参数的cube ,有2^n次分组
GROUP BY CUBE(a,b,c),首先对(a,b,c)进行GROUP BY,
然后依次是(a,b), (a,c), (a), (b,c), (b), (c),最后对
全表进行GROUP BY操作,一共是2八3=8次分组;

MySQL暂时只定义了CUBE,还不能支持CUBE操作。

GROUPING SETS

如果不需要获得由完备的ROLLUP或CUBE运算符生成的全部分组,则可以使用GROUPING SETS仅指定所需的分组;
GROUPING SETS列表可以包含重复的分组。

集合操作

为了合并多个SELECT语句的结果,可以使用集合操作符,实现集合的并、交、差;
集合操作符包括UNION、UNION ALL、INTERSECT、MINUS;
多条作集合操作的SELECT语句的列的个数和数据类型必须匹配。
INTERSECT、MINUS仅ORACLE才有,MySQL需要自己实现。

上一篇 下一篇

猜你喜欢

热点阅读