SQL学习笔记(二)

四 对表进行聚合查询

4.1 聚合函数

  1. count:计算表中的记录数
  2. sum:计算表中数据的合计值
  3. avg:计算表中数据的平均值
  4. max:求出表中数据的最大值
  5. min:求出表中数据的最小值
    ps:
  6. count和sum函数都可以添加distinct关键字去重
  7. count(*)表示计算所有行(包括null行),count(具体的列)计算出的是那一列非null行的数量
  8. 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:

  1. 聚合函数只能写在select子句中
  2. group by子句中不能使用select子句中列的列名
  3. group by子句中的聚合结果是无序的
  4. where子句中不能使用聚合函数

4.2.2 与聚合函数和group by 子句有关的常见错误

  • 在select子句中书写了多余的列
    在使用聚合函数时,select子句只能存在以下三种元素
  1. 常数
  2. 聚合函数
  3. group by子句中�指定的列名
  • 在group by子句中写了列的别名
    因为select子句执行的比group by子句晚,group by子句执行的时候别名还有定义
  • where子句中使用聚合函数
    聚合函数只能存在于select子句和having子句(order by子句)中

4.3 为聚合结果指定条件

  1. 在使用count函数等对表中数据进行汇总操作时,为其指定条件的不是where子句,而是having子句
  2. 聚合函数可以在select子句,having子句和order by子句中使用
  3. having子句要写在group by子句后
  4. where子句用来指定数据行的条件,having子句用来指定分组的条件

4.3.1 having子句的语法

SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……
HAVING <分组结果对应的条件>

4.3.2 having子句的构成要素

having子句和构成要素如下所示:

  1. 常数
  2. 聚合函数
  3. 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子句基本上都出现了。我们来讲清楚他们的书写顺序,如下

  1. SELECT 子句 → 2. FROM 子句 → 3. WHERE 子句 → 4. GROUP BY 子句 →5. HAVING 子句 → 6. ORDER BY 子句

4.4.2 子句的执行顺序

  1. 开始->2. FROM子句->3. WHERE子句->4. GROUP BY子句->5. HAVING子句->6. ORDER BY子句->7. SELECT子句->8. LIMIT子句->最终结果