分组在SELECT语句的GROUP BY子句中建立。

    解释: 语句指定两个列,vend_id 包含供应商ID,为num_prods 计算字段结果,GROUP BY 子句指示 vend_id 排序并分组数据,

    GROUP BY子句重要规则:

    • 包含任意数目的列,
    • 如果在GROUP BY 子句中套入分组,数据将会最后规定的分组上进行总汇。
    • GROUP BY 子句中列出的没列都必须是检索的列,有效的表达式,不能聚集函数。
    • 大多数SQL不允许GROUP BY 带有长度可变的数据类型(文本,备注型字段)
    • 除聚集计算语句外,SELECT 语句中,每个列都必须在GROUP BY子句中给出。
    • 如果分组带有NULL值,将作为一个分组返回,如果多个将成一组。
    • GROUP BY 子句必须出现在WHERE子句之后,

    过滤分组规定包含哪些分组,排除哪些分组,用HAVING子句,与WHERE子句类似,唯一差别的是WHERE用来过滤行,HAVING过滤分组。也可以说HAVING在数据分组后过滤,WHERE在数据分组前进行过滤。

    1. mysql> SELECT cust_id, COUNT(*) AS orders
    2. -> FROM Orders
    3. -> GROUP BY cust_id
    4. -> HAVING COUNT(*) >= 2;
    5. +------------+--------+
    6. +------------+--------+
    7. | 1000000001 | 2 |
    8. 1 row in set (0.00 sec)

    解释: 过滤出两个以上订单的分组

    解释: 第一行使用聚集函数,WHERE子句过滤除所有prod_price少于4的行,按vend_id分组,HAVING子句过滤计数2以上分组。

    去掉WHERE 过滤

    1. mysql> SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id HAVING COUNT(*) >= 2;
    2. +---------+-----------+
    3. | vend_id | num_prods |
    4. +---------+-----------+
    5. | BRS01 | 3 |
    6. | DLL01 | 4 |
    7. | FNG01 | 2 |
    8. +---------+-----------+
    9. 3 rows in set (0.01 sec)

    过滤出销售产品在4个,且价格是4一下的。

    • GROUP BY

      • 排序产生的输出
      • 任意列都可以使用
      • 可以选择是否与聚集函数一起使用

    检索除3个或以上的物品订单号与订购物品数目:

    按订购物品数目排序输出。

    1. mysql> SELECT order_num, COUNT(*) AS items
    2. -> GROUP BY order_num
    3. -> HAVING COUNT(*) >=3
    4. -> ORDER BY items, order_num;
    5. +-----------+-------+
    6. | order_num | items |
    7. +-----------+-------+
    8. | 20006 | 3 |
    9. | 20009 | 3 |
    10. | 20007 | 5 |
    11. | 20008 | 5 |
    12. +-----------+-------+
    13. 4 rows in set (0.00 sec)