分组

大彬大约 1 分钟

分组

单独地使用group by没意义,它只能显示出每组记录的第一条记录。

SELECT * FROM orders
GROUP BY cust_id;

除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。

SELECT vend_id, COUNT(*) AS num_prods #vend_id在GROUP BY子句给出
FROM products
GROUP BY vend_id;

GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

过滤分组

having 用来分组查询后指定一些条件来输出查询结果,having作用和where类似,但是having只能用在group by场合,并且必须位于group by之后order by之前。

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

having和where区别

SELECT cust_id FROM orders GROUP BY cust_id HAVING COUNT(cust_id) >= 2;
SELECT cust_id FROM orders GROUP BY cust_id WHERE COUNT(cust_id) >= 2; #Error Code : 1064

第一个sql语句可以执行,但是第二个会报错。

  • WHERE子句不起作用,因为过滤是基于分组聚集值而不是特定行值的。

  • 二者作用的对象不同,where子句作用于表和视图,having作用于组。

  • WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。

SELECT vend_id, COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;

WHERE子句过滤所有prod_price至少为10的行。然后按vend_id分组数据,HAVING子句过滤计数为2或2以上的分组。

Loading...