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 |
GO TO FULL VERSION