细枝末节
1. GROUPBY后的集必须出现在SELECT后
2. 分组函数做条件肯定放在HAVING中
3. 尽量使用WHERE筛选,性能高
4. GROUPBY支持单字段分组,多字段分组,表达式或函数分组
5. GROUPBY使用多字段分组时,无顺序要求
格式
SELECT
分组,列(要求出现在GROUPBY后面)
FROM
表名
[WHERE 筛选调节]
GROUPBY
分组列表
[HAVING 筛选条件]
[ORDERBY 子句]
筛选条件分类
分组前筛选
数据源
原始表
位置
GROUPBY子句前面
关键字
WHERE
分组后筛选
数据源
分组后的结果集
位置
GROUPBY子句后面
关键字
HAVING
示例
查询哪些部门员工个数>2
/* 1. 先查询每个部门员工个数 */
SELECTCOUNT(*), dept_id
FROM emps
GROUPBY dept_id
/* 2. 根据1中的结果集,对>2条件进行筛选 */
SELECTCOUNT(*),dept_id
FROM emps
GROUPBY dept_id
HAVINGCOUNT(*)>2;
查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
/* 1. 先查询每个工种有奖金的员工的最高工资及工种编号 */
SELECTMAX(salary), job_id
FROM emp
WHERE bonus ISNOTNULL
GROUPBY job_id;
/* 2. 根据1中的结果集继续对最高工资>12000条件进行筛选 */
SELECTMAX(salary), job_id
FROM emp
WHERE bons ISNOTNULL
GROUPBY job_id
HAVINGMAX(salary)>12000;
查询领导编号>102的每个领导手下的最低工资>5000的领导编号及其最低工资
/* 1. 先查询领导编号>102的的每个领导手下的最低工资及领导编号 */
SELECTMIN(salary), mng_id
FROM emp
WHERE mng_id>102
GROUPBY mng_id;
/* 2. 根据1中的结果集继续对最低工资>5000条件进行筛选 */
SELECTMIN(salary), mng_id
FROM emp
WHERE mng_id>102
GROUPBY mng_id
HAVINGMIN(salary)>5000;
按员工姓名的长度分组,查询每组员工个数,筛选员工数>5的组有哪些
/* 1. 先将员工星空按长度分组,查询每组员工个数 */
SELECT COOUNT(*), LENGTH(name)
FROM emp
GROUPBY LENGTH(name);
/* 2. 根据1中的结果集继续对员工数>5条件进行筛选 */
SELECTCOUNT(*), LENGTH(name)
FROM emp
GROUPBY LENGTH(name)
HAVINGCOUNT(*)>5;