SQL——聚合与排序
- 对表进行聚合查询
what:
聚合,将多行汇总成一行,输入多行输出一行;用于汇总的函数,称为聚合函数
输入值称为参数papameter,输出值称为返回值
如:
COUNT:计算表中记录数(行数)
SUM:计算表中数值列中数据的合计值
AVG:计算表中数值列中数据的平均值
MAX:求出表中数值列中数据的最大值
MIX:求出表中数值列中数据的最小值
COUNT:
SELECT COUNT(*) FROM 表名;//计算表中全部数据的行数,会得到包含空行NULL的总行数
//注意其他函数不能将*作为输入参数,仅COUNT可以
SELECT COUNT(列名) FROM 表名;//想要得到指定列的非空行数
SUM:只适用于数值类型的列
SELECT SUM(列名) FROM 表名;//计算时会把NULL自动排除在外
AVG:只适用于数值类型的列
SELECT AVG(列名) FROM 表名;//计算时会事先删除NULL,因此分母不会包含
MAX,MIN:几乎适用于所有数据类型的列,如,日期,字符串
SELECT MAX(列名) ,MIN(列名)FROM 表名;
DISTINCT:对聚合函数删除重复行
SELECT COUNT(DISTINCT 列名) FROM 表名;
//此时DISTINCT必须写在括号中,因为要在计算之前先删除重复行
//如果写在括号外,会先计算,再去删除重复行
- 对表进行分组GROUP BY
先分组再分组进行汇总处理,
GROUP BY子句只能写在SELECT子句之中,要在FROM之后,有WHERE则在WHERE之后
SELECT→FROM→WHERE→GROUP BY:
执行顺序,先FROM选中数据表,再进行WHERE条件筛选,筛选结束再进行GROUP BY分组,最后用SELECT语句进行指定的提取显示呈现
SELECT 列名1,列名2......
FROM 表名
GROUP BY 列名1,列名2......//在GROUP BY子句中指定的列称为聚合键或分组列,决定表的切分方式
当指定列中包含NULL时,会将NULL作为一组特定数据进行划分分组
注:
SELECT中的列名,而GROUP BY没有,则会发生错误
GROUP BY指定列不能用别名
GRUOP BY不能使用聚合函数,如
WHERE COUNT(*)=2
//这样的写法会发生错误,
//只有SELECT子句和HAVING子句,以及ODER BY子句中能使用聚合函数
- 为聚合结果指定条件
HAVING子句:
对表中数据进行汇总操作,得到分组结果后通过指定条件来选取特定组
SELECT 列名1,列名2......
FROM 表名
GROUP BY 列名1,列名2......
HAVING 分组结果对应的条件(常数,聚合函数,GROUP BY指定的列名)
//必须在GROUP BY语句之后,因为HAVING的执行顺序是比GROUP BY靠后
注:WHERE与HAVING
WHERE,指定行对应的条件,处理速度更快
排序前先过滤,减少了需要排序的数据量
HAVING,指定组对应的条件
排序后才对数据进行分组
- 对查询结果进行排序
SELECT出的结果是随机排序的,
需要通过在SELECT语句末尾添加ORDER BY子句来明确指定排列顺序:
SELECT 列名1,列名2......
FROM 表名
ORDER BY 排序基准1,排序基准2 ASC/DESC......//此时在这里书写的列名为排序键
//省略ORDER BY 后面的关键字时会默认使用升序排列
-
多个排序键:
ASC DESC都是以列为单位指定的,因此可以同时指定一个列升序,其他列降序
也可以指定多个排序键,规则是优先使用左边的键,如果该列存在相同值,再接着参考右侧的键进行排序。 -
NULL的排序:
不能对NULL使用比较运算符,因此,含有NULL的列作为排序键时,NULL会在结果的开头或末尾汇总显示。 -
使用别名:
ORDER BY允许使用别名 -
执行顺序:
FROM→WHERE→GROUOP BY→HAVING→SELECT→ORDER BY -
可以用的排序键:
存在于表中,但没有进行SELECT的列,以及聚合函数