SQL DISTINCT 子句

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

检索不同的值

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

语法

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

SELECT DISTINCT column_list FROM table_name;

在这里,column_list是用逗号分隔的要获取其值的数据库表的列名或字段名的列表(例如nameagecountry等)。

注意: DISTINCT子句的行为类似于UNIQUE约束,除了它对待null的方式不同。 两个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  |
+-----------+

正如您看到的,这次的结果集中没有重复的值。

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