SQL学习笔记(二)
四 对表进行聚合查询
4.1 聚合函数
- count:计算表中的记录数
- sum:计算表中数据的合计值
- avg:计算表中数据的平均值
- max:求出表中数据的最大值
- min:求出表中数据的最小值
ps: - count和sum函数都可以添加distinct关键字去重
- count(*)表示计算所有行(包括null行),count(具体的列)计算出的是那一列非null行的数量
- sum和avg函数作用的值都是非null值
4.2 对表进行分组
- 使用group by 子句可以像切蛋糕那样将表分割。通过使用聚合函数和group by子句,可以根据列将表分割后再进行汇总
- 聚合键中包含null时,在结果中会以不确定行(空行)的形式表现出来
- group by子句中指定的列称为聚合键或者分组列。决定了表的切分方式,可以用逗号分隔指定多列。
4.2.1 group by子句语法:
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……;
ps:
- 聚合函数只能写在select子句中
- group by子句中不能使用select子句中列的列名
- group by子句中的聚合结果是无序的
- where子句中不能使用聚合函数
4.2.2 与聚合函数和group by 子句有关的常见错误
- 在select子句中书写了多余的列
在使用聚合函数时,select子句只能存在以下三种元素
- 常数
- 聚合函数
- group by子句中�指定的列名
- 在group by子句中写了列的别名
因为select子句执行的比group by子句晚,group by子句执行的时候别名还有定义 - where子句中使用聚合函数
聚合函数只能存在于select子句和having子句(order by子句)中
4.3 为聚合结果指定条件
- 在使用count函数等对表中数据进行汇总操作时,为其指定条件的不是where子句,而是having子句
- 聚合函数可以在select子句,having子句和order by子句中使用
- having子句要写在group by子句后
- where子句用来指定数据行的条件,having子句用来指定分组的条件
4.3.1 having子句的语法
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……
HAVING <分组结果对应的条件>
4.3.2 having子句的构成要素
having子句和构成要素如下所示:
- 常数
- 聚合函数
- group by 子句中指定的列名
ps:having子句和where子句的比较
我们会发现有些条件既可以写在having子句中也可以写在where子句中。那么两者有什么区别呢?对于既可以写在having子句中又可以写在where子句中的条件,推荐的做法还是写在where子句里面,这样整个sql的性能会比较高。这和sql的执行顺序有关
4.4 对查询结果进行排序
我们可以使用order by子句对查询结果进行排序
order by可以使用多个列进行排序
排序中的null值,会在开头或者末尾进行汇总
order by可以使用select子句中未出现的列或者聚合函数
asc表示升序,desc表示降序
4.4.1 子句的书写顺序
到现在为止,sql子句基本上都出现了。我们来讲清楚他们的书写顺序,如下
- SELECT 子句 → 2. FROM 子句 → 3. WHERE 子句 → 4. GROUP BY 子句 →5. HAVING 子句 → 6. ORDER BY 子句
4.4.2 子句的执行顺序
- 开始->2. FROM子句->3. WHERE子句->4. GROUP BY子句->5. HAVING子句->6. ORDER BY子句->7. SELECT子句->8. LIMIT子句->最终结果