SQL 分组使用案例

SQL的分组函数如何使用

问题描述

mysql如何查询某个字段平均数以下的数据?

先用where条件查询,显示出错,原因是where后不能用avg()

select unix,num from waterdata where num<avg(num);

然后用group by having来查询,虽然没报错,但根本没有数据出来。

select unix,num from waterdata group by num having num<avg(num);

此外,where后面不能用avg(),max()等函数,为什么可以用current_timestamp()这种函数呢?

解决方法 

-- 1 查询emp里工资小于平均值的员工信息(整个结果集分组)
SELECT * FROM emp -- 平均工资为 2073.214286
WHERE SAL <(SELECT AVG(SAL) FROM emp)

-- 2 查询emp里工资小于部门平均值的员工信息(按照部门分组)
SELECT A.*,AVG_SAL FROM emp A
JOIN 
(
SELECT deptno,AVG(SAL) AVG_SAL FROM emp
GROUP BY deptno
)B
ON A.deptno = B.deptno AND A.SAL < B.AVG_SAL
ORDER BY deptno

-- 3 问题分析
-- 3.1 分组字段和聚合字段不能用一个,不然达不到分组的目的。

-- 3.2 比如,下例的分组和聚合都是一个字段,效果等同于SAL <= SAL(即没分组)
SELECT * FROM emp
GROUP BY SAL
HAVING SAL <= AVG(SAL) 

-- 3.3 current_timestamp是系统函数且不是聚合函数,所以可以接WHERE。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShenLiang2025

您的鼓励是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值