SQL DISTINCT 子句

在本教程中,你将学习如何从结果集中删除重复值。

检索不同的值

从数据库表中获取数据时,结果集可能包含重复的行或值。如果要删除这些重复值,可以直接在 SELECT 关键字后面指定 DISTINCT 关键字,如下所示:

语法

DISTINCT 子句用于从结果集中删除重复的行:

SELECT DISTINCT column_list FROM table_name ; 

这里,column_list 是一个逗号分隔的列表,列出了要获取其值的数据库表(例如,*名称*, *年龄*, *国家*等) 的列或字段名称。

注意: 除了处理空值的方式外,该 DISTINCT 子句的行为与 UNIQUE 约束类似。两个值 NULL 被认为是唯一的,而同时它们不被认为是彼此不同的。

让我们看一些示例来说明它是如何工作的。

假设我们的数据库中有一个 customers 表,其中包含以下记录:

+---------+--------------------+-----------+-------------+
| cust_id | cust_name          | city      | postal_code |
+---------+--------------------+-----------+-------------+
|       1 | Maria Anders       | Berlin    | 12209       |
|       2 | Fran Wilson        | Madrid    | 28023       |
|       3 | Dominique Perrier  | Paris     | 75016       |
|       4 | Martin Blank       | Turin     | 10100       |
|       5 | Thomas Hardy       | Portland  | 97219       |
|       6 | Christina Aguilera | Madrid    | 28001       |
+---------+--------------------+-----------+-------------+

现在执行以下语句,该语句返回此表的 city 列中的所有行。

SELECT city FROM customers;

执行后,你将获得如下输出:

+-----------+
| city      |
+-----------+
| Berlin    |
| Madrid    |
| Paris     |
| Turin     |
| Portland  |
| Madrid    |
+-----------+

如果你仔细看输出,你会发现我们的结果集中出现了两次 Madrid,这是不好的。好吧,让我们解决这个问题。

删除重复数据

以下 DISTINCT 语句用于生成 customers 表中所有城市的列表。

SELECT DISTINCT city FROM customers;

执行上面的命令后,你会得到这样的输出:

+-----------+
| city      |
+-----------+
| Berlin    |
| Madrid    |
| Paris     |
| Turin     |
| Portland  |
+-----------+

如你所见,我们的结果集中没有重复值。

注意: 如果对具有多个 NULL 值的列使用 SELECT DISTINCT 语句,则 SQL 会保留一个 NULL 值并从结果集中删除其他值,因为 DISTINCT 将所有 NULL 值视为相同的值。