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 排序数据

results matching ""

    No results matching ""