MySQL DISTINCT語句去除重複記錄數據

MySQL DISTINCT子句概述

當從表中查詢數據時,可能會獲得重複的行。爲了消除這些重複的行,咱們可在SELECT語句中使用DISTINCT子句。html

DISTINCT子句的語法以下:mysql

SELECT DISTINCT
    columns
FROM
    table_name
WHERE
    where_conditions;

MySQL DISTINCT示例

讓咱們來看看如何使用DISTINCT子句從 employee 表中查詢員工惟一姓名(有同名只顯示一個)的簡單例子。sql

首先,咱們使用SELECT語句從 employee 表查詢員工的姓名,以下所示:函數

SELECT
    employee_name,job_title,office_id
FROM
    employee
ORDER BY employee_name;

執行結果以下所示 - 

上面的結果,有些員工的姓名相同,如這裏有兩個員工叫劉德華,可是他們所在部門和職位都不同。學習

要去除重複的姓名,只須要在SELECT語句中添加DISTINCT子句,以下:spa

SELECT DISTINCT
    employee_name
FROM
    studymysql.employee
ORDER BY employee_name;

執行結果以下所示 - 

咱們使用 DISTINCT 子句以後,重複的姓名(如:劉德華)在結果集中已經消除了,這裏的結果集中只有一個"劉德華"了。code

MySQL DISTINCT和NULL值

若是一個列函有NULL值,在該列上使用DISTINCT子句,MySQL的DISTINCT子句將並消除全部其它的NULL值只保留一個NULL值。htm

例如,在 customer 表中,咱們有不少行的 province  列的值是NULL。當咱們使用DISTINCT子句來查詢客戶的狀態,就會看到一個惟一的NULL值,以下查詢:排序

SELECT DISTINCT
    province
FROM
    studymysql.customer;

執行結果以下所示 - 
教程

MySQL DISTINCT子句與多列

在DISTINCT子句和可使用多個列。在這種狀況下,MySQL使用全部列的組合來肯定結果集中的行的惟一性。

例如,要得到 customer 表中 city 和 province 惟一性組合,可使用下面的查詢:

SELECT DISTINCT
    province,city
FROM
    studymysql.customer
WHERE
    province IS NOT NULL
ORDER BY province,city;

執行結果以下所示 - 

若是不使用DISTINCT子句,會獲得 province 和 city 的重複組合以下:

SELECT
    province,city
FROM
    studymysql.customer
WHERE
    province IS NOT NULL
ORDER BY province,city;

執行結果以下所示,有好些記錄行是重複的 - 

DISTINCT子句 vs. GROUP BY子句

若是在SELECT語句中使用GROUP BY子句,但不使用聚合函數,那麼GROUP BY子句的查詢行爲相似於DISTINCT子句。

下面的語句是使用GROUP BY子句從 customer 表中查詢客戶的惟一省份(province)。

SELECT
    province
FROM
    studymysql.customer
GROUP BY province;

執行結果中已通過濾重複的行,以下所示 - 

也能夠經過使用DISTINCT子句實現相似的效果:

SELECT DISTINCT
    province
FROM
    studymysql.customer;

執行結果中已通過濾重複的行,以下所示 - 

通常來講,DISTINCT子句是GROUP BY子句的一個特例。 GROUP BY子句與DISTINCT子句之間的區別是,在GROUP BY子句對結果集排序,而DISTINCT子句沒有。

若是添加 ORDER BY子句到查詢語句中而且使用DISTINCT子句,那麼能夠對結果集進行排序,這與使用GROUP BY子句在語句中返回的惟一值是同樣的。

SELECT DISTINCT
    province
FROM
    studymysql.customer
ORDER BY province;

執行結果中已通過濾重複的行,以下所示 - 

MySQL DISTINCT和聚合函數

DISTINCT子句能夠與聚合函數一塊兒使用,如:SUMAVG 和 COUNT,在MySQL應用聚合函數到結果集以前去除重複行。

例如,查詢計算省份在 "廣東" 的全部城市數量,可使用如下查詢:

SELECT
    COUNT(DISTINCT city)
FROM
    studymysql.customer
WHERE
    province='廣東';

執行結果(廣東地區的客戶他們分別在:廣州,深圳和珠海這三個城市)以下所示 - 

MySQL DISTINCT 與 LIMIT子句

若是使用DISTINCT子句與LIMIT子句一塊兒查詢,當MySQL查詢出LIMIT子句中指定的惟一的行數後將當即中止搜索。

下面將查詢 customer 表中選擇 ciyt 字段爲非空(NOT NULL)的前5個惟一值。

SELECT DISTINCT
    city
FROM
    studymysql.customer
WHERE
    city IS NOT NULL
LIMIT 5;

執行結果以下所示 - 

在本教程中,咱們已經學習了使用MySQL DISTINCT子句的各類方式,如:消除重複行和計算非NULL值的行數。

相關文章
相關標籤/搜索