统计不重复值
在实践中使用 COUNT(DISTINCT ...)
统计不重复值 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
为什么要统计唯一值
使用 COUNT(*) 时,您会统计每一行——包括重复行。但有时您只想知道某一列中存在多少个不同的值。
例如:您的客户来自多少个不同的国家?上个月订购了多少种不同的产品?这正是 COUNT(DISTINCT ...) 的用武之地。
设置示例表
让我们创建一个订单表来进行练习。每笔订单都有客户姓名、产品和国家。
请注意,有些客户和国家出现了不止一次——这是有意安排的,这样我们就能看到统计所有行与统计唯一值之间的差异。
CREATE TABLE orders (
id INT,
customer VARCHAR(50),
product VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO orders VALUES
(1, 'Alice', 'Laptop', 'USA'),
(2, 'Bob', 'Phone', 'UK'),
(3, 'Alice', 'Tablet', 'USA'),
(4, 'Carol', 'Laptop', 'Canada'),
(5, 'Bob', 'Laptop', 'UK'),
(6, 'Dave', 'Phone', 'USA'),
(7, 'Carol', 'Phone', 'Canada'),
(8, 'Eve', 'Tablet', 'Germany');COUNT(*) 与 COUNT(DISTINCT) 的比较
运行两个查询并比较结果。COUNT(*) 返回 8——每一行计一个。COUNT(DISTINCT 客户) 返回 5——因为只有 5 位唯一客户(爱丽丝、鲍勃、卡罗尔、戴夫、伊芙)。
核心思想是:COUNT(DISTINCT column) 会忽略重复值,只统计唯一值。
SELECT COUNT(*) AS total_orders,
COUNT(DISTINCT customer) AS unique_customers
FROM orders;统计唯一国家数
让我们找出客户来自多少个不同的国家。虽然订单表有 8 行,但其中几行属于同一个国家。
结果会是 4——USA、UK、加拿大和德国,无论每个国家出现多少次。
SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;统计唯一产品数
我们可以将同样的模式应用于任何列。这里我们要统计订购过多少种不同的产品。
即使“笔记本电脑”出现三次、“手机”出现三次,每种产品也只会统计一次。答案是 3:笔记本电脑、手机和平板电脑。
SELECT COUNT(DISTINCT product) AS unique_products
FROM orders;将 COUNT(DISTINCT) 与 WHERE 结合使用
您可以将 COUNT(DISTINCT ...) 与 WHERE 子句结合使用,在统计前缩小行的范围。这里我们要统计仅由 USA 客户订购的唯一产品数。
只有 country = 'USA' 的行会被考虑,然后我们会统计这些行中的唯一产品。
SELECT COUNT(DISTINCT product) AS usa_unique_products
FROM orders
WHERE country = 'USA';COUNT(DISTINCT) 与 GROUP BY
与 GROUP BY 配合使用时,COUNT(DISTINCT ...) 会为每个分组提供唯一值计数。此查询回答了这样一个问题:每个国家有多少位不同的客户下过订单?
每个分组都会独立处理,因此会先移除分组内的重复值,再进行统计。
SELECT country,
COUNT(DISTINCT customer) AS unique_customers
FROM orders
GROUP BY country
ORDER BY unique_customers DESC;统计多列中的唯一值
您可以在同一个 SELECT 中使用多个 COUNT(DISTINCT ...) 表达式。这样,您就能在一个查询中快速了解基数——每列包含多少个唯一值。
基数是探索新数据集时一个很有用的指标。
SELECT COUNT(DISTINCT customer) AS unique_customers,
COUNT(DISTINCT product) AS unique_products,
COUNT(DISTINCT country) AS unique_countries
FROM orders;NULL 的处理方式
与常规的 COUNT(列) 一样,COUNT(DISTINCT column) 会忽略 NULL 值。NULL 不会被计为一个唯一值。
在此示例中,有两行的国家为 NULL。结果仍然是 4 个不同的非 NULL 国家,而不是 5 个。
INSERT INTO orders VALUES
(9, 'Frank', 'Phone', NULL),
(10, 'Grace', 'Laptop', NULL);
SELECT COUNT(DISTINCT country) AS unique_countries_no_null
FROM orders;COUNT(*)、COUNT(列) 与 COUNT(DISTINCT 列) 的比较
将 COUNT 的三种形式并列查看会很有帮助:
- COUNT(*)——统计每一行,包括 NULL
- COUNT(国家)——统计国家不为 NULL 的行
- COUNT(DISTINCT 国家)——统计唯一的非 NULL 国家值
请在更新后的表上运行此查询(现在有 10 行,其中 2 行的国家为 NULL),以确认它们之间的差异。
SELECT COUNT(*) AS total_rows,
COUNT(country) AS non_null_countries,
COUNT(DISTINCT country) AS unique_countries
FROM orders;实际应用场景:每日活跃用户
在分析中,COUNT(DISTINCT ...) 最常见的用途之一是统计每日活跃用户(DAU)。您有一份事件日志,想知道每天有多少位唯一用户处于活跃状态。
按日期 GROUP BY 并使用 COUNT(DISTINCT 用户标识),即可获得每天的唯一用户数——同一用户多次点击产生的重复记录会自动排除。
CREATE TABLE user_events (
event_date DATE,
user_id INT
);
INSERT INTO user_events VALUES
('2024-01-01', 1), ('2024-01-01', 2), ('2024-01-01', 1),
('2024-01-02', 2), ('2024-01-02', 3), ('2024-01-02', 2),
('2024-01-03', 1), ('2024-01-03', 4);
SELECT event_date,
COUNT(DISTINCT user_id) AS daily_active_users
FROM user_events
GROUP BY event_date
ORDER BY event_date;快速检查
请通过下面的问题测试您对 COUNT(DISTINCT ...) 的理解。
课程回顾
做得很好!以下是您对 COUNT(DISTINCT ...) 的学习总结:
COUNT(DISTINCT column)只统计列中唯一的非 NULL 值。- 它不同于
COUNT(*)(所有行)和COUNT(column)(非 NULL 行)。 - 它可以与 WHERE 配合,在统计前筛选行。
- 它可以与 GROUP BY 配合,统计每个分组中的唯一值。
- NULL 值始终会从唯一值统计中排除。
- 同一个 SELECT 中可以出现多个
COUNT(DISTINCT ...)表达式。 - 常见的实际应用包括统计唯一用户、产品、国家和会话数。
掌握此函数后,您将拥有一个用于数据探索和分析的强大工具。
常见问题解答
「统计不重复值」课时是免费的吗?
是的 — 「统计不重复值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「统计不重复值」这节课中我会学到什么?
在实践中使用 COUNT(DISTINCT ...) 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「统计不重复值」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。