3.1 GROUP BY语句

SQL 语言非常强大。除了简单的数据获取之外,它还允许您在查询时对数据进行分组。比如我们想知道每个品牌有多少种产品,怎么办?

为此有一个特殊的运算符GROUP BY,下面是它的写法。

GROUP BY column

让我们编写一个查询,要求 SQL 显示每个品牌的产品类型数量。这样的请求看起来像这样:

SELECT brand, COUNT(*)
FROM product
GROUP BY brand

你会得到如下查询结果:

品牌 数数(*)
(无效的) 2个
博世 4个
宜家 6个
LG 2个
聪明花 1个

我们仔细分析一下,我们写了什么样的请求,得到了什么样的结果。结果,我们看到两列。第一个带有品牌列表,这是合乎逻辑的。我们想要得到类似一对“品牌 --> 数量”的东西。

请注意,品牌名称中有一个词NULL。的确,我们有写它的品牌的产品NULL,我们在这里看到它们。有点出乎意料,但很有帮助。我们可以看到有多少无品牌产品。

现在让我们仔细看看这个请求。我们想知道每个品牌的产品数量,所以我们写了GROUP BY brand,在SELECT我们写了品牌和表达COUNT(*)

COUNT(*)是对一组行执行的所谓聚合函数。在我们的案例中,她只是数数它们的数量。有很多这样的函数,我们稍后再看。

3.2 使用 GROUP BY 的复杂查询

现在让我们写一个查询,我们首先丢弃价格小于 10 的产品,然后对它们进行分组。这样的请求看起来像这样:

SELECT brand, COUNT(*)
FROM product
WHERE price > 10
GROUP BY brand

你会得到如下查询结果:

品牌 数数(*)
博世 4个
宜家 5个
LG 2个
聪明花 1个

所有 NULL 产品都从我们的结果表中消失了,因为它们非常便宜,宜家产品的数量减少了 1。从 6 到 5。

这建议您首先应用WHERE所需的行进行过滤,然后才将分组应用于结果。

3.3 结果的列名

顺便说一下,您可以为结果列命名。查看服务器如何建议名称count(*)?让我们用总计代替它。这样的请求看起来像这样:

SELECT brand, COUNT(*) AS total
FROM product
WHERE price > 10
GROUP BY brand

你会得到如下查询结果:

品牌 全部的
博世 4个
宜家 5个
LG 2个
聪明花 1个

您还可以重命名现有列。让我们采用以前使用的查询之一并向列添加新名称。

SELECT
id AS  product_id,
name AS product_name,
price
FROM product
WHERE price < 20 AND brand IS NOT NULL

你会得到如下查询结果:

产品编号 产品名称 价格
2个 椅子 5.00
8个 15.00