3:分组查询

3.1:分组查询支持字段和函数分组

# 分组查询
/*
分组数据 group by,该语句可以iang表中数据分成若干组
用法如下:
SELECT COLUMN,GROUP BY(COLUMN)
FROM TABLE
[WHERE CONDITION]
[GROUP BY GROUP BY expression]
[ORDER BY column]

特点:1:按照筛选条件可以分为
分组前刷选:原始表 在group_by前面用where
分组后刷选:分组后的结果集 在group_by后面用having
分组后筛选都是用having,能在分组前筛选的尽量在分组前筛选

特点:2:可以支持多个字段分组查询,
特点:3:支持升降序
*/
#引入,查询每个部门的平均工资。

#1:每个工种的最高工资
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;

#2,每个位置上的部门个数
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;

# 添加筛选条件
#3,查询邮箱包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
WHERE email like '%a%'
GROUP BY department_id; 

#4,有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct is not NULL
GROUP BY manager_id;

#添加复杂的筛选条件
#1:查询哪个部门的员工个数大于二?分组后的查询
#WHERE限制的条件是来自table的,
#而这种限制条件来之分组查找后的,应该用having。
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;

#2,查询每个工种有奖金的员工且最高工资大于12000的工种编号和最高工资
SELECT MAX(salary),job_id
FROM employees
where commission_pct is not NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
 
#3 查询领导编号大于102的每个领导手下员工最低工资大于5000的最低工资
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000;



#按表达式或者函数分组

#案例:按照员工姓名长度分组,查询每一种员工个数,筛选员工个数>5的有哪些?

#1SELECT count(*) c,LENGTH(last_name) len
FROM employees
GROUP BY len
HAVING c>5;

#按多个字段分组,加入多个字段即可。
#案例1:查询每个部门,每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id;

#案例2:查询每个部门,每个工种的员工的平均工资,并且按照平均工资的高低进行显示
SELECT AVG(salary),department_id,job_id
FROM employees
WHERE department_id is not null && department_id>90
GROUP BY department_id,job_id
HAVING AVG(salary)>10000
ORDER BY AVG(salary) DESC; 
#这种筛选条件可以用在分组前和分组后的,尽量在分组前完成。

#练习题

#1:查询各个job_id的员工工资的最大数,最小值,平均数,总和,并按job_id升序。
SELECT MAX(salary),min(salary),AVG(salary),SUM(salary),job_id
FROM employees
GROUP BY job_id
ORDER BY job_id ASC;

#2:查询员工最高工资和最低工资的差距
SELECT MAX(salary),MIN(salary),MAX(salary)- MIN(salary)
FROM employees;

#3:查询各个管理者手下的员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不在计算内
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id is not NULL
GROUP BY manager_id
HAVING MIN(salary)>6000

#4:查询所有部门的编号,员工数量和工资平均值,并按照工资降序
SELECT COUNT(*),AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) DESC;

#5 :选择具有各个job_id的员工人数
SELECT COUNT(*),job_id
from employees
where job_id is not NULL
GROUP BY job_id
ORDER BY COUNT(*);

 

posted @ 2020-03-26 17:19  大朱123  阅读(230)  评论(0编辑  收藏  举报