GROUP BY 作用
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
GROUP BY 语法
SELECT column_name,
aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
示例数据表
我们以表customers和orders为例:
表customers
表orders
GROUP BY实例
查询居住在各个城市的客户分别有多少个。我们可以这样写SQL:
SELECT 城市,COUNT(*) AS 客户数量 FROM Customers GROUP BY 城市
结果为:
从上面我们可以看到,GROUP BY 将城市名称相同的客户聚集在一起,然后通过COUNT函数计算出了他们的数量。
在具体使用GROUP BY子句前,需要知道一些重要的规定。
- GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
- GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。
- 除聚集计算语句外, SELECT语句中的每个列都必须在GROUP BY子句中给出。
- 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
- GROUP BY子句必须出现在WHERE子句之后, ORDER BY子句之前。
对照上面的实例,我们可以发现GROUP BY的用法满足上面的规定:除了聚合函数COUNT,城市列出现在SELECT语句和GROUP BY子句中。
GROUP BY 多表连接
查询每个城市有多少个订单产生。我们可以这样写SQL:
SELECT c.城市,COUNT(o.订单ID) AS 订单数量 FROM Customers c LEFT JOIN Orders o ON c.客户ID=o.客户ID GROUP BY c.城市
结果为:
因为没有北京和杭州的用户购买产品,所以订单数量为0
GROUP BY排重
GROUP BY在进行分组的时候,会自动排除重复数据。对城市和省份进行分组,但不进行任何聚合操作:
SELECT 城市 ,省份 FROM customers GROUP BY 城市,省份
结果为:
该功能与SQL中的关键字DISTINCT功能相同,但在性能上会有区别,这里不作扩展介绍。