分组数据
mysql可以使用聚集函数来汇总数据,这时的我们可以对数据进行计数,计算和与平均数,获得最大值和最小值而不用检索所有的数据
使用where子句来返回计数的数据
select count(*) from emp1 where deptno=10;
count(*) |
---|
3 |
使用group by来返回分组的计数数据
select deptno ,count(*) from emp1 group by deptno;
deptno | count(*) |
---|---|
10 | 3 |
20 | 5 |
30 | 6 |
使用group by 的注意事项:
1.group by 子句可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制
>select mgr,deptno,count(*) from emp1 group by deptno,mgr;
mgr | deptno | count(*) |
---|---|---|
NULL | 10 | 1 |
7782 | 10 | 1 |
7839 | 10 | 1 |
7566 | 20 | 2 |
7788 | 20 | 1 |
7839 | 20 | 1 |
7902 | 20 | 1 |
7698 | 30 | 5 |
7839 | 30 | 1 |
2.如果group by 子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换言之,在建立分组的时候,指定的所有列都一起计算(所以不能从个别的列取回数据
3.group by 子句中列出的每一个列都必须是检索列或者有效的表达式(但不能是聚集函数),如果在select中使用表达式,则必须在group by子句中指定相同的表达式,不能使用别名
4.除了聚集计算语句之外,select语句中的每一列都必须子啊group by 子句中出现。
5.如果分组中有null值,则null值将作为一个分组返回,日过列中有很多行null值,他么将分为一组
6.group by 子句必须出现在where 子句之后,order by子句之前。
过滤分组
除了使用group by分组数据外,mysql还允许过滤分组,规定包括哪些分组,排除哪些分组
例子:
select deptno,count() from emp1 group by deptno having count() >3;
deptno | count(*) |
---|---|
20 | 5 |
30 | 6 |
having支持所有的where操作符,过滤分组的时候不能使用where,where是过滤行,而having是过滤分组
select deptno,count(*) from emp1 group by deptno having avg(sal)>2000;
deptno | count(*) |
---|---|
10 | 3 |
20 | 5 |
having 后面可以使用所有的聚集函数
where和having的差别:
select deptno ,count(*) from emp1 where sal>2000 group by deptno having count(*)>2;
查找出emp1表中的薪水大于2000的并且人数超过2人的部门和人数
deptno | count(*) |
---|---|
20 | 3 |
分组和排序
group by和order by经常完成相同的工作,但他们是非常不同的。
order by | group by |
---|---|
是排序产生的输出 | 分组行,但输出不一定是分组的顺序 |
任意列都可以使用 | 只能使用选择列或者表达式列,而且必须使用每个选择列表达式 |
不一定需要 | 如果与聚集函数一起使用列或者表达式,则必须使用 |
select子句顺序
子句 | 说明 | 是否必须使用 |
---|---|---|
select | 要返回的列或者表达式 | 是 |
from | 从检索数据的表 | 在从表中选择数据时需要在使用 |
where | 行级过滤 | 否 |
group by | 分组说明 | 仅在按组计算聚集时需要使用 |
having | 组级过滤 | 否 |
order by | 输出排序顺序 | 否 |
limit | 要检索的行数 | 否 |
select
from
where
group by
having
order by
limit