MySQL学习足迹记录11--分组数据--GROUP BY,HAVING
2013-07-11 15:05
585 查看
1.创建分组GROUP BY
先列出所有的vend_id,以便作对比
mysql> SELECT vend_id FROM products;
+---------+
| vend_id |
+---------+
| 1001 |
| 1001 |
| 1001 |
| 1002 |
| 1002 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1005 |
| 1005 |
+---------+
14 rows in set (0.00 sec)
用GROUP BY进行分组
mysql> SELECT vend_id,COUNT(*) AS num_prods
-> FROM products
#先分组,再分别计算COUNT(*)
-> GROUP BY vend_id;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1002 | 2 |
| 1003 | 7 |
| 1005 | 2 |
+---------+-----------+
4 rows in set (0.00 sec)
TIPS:
*如果列中有多行NULL值,它们将分为一组
*GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
2.过滤分组HAVING
*HAVING 与 WHERE 的区别:
WHERE过滤行,而HAVING过滤分组
eg:
mysql> SELECT vend_id,COUNT(*) AS num_prods
-> FROM products
-> GROUP BY vend_id
-> HAVING COUNT(*)>2; #从结果中过滤不符合[b]COUNT(*)>2的组[/b]
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1003 | 7 |
+---------+-----------+
2 rows in set (0.00 sec)
* WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤,所以,WHERE排除的行不包括在分组中
eg:
先列出原始数据作对比
mysql> SELECT vend_id,prod_price FROM products
-> ORDER BY prod_price;
+---------+------------+
| vend_id | prod_price |
+---------+------------+
| 1003 | 2.50 |
| 1003 | 2.50 |
| 1002 | 3.42 |
| 1003 | 4.49 |
| 1001 | 5.99 |
| 1002 | 8.99 |
| 1001 | 9.99 |
| 1003 | 10.00 |
| 1003 | 10.00 |
| 1003 | 13.00 |
| 1001 | 14.99 |
| 1005 | 35.00 |
| 1003 | 50.00 |
| 1005 | 55.00 |
+---------+------------+
14 rows in set (0.00 sec)
mysql> SELECT vend_id,COUNT(*) AS num_prods
-> FROM products
-> WHERE prod_price >14
#WHERE过滤后只剩下上表中最后3条记录,
-> GROUP BY vend_id
#HAVING再过滤[b]分组后vend_id为不符合COUNT(*)
>=2组[/b]
->
HAVING COUNT(*) >=2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1005 | 2 |
+---------+-----------+
1 row in set (0.00 sec)
3. 分组和排序
GROUP BY和ORDER BY的区别
*ORDER BY指定的条件可以是任意列
*GROUP BY指定的条件只可能使用选择列或列表达式
TIPS:
一般在使用GROUP BY子句时,也应该给出ORDER BY子句
Examples:
先列出原始数据:
mysql> SELECT order_num,quantity,item_price FROM orderitems;
+-----------+----------+------------+
| order_num | quantity | item_price |
+-----------+----------+------------+
| 20005 | 10 | 5.99 |
| 20005 | 3 | 9.99 |
| 20005 | 5 | 10.00 |
| 20005 | 1 | 10.00 |
| 20006 | 1 | 55.00 |
| 20007 | 100 | 10.00 |
| 20008 | 50 | 2.50 |
| 20009 | 1 | 10.00 |
| 20009 | 1 | 8.99 |
| 20009 | 1 | 4.49 |
| 20009 | 1 | 14.99 |
+-----------+----------+------------+
11 rows in set (0.00 sec)
mysql> SELECT order_num,SUM(quantity*item_price) AS ordertotal
-> FROM orderitems
-> GROUP BY order_num
-> HAVING SUM(quantity*item_price) >= 50;
+-----------+------------+
#未用ORDERBY指定排序,结果可能不是想要的,例如按ordertotal升序
| order_num | ordertotal |
+-----------+------------+
| 20005 | 149.87 |
| 20006 | 55.00 |
| 20007 | 1000.00 |
| 20008 | 125.00 |
+-----------+------------+
4 rows in set (0.00 sec)
mysql> SELECT order_num,SUM(quantity*item_price) AS ordertotal
-> FROM orderitems
-> GROUP BY order_num
-> HAVING SUM(quantity*item_price) >=50
-> ORDER BY ordertotal;
[b] # 用ORDERBY指定排序方式[/b]
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
| 20006 | 55.00 |
| 20008 | 125.00 |
| 20005 | 149.87 |
| 20007 | 1000.00 |
+-----------+------------+
4 rows in set (0.01 sec)
先列出所有的vend_id,以便作对比
mysql> SELECT vend_id FROM products;
+---------+
| vend_id |
+---------+
| 1001 |
| 1001 |
| 1001 |
| 1002 |
| 1002 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1005 |
| 1005 |
+---------+
14 rows in set (0.00 sec)
用GROUP BY进行分组
mysql> SELECT vend_id,COUNT(*) AS num_prods
-> FROM products
#先分组,再分别计算COUNT(*)
-> GROUP BY vend_id;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1002 | 2 |
| 1003 | 7 |
| 1005 | 2 |
+---------+-----------+
4 rows in set (0.00 sec)
TIPS:
*如果列中有多行NULL值,它们将分为一组
*GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
2.过滤分组HAVING
*HAVING 与 WHERE 的区别:
WHERE过滤行,而HAVING过滤分组
eg:
mysql> SELECT vend_id,COUNT(*) AS num_prods
-> FROM products
-> GROUP BY vend_id
-> HAVING COUNT(*)>2; #从结果中过滤不符合[b]COUNT(*)>2的组[/b]
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1003 | 7 |
+---------+-----------+
2 rows in set (0.00 sec)
* WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤,所以,WHERE排除的行不包括在分组中
eg:
先列出原始数据作对比
mysql> SELECT vend_id,prod_price FROM products
-> ORDER BY prod_price;
+---------+------------+
| vend_id | prod_price |
+---------+------------+
| 1003 | 2.50 |
| 1003 | 2.50 |
| 1002 | 3.42 |
| 1003 | 4.49 |
| 1001 | 5.99 |
| 1002 | 8.99 |
| 1001 | 9.99 |
| 1003 | 10.00 |
| 1003 | 10.00 |
| 1003 | 13.00 |
| 1001 | 14.99 |
| 1005 | 35.00 |
| 1003 | 50.00 |
| 1005 | 55.00 |
+---------+------------+
14 rows in set (0.00 sec)
mysql> SELECT vend_id,COUNT(*) AS num_prods
-> FROM products
-> WHERE prod_price >14
#WHERE过滤后只剩下上表中最后3条记录,
-> GROUP BY vend_id
#HAVING再过滤[b]分组后vend_id为不符合COUNT(*)
>=2组[/b]
->
HAVING COUNT(*) >=2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1005 | 2 |
+---------+-----------+
1 row in set (0.00 sec)
3. 分组和排序
GROUP BY和ORDER BY的区别
*ORDER BY指定的条件可以是任意列
*GROUP BY指定的条件只可能使用选择列或列表达式
TIPS:
一般在使用GROUP BY子句时,也应该给出ORDER BY子句
Examples:
先列出原始数据:
mysql> SELECT order_num,quantity,item_price FROM orderitems;
+-----------+----------+------------+
| order_num | quantity | item_price |
+-----------+----------+------------+
| 20005 | 10 | 5.99 |
| 20005 | 3 | 9.99 |
| 20005 | 5 | 10.00 |
| 20005 | 1 | 10.00 |
| 20006 | 1 | 55.00 |
| 20007 | 100 | 10.00 |
| 20008 | 50 | 2.50 |
| 20009 | 1 | 10.00 |
| 20009 | 1 | 8.99 |
| 20009 | 1 | 4.49 |
| 20009 | 1 | 14.99 |
+-----------+----------+------------+
11 rows in set (0.00 sec)
mysql> SELECT order_num,SUM(quantity*item_price) AS ordertotal
-> FROM orderitems
-> GROUP BY order_num
-> HAVING SUM(quantity*item_price) >= 50;
+-----------+------------+
#未用ORDERBY指定排序,结果可能不是想要的,例如按ordertotal升序
| order_num | ordertotal |
+-----------+------------+
| 20005 | 149.87 |
| 20006 | 55.00 |
| 20007 | 1000.00 |
| 20008 | 125.00 |
+-----------+------------+
4 rows in set (0.00 sec)
mysql> SELECT order_num,SUM(quantity*item_price) AS ordertotal
-> FROM orderitems
-> GROUP BY order_num
-> HAVING SUM(quantity*item_price) >=50
-> ORDER BY ordertotal;
[b] # 用ORDERBY指定排序方式[/b]
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
| 20006 | 55.00 |
| 20008 | 125.00 |
| 20005 | 149.87 |
| 20007 | 1000.00 |
+-----------+------------+
4 rows in set (0.01 sec)
相关文章推荐
- Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用
- MySQL学习足迹记录05--数据过滤--AND,OR,NOT,IN
- MySQL学习足迹记录07--数据过滤--用正则表达式进行检索
- Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用
- MYSQL 【汇总数据】 【分组数据】 学习记录
- MySQL学习足迹记录10--汇总数据--MAX(),MIN(),AVG(),SUM(),COUNT()
- MySQL学习足迹记录06--数据过滤--LIKE搭配百分号(%)和下划线(_)通配符
- MySQL学习足迹记录04--数据过滤--WHERE
- Mysql 数据分组取某字段值所有最大的记录行
- 组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化 .
- 十三章 分组数据 GROUP BY ,HAVING
- MySQL学习足迹记录01--SOURCE,SHOW
- mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法。
- MySQL学习记录--操作时间数据
- mysql学习笔记之九(多表数据记录查询)
- mysql分组取每组前几条记录(排名) 附group by与order by的研究
- 跟燕十八学习PHP-第二十五天-mysql"group by和having的综合练习"
- MySQL必知必会(数据分组,Group by和Having子句, Select子句的顺序)
- MySQL对数据表进行分组查询(GROUP BY)
- 14-9-11 C/C++课程设计--图书馆管理系---<time.h>中时间数据类型的学习记录