GROUP BY
GROUP BY 把数据按某一列(或多列)分组,然后对每组分别做聚合——"每个部门的平均工资""每家店铺的商品数量"都是它的活。
GROUP BY 的执行逻辑:先把行按分组列的值归类,相同的放一起,再把每组打包交给聚合函数计算。没分组的行在聚合函数眼里不存在——GROUP BY dept_code 之后,SELECT emp_name 是不合法的,因为一个组里可能有多个 emp_name,数据库不知道该返回哪一个。
分组可以按多列:GROUP BY dept_code, salary_grade 的意思是"部门 + 工资等级"的每个组合是一个组。先分大类(部门),再在每个大类里分小类(工资等级)。
以飞翔科技为例:
-- 每个部门的平均工资
SELECT dept_code, AVG(basic_salary) AS 平均工资
FROM employees
GROUP BY dept_code;
-- 每家店铺的商品数量和平均价格
SELECT shop_name,
COUNT(*) AS 商品数,
AVG(price) AS 均价
FROM products
GROUP BY shop_name;
-- 按"部门+工资等级"分组看人数
SELECT dept_code, salary_grade, COUNT(*) AS 人数
FROM employees
GROUP BY dept_code, salary_grade
ORDER BY dept_code, salary_grade;
第二个例子对 products 表按店铺分组,同时用了两个聚合函数,一个 GROUP BY 就能拿到每家店的商品数和均价——这就是分组查询的核心价值。