轻松上手,快乐学习!

MySQL 教程

MySQL 首页MySQL 介绍MySQL 安装MySQL 实例库下载MySQL 实例库导入MySQL SELECTMySQL DISTINCTMySQL ORDER BYMySQL WHEREMySQL ANDMySQL ORMySQL INMySQL BETWEENMySQL LIKEMySQL LIMITMySQL IS NULLMySQL 别名MySQL JOINSMySQL INNER JOINMySQL LEFT JOINMySQL RIGHT JOINMySQL CROSS JOINMySQL SELF JOINMySQL GROUP BYMySQL HAVINGMySQL ROLLUPMySQL 子查询MySQL 派生表MySQL EXISTSMySQL CTEMySQL 递归 CTEMySQL UNIONMySQL INTERSECTMySQL MINUSMySQL INSERTMySQL INSERT INTO SELECTMySQL INSERT IGNOREMySQL UPDATEMySQL UPDATE JOINMySQL DELETEMySQL ON DELETE CASCADEMySQL DELETE JOINMySQL REPLACEMySQL PREPAREMySQL 事务MySQL 表锁定MySQL USEMySQL 数据库管理MySQL CREATE DATABASEMySQL DROP DATABASEMySQL 存储引擎MySQL CREATE TABLEMySQL 序列MySQL ALTER TABLEMySQL RENAME TABLEMySQL DROP COLUMNMySQL ADD COLUMNMySQL DROP TABLEMySQL 临时表MySQL TRUNCATE TABLEMySQL 数据类型MySQL NOT NULLMySQL Primary KeyMySQL Foreign KeyMySQL UNIQUEMySQL CHECKMySQL 字符集MySQL 排序规则MySQL 导入 CSVMySQL 导出 CSVMySQL 自然排序MySQL 基础

MySQL 存储过程

MySQL 存储过程介绍MySQL 存储过程实例MySQL 存储过程变量MySQL 存储过程参数MySQL 存储过程返回多值MySQL IF 语句MySQL CASE 语句MySQL IF CASE 选择MySQL 存储过程循环MySQL 存储过程游标MySQL 存储过程列表MySQL 存储过程异常处理MySQL SIGNAL 和 RESIGNALMySQL 存储函数

MySQL 视图

MySQL 视图教程SQL 视图介绍MySQL 视图介绍MySQL 创建视图MySQL 可更新视图WITH CHECK OPTIONLOCAL&CASCADEDMySQL 视图管理

MySQL 触发器

MySQL 触发器SQL 触发器MySQL 触发器介绍MySQL 触发器的创建MySQL 创建多个触发器MySQL 触发器管理MySQL 计划事件MySQL事件修改

MySQL 索引

MySQL 索引MySQL 索引创建MySQL 索引删除MySQL 显示索引MySQL 唯一索引MySQL 前缀索引MySQL 隐形索引MySQL 降序索引MySQL 复合索引MySQL 聚集索引MySQL 索引基数MySQL USE INDEXMySQL 强制索引

MySQL 管理

MySQL 管理MySQL访问控制系统MySQL 用户创建MySQL 用户密码MySQL 权限授予MySQL 权限撤销MySQL 角色MySQL 删除用户MySQL 表维护mysqldump 备份工具MySQL 数据库列表MySQL 表列表MySQL 表字段列表MySQL 用户列表MySQL 进程列表MySQL 列生成比较MySQL中同一表中的连续行

MySQL 全文搜索

MySQL 全文搜索MySQL 全文搜索介绍FULLTEXT索引MySQL 自然语言全文搜索MySQL 布尔全文搜索MySQL查询扩展MySQL ngram

MySQL 高级

MySQL 函数MySQL 窗口函数

MySQL 技巧

MySQL 查找重复数据MySQL 删除重复数据MySQL UUIDMySQL 表的复制MySQL 复制库MySQL 变量MySQL SELECT INTO 变量MySQL 表的存储引擎MySQL 使用正则查询MySQL 添加序号MySQL 随机查询MySQL 查询第 N 高记录MySQL 重置自增值MySQL VS MariaDBMySQL 间隔值MySQL 获取当天日期MySQL NULL 映射MySQL 注释理解MySQL EXPLAINMySQL 技巧介绍MySQL COUNTMySQL 数据分层MySQL 两表比较Mysql Like 优化

MySQL 窗口函数

MySQL CUME_DIST() 函数MySQL DENSE_RANK() 函数MySQL FIRST_VALUE 函数MySQL LAG() 函数MySQL LAST_VALUE() 函数MySQL LEAD 函数MySQL NTH_VALUE 函数MySQL NTILE 函数MySQL PERCENT_RANK 函数MySQL RANK 函数MySQL ROW_NUMBER 函数

MySQL 应用

MySQL应用程序编程接口PHP MySQL教程PHP 数据库连接

MySQL 优化

mysqld 内存持续变高


MySQL DISTINCT 子句


简介:在本教程中,您将学习如何在语句中使用 MySQL DISTINCT 子句来消除结果集中的重复行。


MySQL DISTINCT子句简介

从表中查询数据时,可能会出现重复的行。要删除这些重复的行,在SELECT子句中请使用DISTINCT 语句。

使用DISTINCT 子句的语法如下:

SELECT DISTINCT
    columns
FROM
    table_name
WHERE
    where_conditions;

MySQL的DISTINCT例子

让我们看一个使用DISTINCT 子句从employees表中选择员工唯一姓氏的简单实例。

+----------------+
| employees      |
+----------------+
| employeeNumber |
| lastName       |
| firstName      |
| extension      |
| email          |
| officeCode     |
| reportsTo      |
| jobTitle       |
+----------------+
8 rows in set (0.02 sec)

首先,employees使用SELECT语句从表中查询员工的姓氏:

SELECT
  lastname
FROM
  employees
ORDER BY lastname;

运行结果:

+-----------+
| lastname  |
+-----------+
| Bondur    |
| Bondur    |
| Bott      |
| Bow       |
| Castillo  |
| Firrelli  |
| Firrelli  |
...

在结果中我们可以清楚的看到一些员工具有相同的姓氏,例如,  Bondur,Firrelli

要删除重复的姓氏,请将DISTINCT 子句添加到SELECT 语句中,如下所示:

SELECT DISTINCT 
    lastname 
FROM 
    employees 
ORDER BY lastname;

运行结果:

+-----------+
| lastname  |
+-----------+
| Bondur    |
| Bott      |
| Bow       |
| Castillo  |
| Firrelli  |
| Fixter    |
...

当我们使用DISTINCT 子句时,结果集中将删除重复的姓氏。


MySQL DISTINCT 和 NULL值

如果字段中有NULL值并且要对该列使用DISTINCT 子句,则MySQL仅保留一个NULL值,因为DISTINCT 子句将所有NULL值视为相同的值。

例如,在customers表中,我们有许多行,其  state列中包含有NULL值。

+------------------------+
| customers              |
+------------------------+
| customerNumber         |
| customerName           |
| contactLastName        |
| contactFirstName       |
| phone                  |
| addressLine1           |
| addressLine2           |
| city                   |
| state                  |
| postalCode             |
| country                |
| salesRepEmployeeNumber |
| creditLimit            |
+------------------------+
13 rows in set (0.01 sec)

当您使用DISTINCT子句查询客户的状态时,您将看到state中只有唯一个NULL值,并作为以下查询:

SELECT DISTINCT
    state
FROM
    customers;

运行结果:

+---------------+
| state         |
+---------------+
| NULL          |
| NV            |
| Victoria      |
| CA            |
| NY            |
| PA            |
...

MySQL DISTINCT 多列

您可以将DISTINCT 子句与多个列一起使用。在这种情况下,MySQL使用这些列中的值组合来确定结果集中行的唯一性。

例如,要从customers表中获取城市和州的唯一组合,请使用以下查询:

SELECT DISTINCT
	state,city 
FROM
	customers 
WHERE
	state IS NOT NULL 
ORDER BY
	state,city;

运行结果:

+---------------+----------------+
| state         | city           |
+---------------+----------------+
| BC            | Tsawassen      |
| BC            | Vancouver      |
| CA            | Brisbane       |
| CA            | Burbank        |
| CA            | Burlingame     |
| CA            | Glendale       |
| CA            | Los Angeles    |
| CA            | Pasadena       |
...

如果没有DISTINCT 语句,您将获得州和城市的重复组合,如下所示:

SELECT 
    state, city 
FROM 
    customers 
WHERE 
    state IS NOT NULL 
ORDER BY state, city;

运行结果:

+---------------+----------------+
| state         | city           |
+---------------+----------------+
| BC            | Tsawassen      |
| BC            | Vancouver      |
| CA            | Brisbane       |
| CA            | Burbank        |
| CA            | Burlingame     |
| CA            | Glendale       |
| CA            | Los Angeles    |
| CA            | Pasadena       |
...

DISTINCT语句与GROUP BY 语句

如果在不使用聚合函数的情况下在SELECT语句中使用GROUP BY子句,则GROUP BY子句的行为与DISTINCT 子句类似。

以下语句使用GROUP BY子句从customers表中选择客户的唯一状态。

SELECT state
FROM
    customers
GROUP BY state;

运行结果:

+---------------+
| state         |
+---------------+
| NULL          |
| BC            |
| CA            |
| Co. Cork      |
| CT            |
| Isle of Wight |
...

您可以使用以下DISTINCT子句获得同样的结果:

SELECT DISTINCT
    state 
FROM
    customers;

运行结果:

+---------------+
| state         |
+---------------+
| NULL          |
| NV            |
| Victoria      |
| CA            |
| NY            |
| PA            |
| CT            |
| MA            |
...

一般来说,DISTINCT 语句是GROUP BY语句的特殊情况。之间的区别DISTINCT 条款,GROUP BY条款是GROUP BY条款排序结果集,而DISTINCT 条款不。

如果将ORDER BY子句添加到使用DISTINCT子句的语句中  ,则结果集将进行排序,并且与使用GROUP BY子句的语句返回的结果集相同。

SELECT DISTINCT
    state 
FROM
    customers 
ORDER BY state;

运行结果:

+---------------+
| state         |
+---------------+
| NULL          |
| BC            |
| CA            |
| Co. Cork      |
| CT            |
| Isle of Wight |
| MA            |
...

MySQL DISTINCT和聚合函数

您可以将DISTINCT子句与聚合函数(例如,SUMAVGCOUNT )一起使用,将聚合函数应用于结果集之前删除重复的行。

例如,要计算美国客户的不同的州数,请使用以下查询:

SELECT
    COUNT(DISTINCT state)
FROM
    customers 
WHERE
    country = 'USA';

运行结果:

+-----------------------+
| COUNT(DISTINCT state) |
+-----------------------+
|                     8 |
+-----------------------+
1 row in set (0.00 sec)

MySQL DISTINCT 和 LIMIT子句

如果您将DISTINCT 子句与LIMIT子句一起使用,MySQL会在找到LIMIT子句中指定的唯一行数时立即停止搜索。

以下是在 customers表中查询选择前五个非null唯一州。

SELECT DISTINCT
    state
FROM
    customers 
WHERE
    state IS NOT NULL LIMIT 5;

运行结果:

+----------+
| state    |
+----------+
| NV       |
| Victoria |
| CA       |
| NY       |
| PA       |
+----------+
5 rows in set (0.00 sec)

在本教程中,我们向您展示了使用MySQL DISTINCT 子句的各种方法,例如消除重复行和计算非NULL值。