分组查询主要涉及到两个子句,分别是:group by和having
一group by
取得每个工作岗位的工资合计,要求显示岗位名称和工资合计
mysql> select job, sum(sal) from emp group by job;
+-----------+----------+
| job | sum(sal) |
+-----------+----------+
| ANALYST | 6000.00 |
| CLERK | 4150.00 |
| MANAGER | 8275.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 5600.00 |
+-----------+----------+
如果使用了order by,那么order by必须放在group by后面,否则,会报错。
在SQL语句中若有group by语句,那么在select语句后面只能跟分组函数+参与分组的字段。
二having
如果想对分组数据再进行过滤需要使用having子句
取得每个岗位的平均工资大于2000
mysql> select job from emp group by job having avg(sal) > 2000;
+-----------+
| job |
+-----------+
| ANALYST |
| MANAGER |
| PRESIDENT |
+-----------+
三select语句总结
一个完整的select语句结构如下:
select
字段...
from
表...
where
过滤条件...
group by
分组条件...
having
分组之后的过滤条件
order by
字段...
以上语句的执行顺序
1. 首先执行where语句过滤原始数据
2. 执行group by进行分组
3. 执行having对分组数据进行操作
4. 执行select选出数据
5. 执行order by排序
原则:能在where中过滤的数据,尽量在where中过滤,效率较高。having的过滤是专门对分组之后的数据进行过滤的。