目录
分组查询
分组: 按照某一列或者某几列,把相同的数据进行合并输出。
分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
分组查询通常会使用聚合函数进行计算。
语法:
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
根据性别分组 , 统计男性和女性员工的数量
select gender, count(*)
from tb_emp
group by gender; -- 按照gender字段进行分组(gender字段下相同的数据归为一组)
查询入职时间在 ‘2015-01-01’ (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job, count(*)
from tb_emp
where entrydate <= '2015-01-01' -- 分组前条件
group by job -- 按照job字段分组
having count(*) >= 2; -- 分组后条件
where与having区别
在MySQL中,WHERE 和 HAVING 子句都用于过滤查询结果的行,但它们在查询执行过程中的使用阶段不同,而且用途也有所不同:
1.WHERE 子句:
- WHERE 子句用于在任何分组或聚合操作之前过滤行。
- 它与 SELECT、UPDATE、DELETE 和 INSERT INTO … SELECT 语句一起使用。
- 它根据 WHERE 子句中指定的特定条件过滤行。
- WHERE 子句中的条件适用于结果集中的各个行。
- 它用于根据特定条件或一组条件限制查询返回的行数。
示例:
SELECT * FROM employees WHERE department_id = 1;
2.HAVING 子句:
- HAVING 子句用于在执行分组后的查询中过滤行。
- 它与 GROUP BY 子句一起使用,根据指定条件过滤分组后的行。
- 它根据 GROUP BY 子句计算的聚合值(如 COUNT、SUM、AVG、MAX、MIN)过滤行。
- HAVING 子句中的条件适用于 GROUP BY 操作生成的行组。
- 它用于根据聚合值过滤行组。
示例:
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5;
所以,WHERE 用于在进行任何分组之前过滤行,而 HAVING 用于在执行 GROUP BY 操作后过滤分组后的行。