[转帖]MySQL学习足迹记录11--分组数据_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2407 | 回复: 0   主题: [转帖]MySQL学习足迹记录11--分组数据        下一篇 
John
注册用户
等级:大元帅
经验:90444
发帖:136
精华:2
注册:2011-7-21
状态:离线
发送短消息息给John 加好友    发送短消息息给John 发消息
发表于: IP:您无权察看 2014-12-24 16:34:34 | [全部帖] [楼主帖] 楼主

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;        #从结果中过滤不符合COUNT(*)>2的组
+---------+-----------+
| 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再过滤分组后vend_id为不符合COUNT(*) >=2组
-> 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;              # 用ORDERBY指定排序方式
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
|     20006 |      55.00 |
|     20008 |     125.00 |
|     20005 |     149.87 |
|     20007 |    1000.00 |
+-----------+------------+
4 rows in set (0.01 sec)


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论