摘要:在本教程中,您将学习如何在SELECT
语句中使用 MySQL DISTINCT
子句来消除结果集中的重复行。
MySQL DISTINCT 子句简介
从表中查询数据时,可能会得到重复的行。要删除这些重复行,请在SELECT
语句中使用DISTINCT
子句。
以下是DISTINCT
子句的语法:
SELECT DISTINCT
select_list
FROM
table_name
WHERE
search_condition
ORDER BY
sort_expression;
Code language: SQL (Structured Query Language) (sql)
在此语法中,您可以在SELECT DISTINCT
关键字之后指定要选择不同值的一列或多列。
如果指定一列, DISTINCT
子句将根据该列的值评估行的唯一性。
但是,如果指定两列或更多列, DISTINCT
子句将使用这些列的值来评估行的唯一性。
当执行带有DISTINCT
子句的SELECT
语句时,MySQL 会计算FROM
、 WHERE
和SELECT
子句之后、 ORDER BY
子句之前的DISTINCT
子句:
MySQL DISTINCT 子句示例
我们将使用示例数据库中的employees
表:

首先,使用以下SELECT
语句从employees
表中选择姓氏:
SELECT
lastname
FROM
employees
ORDER BY
lastname;
Code language: SQL (Structured Query Language) (sql)
+-----------+
| lastname |
+-----------+
| Bondur |
| Bondur |
| Bott |
| Bow |
| Castillo |
| Firrelli |
| Firrelli |
| Fixter |
....
| Jones |
| Patterson |
| Patterson |
| Patterson |
| Thompson |
...
+-----------+
23 rows in set (0.00 sec)
Code language: plaintext (plaintext)
如输出中清楚所示,一些员工具有相同的姓氏,例如Bondur,Firrelli
。
其次,通过添加DISTINCT
子句来选择唯一的姓氏,如下所示:
SELECT
DISTINCT lastname
FROM
employees
ORDER BY
lastname;
Code language: SQL (Structured Query Language) (sql)
从输出中可以清楚地看到, DISTINCT
子句从结果集中删除了重复的姓氏。
+-----------+
| lastname |
+-----------+
| Bondur |
| Bott |
| Bow |
| Castillo |
| Firrelli |
...
| Nishi |
| Patterson |
| Thompson |
| Tseng |
| Vanauf |
+-----------+
19 rows in set (0.01 sec)
Code language: plaintext (plaintext)
MySQL DISTINCT 和 NULL 值
当您在DISTINCT
子句中指定具有NULL
值的列时, DISTINCT
子句将仅保留一个NULL
值,因为它认为所有NULL
值都是相同的。
例如, customers
表中的 state 列具有NULL
值。

当您使用DISTINCT
子句查询状态时,您将看到不同的状态和NULL
,如下所示:
SELECT DISTINCT state
FROM customers;
Code language: SQL (Structured Query Language) (sql)
+---------------+
| state |
+---------------+
| NULL |
| NV |
| Victoria |
| CA |
| NY |
| PA |
...
| Co. Cork |
| Pretoria |
| NH |
| Tokyo |
+---------------+
19 rows in set (0.00 sec)
Code language: plaintext (plaintext)
MySQL DISTINCT 具有多列
当您在DISTINCT
子句中指定多个列时, DISTINCT
子句将使用这些列中的值的组合来确定结果集中的行的唯一性。
例如,要从customers
表中获取城市和州的唯一组合,请使用以下查询:
SELECT DISTINCT
state, city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY
state,
city;
Code language: SQL (Structured Query Language) (sql)
+---------------+----------------+
| state | city |
+---------------+----------------+
| BC | Tsawassen |
| BC | Vancouver |
| CA | Brisbane |
| CA | Burbank |
| CA | Burlingame |
| CA | Glendale |
| CA | Los Angeles |
| CA | Pasadena |
| CA | San Diego |
...
Code language: plaintext (plaintext)
如果没有DISTINCT
子句,您将获得州和城市的重复组合,如下所示:
SELECT
state, city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY
state ,
city;
Code language: SQL (Structured Query Language) (sql)
+---------------+----------------+
| state | city |
+---------------+----------------+
| BC | Tsawassen |
| BC | Vancouver |
| CA | Brisbane |
| CA | Burbank |
..
| CA | San Francisco |
| CA | San Francisco |
...
| MA | Boston |
| MA | Boston |
| MA | Brickhaven |
| MA | Brickhaven |
| MA | Brickhaven |
...
| NY | NYC |
| NY | NYC |
| NY | NYC |
| NY | NYC |
| NY | NYC |
...
Code language: plaintext (plaintext)
概括
- 使用 MySQL
DISTINCT
子句从SELECT
子句返回的结果集中删除重复行。