MySQL学习笔记06__分组查询

细枝末节

1. GROUP BY后的集必须出现在SELECT后
2. 分组函数做条件肯定放在HAVING中
3. 尽量使用WHERE筛选,性能高
4. GROUP BY支持单字段分组,多字段分组,表达式或函数分组
5. GROUP BY使用多字段分组时,无顺序要求

格式

SELECT
    分组,列(要求出现在GROUP BY后面)
FROM
    表名
[WHERE 筛选调节]
GROUP BY
    分组列表
[HAVING 筛选条件]
[ORDER BY 子句]

筛选条件分类

分组前筛选

数据源
原始表
位置
GROUP BY子句前面
关键字
WHERE

分组后筛选

数据源
分组后的结果集
位置
GROUP BY子句后面
关键字
HAVING

示例

查询哪些部门员工个数>2
/* 1. 先查询每个部门员工个数 */
SELECT COUNT(*), dept_id
FROM emps
GROUP BY dept_id
    
/* 2. 根据1中的结果集,对>2条件进行筛选 */
SELECT COUNT(*),dept_id
FROM emps
GROUP BY dept_id
HAVING COUNT(*)>2;
查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
/* 1. 先查询每个工种有奖金的员工的最高工资及工种编号 */
SELECT MAX(salary), job_id
FROM emp
WHERE bonus IS NOT NULL
GROUP BY job_id;

/* 2. 根据1中的结果集继续对最高工资>12000条件进行筛选 */
SELECT MAX(salary), job_id
FROM emp
WHERE bons IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
查询领导编号>102的每个领导手下的最低工资>5000的领导编号及其最低工资
/* 1. 先查询领导编号>102的的每个领导手下的最低工资及领导编号 */
SELECT MIN(salary), mng_id
FROM emp
WHERE mng_id>102
GROUP BY mng_id;

/* 2. 根据1中的结果集继续对最低工资>5000条件进行筛选 */
SELECT MIN(salary), mng_id
FROM emp
WHERE mng_id>102
GROUP BY mng_id
HAVING MIN(salary)>5000;
按员工姓名的长度分组,查询每组员工个数,筛选员工数>5的组有哪些
/* 1. 先将员工星空按长度分组,查询每组员工个数 */
SELECT COOUNT(*), LENGTH(name)
FROM emp
GROUP BY LENGTH(name);

/* 2. 根据1中的结果集继续对员工数>5条件进行筛选 */
SELECT COUNT(*), LENGTH(name)
FROM emp
GROUP BY LENGTH(name)
HAVING COUNT(*)>5;

你可能感兴趣的:(mysql)