當從表中查詢數據時,可能會獲得重複的行。爲了消除這些重複的行,咱們可在SELECT語句中使用DISTINCT
子句。html
DISTINCT子句的語法以下:mysql
SELECT DISTINCT columns FROM table_name WHERE where_conditions;
讓咱們來看看如何使用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
若是一個列函有NULL值,在該列上使用DISTINCT子句,MySQL的DISTINCT子句將並消除全部其它的NULL值只保留一個NULL值。htm
例如,在 customer 表中,咱們有不少行的 province 列的值是NULL。當咱們使用DISTINCT子句來查詢客戶的狀態,就會看到一個惟一的NULL值,以下查詢:排序
SELECT DISTINCT province FROM studymysql.customer;
執行結果以下所示 -
教程
在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;
執行結果以下所示,有好些記錄行是重複的 -
若是在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;
執行結果中已通過濾重複的行,以下所示 -
DISTINCT子句能夠與聚合函數一塊兒使用,如:SUM,AVG 和 COUNT,在MySQL應用聚合函數到結果集以前去除重複行。
例如,查詢計算省份在 "廣東" 的全部城市數量,可使用如下查詢:
SELECT COUNT(DISTINCT city) FROM studymysql.customer WHERE province='廣東';
執行結果(廣東地區的客戶他們分別在:廣州,深圳和珠海這三個城市)以下所示 -
若是使用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值的行數。