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
值视为相同的值。