基本语法

1
2
3
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;

group by 意思就是通过什么分组,就是把某个字段A相同的值分成一个组。但是分组之后,变成了一行,字段A大家都一样,其他字段可能都不一样,零零散散的。这个时候,就需要用到聚合函数,将这些零散的数据算出一个结果。

1
2
3
4
5
6
7
-- 没分组:查出所有明细
SELECT score FROM exam; -- 返回 100行

-- 分组后:每个学生只占一行
SELECT student_id, AVG(score)
FROM exam
GROUP BY student_id; -- 返回 10行(10个学生)

执行顺序

有关group by的sql执行顺序是:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

需要注意的是:

  • WHERE 在分组前执行,过滤的是原始行(里面可以用普通字段,不能用聚合函数)。
  • HAVING 在分组后执行,过滤的是组(里面必须用聚合函数)。
  • select 中如果有其他非聚合函数或者group by后接的属性,不能写其他字段,因为其它字段是随机返回的。

如果需要类似“每个组里面数值最高的人”的需求,就需要使用子查询或者关联查询来实现。