tips: 本文针对小白(*^_^*)
1. sql语句中 Group By , Having, Where ,Order by执行顺序
简单的了解 sql语句中 Group By , Having, Where ,Order by执行顺序 的话,可以参考下面的博客:
https://blog.youkuaiyun.com/lc11535/article/details/102492172
2. 深入理解Group By , Having, Where ,Order by的执行顺序
Question:如果想进行分组,并且对组内的数据排序;虽然只能得到组内的一行数据,如何得到分组后想得到的那一行数据;并且对分组后的数据进行排序
栗子:
对ACT_RE_PROCDEF表按照KEY_字段分组,每个分组得到最大的VERSION_ 行
错误做法:
reason:简单的认为 order by 会对 group by 中 分组的 数据进行排序
select ID_,VERSION_,KEY_ from ACT_RE_PROCDEF group by KEY_ order by VERSION_ desc;
reason:简单的认为所有数据有序后,再分组,再排序就 可以组内有序, 或者得到组中最大、最小的行
select * from (select ID_,VERSION_,KEY_ from ACT_RE_PROCDEF order by VERSION_ desc)
new_proc group by KEY_ order by VERSION_ desc;
正确做法:
select max(VERSION_) maxv,KEY_,VERSION_ from ACT_RE_PROCDEF group by KEY_ order by VERSION_;
真正的执行顺序:
1. from ACT_RE_PROCDEF group by KEY_
首先对表中的数据分组
2. select max(VERSION_) maxv,KEY_,VERSION_
选择每组数据中最大的 VERSION_ 的行作为 组的行 select 出来 显示 (只显示一行)
1,2步骤的SQL:
select max(VERSION_),KEY_,VERSION_ from ACT_RE_PROCDEF group by KEY_;
3. order by VERSION_
将 每组中 显示出来的 一行数据 进行排序,也就是对1,2步骤之后的数据排序
这样也是可以的,但是只有 order by 后边才可以跟 "别名"(alias)
select max(VERSION_) maxv,KEY_,VERSION_ from ACT_RE_PROCDEF group by KEY_ order by maxv;
Conclusion:关键还是分组函数运用,如max(),分组函数可以统计数据,也可以将分组中最大、最小的行挑选出来
分组函数表如下:
函数名称 | 功能 |
---|---|
AVG() | 返回参数的平均值 |
BIT_AND() | 按位返回AND |
BIT_OR() | 按位返回OR |
BIT_XOR() | 返回按位异或 |
COUNT() | 返回返回的行数的计数 |
COUNT(DISTINCT) | 返回多个不同值的计数 |
GROUP_CONCAT() | 返回串联的字符串 |
JSON_ARRAYAGG() | 将结果集作为单个JSON数组返回 |
JSON_OBJECTAGG() | 将结果集作为单个JSON对象返回 |
MAX() | 返回最大值 |
MIN() | 返回最小值 |
STD() | 返回人口标准差 |
STDDEV() | 返回人口标准差 |
STDDEV_POP() | 返回人口标准差 |
STDDEV_SAMP() | 返回样品标准偏差 |
SUM() | 返回总和 |
VAR_POP() | 返回总体标准方差 |
VAR_SAMP() | 返回样本方差 |
VARIANCE() | 返回总体标准方差 |