排序函数、高级分组函数以及集合操作
排序函数
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需要自己实现。