第八章 聚合函数

第八章 聚合函数
聚合函数类型:AVG(),SUM(),MAX(),MIN(),COUNT()

AVG(),SUM()只适合数值类型的变量和字段,字符串不能求和求平均值

SELECT AVG(salary),MAX(salary),MIN(salary),SUM(salary)
FROM employees

MIN(),MAX()适用于数值类型,字符串类型,日期时间类型的字符串或变量

SELECT MAX(last_name),MIN(last_name),MAX(hire_date),MIN(hire_date)
FROM employees

COUNT:作用是计算指定字段在查询结构中出现的个数,是不计算NULL值的

SELECT COUNT(employee_id),COUNT(salary),COUNT(1),COUNT(2),COUNT(*)
FROM employees

#如何计算表中有多少条记录
#方式一:count(*)方式二:count(1)

#查看有奖金的员工姓名以及奖金率
SELECT last_name, commission_pct
FROM employees
WHERE commission_pct IS NOT NULL

AVG=SUM/COUNT
SELECT AVG(salary),SUM(salary)/COUNT(salary),
AVG(commission_pct),SUM(commission_pct)/COUNT(commission_pct),
SUM(commission_pct)/107
FROM employees

#因为count中不会count空值,所以要用ifnull
SELECT SUM(commission_pct)/COUNT(IFNULL(commission_pct,0)),
AVG(IFNULL(commission_pct,0))
FROM employees;

如何统计记录数,可以COUNT(),COUNT(*),COUNT(用不存在非空的字段)
哪个效率更高呢
用MYISAM引擎的话三者效率相等
用INNODB的引擎COUNT(*)=COUNT(1)好于COUNT(字段)

#2 group by的使用:按字段进行分组

#查询各个部门的平均工和最高工资
SELECT department_id,AVG(salary),SUM(salary)
FROM employees
GROUP BY department_id
ORDER BY department_id ASC;

#需求:查询各个job_id的平均工资
SELECT job_id,AVG(salary),SUM(salary)
FROM employees
GROUP BY job_id;

#需求:求不同部门,相同job的平均工资

#先求不同部门,再找不同的job
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id,job_id;

#或者:先求不同job_id,再求不同的部门 因为上面两个分法都是工种相同的并且部门号一样的才会在一起,只不过是先分后分的区别
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id,job_id;

#下面是错误的
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id;

#结论:select中出现的非组函数的字段必须声明在group by中
#反之,group by声明的字段可以不出现在select中

SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id WITH ROLLUP;

#查询各个部门的平均工资,按照平均工资升序排列
SELECT department_id,AVG(salary) avg_sal
FROM employees
GROUP BY department_id
ORDER BY avg_sal ASC;

#having 作用:是用来过滤数据的,以前学过过滤数据的where,having与group by有关

#查询各个部门中最高工资比10000高的部门信息
#要求一:一旦过滤条件中出现了组函数group by,聚合函数,则过滤条件必须用having替换,不能使用where;
#要求二:having必须声明在group by的后面,having必须与group by一起使用
#下面这个是错误的:如果有两个条件,where与having可以同时使用
SELECT department_id,MAX(salary)
FROM employees
WHERE MAX(salary)>10000
GROUP BY department_id;

#下面这个正确
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000;

#查询部门id为10,20,30,40这四个部门中最高工资比10000高的部门信息
#方式一
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary)>10000;
#方式二
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 AND department_id IN(10,20,30,40);

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据小理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值