MySQL DISTINCT

摘要:在本教程中,您将学习如何在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 会计算FROMWHERESELECT子句之后、 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子句返回的结果集中删除重复行。
本教程有帮助吗?