单表操作-group by 及分组函数
分组函数
- max - >最大值
- min - >最小值
- count - >计数
- avg - >求平均值
- sum - >求和
假如现在有一个表employee(eno, ename, deptno, departname, salary, allowance)
,则下面的操作所求得的结果分别是
//找出所有员工的最高薪资
select max(salary) from employee;
//找出所有员工的最低薪资
select min(salary) from employee;
//找出所有员工一共有多少个
select count(*) from employee;
//找出所有员工的平均薪资
select avg(salary) from employee;
//找出所有员工的薪资总和
select sum(salary) from employee;
建议自己建表多试几次哦!
分组查询 ——group by
什么是分组查询?
在实际应用中,有时候需要按照某些条件分组后再进行操作,此时我们在查询数据时就需要进行分组操作。
操作语句:
select ... from ... group by ...
//select 后只能加 group by 之后的字段和分组函数,这点很重要!!!
还是上面那个表employee(eno, ename, deptno, departname, salary, allowance)
select deptno,avg(salary) from department group by deptno;
为了使数据更加直观,下面代入具体数据帮助理解,表名为emp:
eno | ename | deptno | deptname | salary | allowance |
---|---|---|---|---|---|
01 | Smith | 10 | technoligy | 5000 | 800 |
02 | Alan | 10 | technoligy | 6000 | 500 |
03 | Black | 10 | technoligy | 5500 | 700 |
04 | Brown | 20 | maker | 8000 | 400 |
05 | Jackson | 20 | maker | 7000 | 800 |
06 | Bob | 30 | software | 10000 | null |
07 | Lily | 30 | software | 12000 | null |
group by 的原理:
通过将某一个字段相等的数据的其他字段联合相加,你可能不懂是什么意思,好,那现在用上面的emp
表来讲,字段存在相同时有deptno
,如果group by deptno
,那么你会得到一个只有三个数据的表deptno
:
deptno |
---|
10 |
20 |
30 |
而现在能够与它一起查看的数据有哪些?
如果需要查看相应的字段,需要使用到分组函数,比如最高薪资,最高津贴,最低薪资,最低津贴……能用分组函数求得的字段都可以一起查看
语句执行的顺序
不知道大家有没有试过在where后面加上分组函数?没试过的可以去试一下,然后你就会发现报错了,哦豁,怎么不能用?前面说的都是屁话?不能用的?no no no,出现报错是因为语句是有执行顺序的,下面这条语句:
select ... from ... where ... group by ... having ... order by ...
上述语句的执行顺序为:from->where->group by->having->select->order by
什么意思?
先from
定位表,然后找出满足where
语句的所有数据,按照group by
给定字段分组,分组后在用having
后面的条件再筛出不满足条件的数据,之后再按照select
想要查看的字段构建出一个需要查看的表,然后按照order by
后面给出的田间进行排序。(看不懂的多看几遍,我讲的很清楚了!)
好的,我就当你已经懂了上面所说的语句执行顺序,这下就可以解答上面说的问题了——为什么where
语句后面接分组函数进行查询时会报错?因为再进行where
条件筛选时还没有进行过分组,分组是在where
条件执行完后再进行的,所以说分组函数只能再分组后使用.
那么这个时候就会有人问,欸?上面介绍分组函数的时候根本没有分组,可是还是可以查出数据啊!好哇,又在乱教!不,事实上如果没有group by语句时,系统会默认地再条件筛选结束后将整个表分成一组,由于select
语句地执行再分组函数之后,所以是可以查询分组函数的计算结果滴 !<叉手手>
当然分组操作也是可以按多个字段分组的,只需要再字段之间加逗号隔开即可。
都看到这里了,不点个赞再走嘛?拜托拜托~
最大标题,我故意的,欸嘿,分享一张学校的图书馆