# GROUP BY/HAVING分组数据

分组数据主要涉及两个子句

  • GROUP BY
    • GROUP BY 子句可以包含任意数目的列,因此可以对分组进行嵌套,更细致的进行分组
    • 如果在GROUP BY 子句中嵌套了分组,数据将在最后指定的分组上进行汇总,换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别列取回数据)
    • GROUP BY 子句中列出的每一列都必须是检索列或有效表达式
    • GROUP BY 子句必须出现在WHERE 子句之后,GROUP BY 子句之前
  • HAVING

# 2. 创建分组

分组是使用GROUP BY 子句建立的

# 查询出相同供应商的产品数量
SELECT vend_id,COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;

# 3. 过滤分组

除了能用GROUP BY 分组数据外,SQL 还允许过滤分组,规定包括哪些分组,排除哪些分组。

HAVING 类似于WHERE ,只不过WHERE 过滤行,而HAVING 过滤分组

SELECT cust_id,COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;

# 3.1 HAVING 和WHERE 的差别

  • WHERE 在数据分组前进行过滤

  • HAVING 在数据分组之后进行过滤

# 3.2 同时使用HAVING 和WHERE

# where 过滤所有prod_price 至少为4的行,然后按vend_id 分组数据,HAVING 子句过滤计数为2或2以上的分组
SELECT vend_id,COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >=2;

# 4. 分组和排序

# 4.1 ORDER BY 与GROUP BY 的区别

ORDER BY GROUP BY
对产生的输出排序 对行分组,但输出可能不是分组顺序
任意列都可以使用(设置非选择的列也可以使用) 只可能使用选择列或表达式列,而且必须使用每个选择列表达式
不一定需要 如果与聚集函数一起使用列,则必须使用

# 4.2 不要忘记使用ORDER BY

一般在使用GROUP BY 子句时,应该也给出ORDER BY 子句,这是保证数据正确排序的唯一方法,千万不要依赖GROUP BY 排序数据