Skip to content

sql-distinct-keyword

SQL DISTINCT 关键字用于 SELECT 语句中,以从结果集中移除重复行,确保返回的每一行都是唯一的。

SELECT DISTINCT column1, column2, ...
FROM table_name;

这是最常见的用例。它返回单列中所有唯一值的列表。

假设有一个 CUSTOMERS 表。我们想找出所有客户居住的唯一城市。

-- 假设 CUSTOMERS 表有以下记录:
-- ID | NAME | CITY
-- ---|---------|--------
-- 1 | John | London
-- 2 | Jane | Paris
-- 3 | Peter | London
-- 4 | Mary | New York
-- 此查询将列出客户居住的所有城市
SELECT CITY FROM CUSTOMERS;
-- 结果:London, Paris, London, New York
-- 此查询将只列出唯一的城市
SELECT DISTINCT CITY FROM CUSTOMERS;
-- 结果:London, Paris, New York

当 DISTINCT 与多列一起使用时,它应用于这些列中值的组合。只有当所有选定列中的值与另一行完全相同时,才认为该行是重复的。

让我们从 ORDERS 表中找出 CITY 和 COUNTRY 的唯一组合。

-- 假设 ORDERS 表有:
-- OrderID | City | Country
-- --------|-----------|--------
-- 101 | London | UK
-- 102 | London | USA -- (例如俄亥俄州的伦敦)
-- 103 | Paris | France
-- 104 | London | UK
SELECT DISTINCT City, Country
FROM ORDERS;
-- 结果:
-- City | Country
----------|--------
-- London | UK
-- London | USA
-- Paris | France

请注意,(‘London’, ‘UK’) 在结果中只出现一次,即使它在原始表中出现了两次。(‘London’, ‘USA’) 被视为一个不同的、唯一的组合。

一种非常强大的模式是在 COUNT() 聚合函数内部使用 DISTINCT 来计算列中唯一值的数量。

-- 计算我们的客户来自多少个不同的城市:
SELECT COUNT(DISTINCT CITY) AS NumberOfUniqueCities
FROM CUSTOMERS;

根据我们的第一个示例,这将返回 3。

当使用 DISTINCT 时,SQL 会将所有 NULL 值视为一个组。如果一个列包含多个 NULL 值,它们在结果集中将被合并为一行 NULL。

-- 假设 Products 表中有一些产品没有类别:
-- ProductID | Category
-- ----------|----------
-- 1 | Electronics
-- 2 | Books
-- 3 | NULL
-- 4 | Books
-- 5 | NULL
SELECT DISTINCT Category FROM Products;
-- 结果:
-- Category
------------
-- Electronics
-- Books
-- NULL

SELECT DISTINCT column 在功能上等同于 SELECT column FROM table GROUP BY column。两者都返回该列的唯一值。

  • 当你只是想获取唯一值的列表时,使用 DISTINCT。
  • 当你想要对唯一值组执行聚合函数(如 COUNT、SUM、AVG)时,使用 GROUP BY。GROUP BY 更灵活、更强大。

为了查找唯一值,数据库通常需要对结果集执行排序或哈希操作,这在非常大的表上可能会导致较高的计算开销。如果你选择的列上存在索引,数据库可能会更高效地利用索引来检索唯一值。