目录
1.分组数据
13.1数据分组
13.2创建分组
13.3过滤分组
13.4分组和排序
13.5 SELECT子句顺序
1.分组数据
13.1数据分组
- 分组允许把数据分为多个逻辑组,以便对每个组进行聚集运算。
- 比如:前面学了聚集函数,是统计所有数据的信息,以花为例,想要统计每个种类花的总价格怎么办? 使用分组加聚合函数
13.2创建分组
## GROUP BY子句
统计每种花的总价格
SELECT name,SUM(price) FROM flower GROUP BY `name`;
输出:
+--------+------------+
| name | SUM(price) |
+--------+------------+
| 康乃馨 | 7 |
| 白晶菊 | 3 |
| 百日草 | 5 |
| 矮牵牛 | 2.5 |
+--------+------------+
分析: 根据花的名称分组,按原先统计所有花的总价格,而上述是对每个不同的花进行分组,统计同一种类花的总价格,如:康乃馨有两朵,总价格为7元.
## GROUP BY子句的规定
1.GROUP BY子句可以包含任意数目的列
2.GROUP BY子句中列出的每个列都必须是检索列或有效的表达式,但不能是聚集函数。
3.如果分组列中有NULL值,则NULL将作为一个分组返回。
4.WHERE——GROUP BY——ORDER BY(从前到后的顺序)
13.3过滤分组
## 为什么不能使用WHERE呢
WHERE只过滤指定行而不是分组,事实上,WHERE没有分组的概念
## 在分组的条件上可以使用HAVING来过滤分组数据
## MySQL不仅可以分组数据,还可以过滤分组,比如只想要列出每个种类的总价格是在三元以上的
过滤每种花总价格在三元以上的信息
SELECT name,SUM(price) FROM flower GROUP BY name
HAVING SUM(price)>3;
## WHERE 和 HAVING 的差别
WHERE在分组前进行过滤,HAVING在数据分组后进行过滤
## WHERE和HAVING一起使用的情况
过滤每个花的单价是大于2的,并且含有此条件的花种类是两个以上的
SELECT name,price FROM flower
WHERE price>2
GROUP BY propertyId
HAVING count(*) >2;
分析: 先过滤每个种类的花的单价是大于2的,再过滤符合条件的花有两个以上的
13.4分组和排序
## 一般在使用GROUP BY 子句时,因该也给出ORDER BY 子句,这是保证数据正确排序的唯一方法
过滤每个花的单价是大于2的,并且含有此条件的花种类是两个以上的并且按照价格从高到底排序
SELECT name,price FROM flower
WHERE price>2
GROUP BY propertyId
HAVING count(*) >2
ORDER BY price desc;
输出结果:
+--------+-------+
| name | price |
+--------+-------+
| 白蔷薇 | 4 |
| 菊花 | 3.6 |
+--------+-------+
13.5 SELECT子句顺序
## SELECT 子句及其顺序(顺序从上到下)
子句 说明 是否必须使用
SELECT 要返回的列或表达式 是
FROM 从中检索数据的表 仅在从表中选择数据时使用
WHERE 行级过滤 否
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤 否
ORDER BY 输出排序顺序 否
LIMIT 要检索的行数 否