SQL 分组函数

分组函数:是指将数据按照某列的值进行分组后,然后使用组函数分别对每个分好的小组中的数据进行处理。所以组函数一般要结合着
分组关键字group来使用。
1)分组之后在使用
2)
1.分组 group by… 在查询表中数据的时候进行分组的关键字
having 分组之后的进行进一步数据筛选的关键字
2.函数
avg 求平均值
count 计算有多少条数据
MAX 最大值
min 最小值
sum 求和
stddev 标准差
variance 方差

sql语言各部分组成:
select…
from…
where…
group by…
having…
oeder by…
除了select和from之外都不是必须的
假如select…from…后面的语句都出现了,那么他们的执行顺序为:
where–>group by分组–>执行组函数–>having筛选->order by
组函数出现的位置:1.select后面
2.having后面
3.order by后面
4.where后面一定【不能】出现组函数
5.如果select/having语句后面出现了组函数,那么select/having后面没有被组函数修饰的列,就必须出现在group by 后面
where和having对比:
1.where和having都是做条件筛选的
2.where执行的时间比having要早
3.where后面不能出现组函数
4.having后面可以出现组函数
5.where语句要紧跟from后面
6.having语句要紧跟group by后面
group by和having的关系:
1.group by可以单独存在,后面可以不出现having语句
2.having不能单独存在,有需要的话,必须出现在group by后面
oeder by语句:
1.如果sql语句中需要排序,那么就一定要写在sql语句的最后面
2.order by后也可以出现组函数
使用组函数(不结合group分组使用)
例如:查询s_emp表中所有员工的平均工资

select avg(salary)
from s_emp;

这里几个函数就不都举例了,都是一个模板。
使用组函数:结合group分组以及having筛选使用
例如:查询s_emp表中部门的平均工资大于等于1400的部门

select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary)>1400;

下面给大家几个查询实例,根据需求一步一步添加,对解决问题有帮助
查询s_emp表中部门的平均工资大于等于1400的部门,并且显示出这些部门的名字,同时按照部门编号进行排序
第一步:查询出基本要求

select	 dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary)>=1400
order by dept_id;

第二步:加入多表查询,并且分别给表起别名

select  se.dept_id,avg(se.salary)
from s_emp se,s_dept sd
group by se.dept_id
having avg(se.salary)>=1400
order by se.dept_id;

第三步:查询出s_dept表中的部门名称,并且进行等值连接

select  se.dept_id,avg(se.salary),sd.name
from s_emp se,s_dept sd
where se.dept_id=sd.id
group by se.dept_id,sd.name
having avg(se.salary)>=1400
order by se.dept_id;

第四步:select后出现组函数,那么没有被组函数修饰的列放到group by后面

select  se.dept_id,avg(se.salary),sd.name
from s_emp se,s_dept sd
where se.dept_id=sd.id
group by se.dept_id,sd.name
having avg(se.salary)>=1400
order by se.dept_id;

查询s_emp表中最大的工资数,并且显示出这个最大工资的员工的名字
第一步查出最大工资

select max(salary)
from s_emp;

第二步显示列last_name,select后面出现组函数,把没有被组函数修饰的列放到group by后

select max(salary),last_name
from s_emp
broup by lsat_name; 

第三步多表查询,从s1表中查询出最大的工资书多少,再跟s2表联系查询出最大工资对应的员工名

select s2.last_name,max(s1.salary)
from s_emp s1,s_emp s2
where s2.salary=man(salary)
group by s2.last_name;

第四步where后不可以跟组函数,所以将组函数用having

select s2.last_name,max(s1.salary)
from s_emp s1,s_emp s2
group by s2.last_name,s2.salary;
having s2.salary=max(s1.salary);

子查询(嵌套查询) 即一个select语句中嵌套了一个或多个select语句
通俗的说:select从最里层开始写,一层一层嵌套,最终完成查询需求
这里举个简单的例子:
查询工资比Simth工资高的员工信息
第一步查询simith的工资

select salary
from s_emp
where last_name='Smith';

查询结果940
第二步查询工资比940高的员工信息

select last_name,salary
from s_emp
where salary>940; 

第三步将940替换sql语句

select last_name,salary
from s_emp
where salary>(select salary
		     from s_emp
                        where last_name='Smith'); 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值