《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/lmy86263/article/details/73612020 「lmy86263」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

本文的环境是Windows 10,MySQL版本是5.7.12-log

一、基本使用

distinct一般是用来去除查询结果中的重复记录的,而且这个语句在selectinsertdeleteupdate中只可以在select中使用,具体的语法如下:

select distinct expression[,expression...] from tables [where conditions];1

这里的expressions可以是多个字段。本文的所有操作都是针对如下示例表的:

CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(30) NULL DEFAULT NULL ,
`country` varchar(50) NULL DEFAULT NULL ,
`province` varchar(30) NULL DEFAULT NULL ,
`city` varchar(30) NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)ENGINE=InnoDB
;123456789

这里写图片描述

1.1 只对一列操作

这种操作是最常见和简单的,如下:

select distinct country from person1

结果如下: 这里写图片描述

1.2 对多列进行操作

select distinct country, province from person1

结果如下: 这里写图片描述

从上例中可以发现,distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面,如下语句是错误的:

SELECT country, distinct province from person; // 该语句是错误的1

抛出错误如下:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DISTINCT province from person’ at line 1

1.3 针对NULL的处理

从1.1和1.2中都可以看出,distinctNULL是不进行过滤的,即返回的结果中是包含NULL值的。

1.4 与ALL不能同时使用

默认情况下,查询时返回所有的结果,此时使用的就是all语句,这是与distinct相对应的,如下:

select all country, province from person1

结果如下: 这里写图片描述

1.5 与distinctrow同义

select distinctrow expression[,expression...] from tables [where conditions];1

这个语句与distinct的作用是相同的。

1.6 对*的处理

*代表整列,使用distinct对*操作

sqlselect DISTINCT * from person

相当于

select DISTINCT id, `name`, country, province, city from person;

文章目录
  1. 1. 一、基本使用
    1. 1.1. 1.1 只对一列操作
    2. 1.2. 1.2 对多列进行操作
    3. 1.3. 1.3 针对NULL的处理
    4. 1.4. 1.4 与ALL不能同时使用
    5. 1.5. 1.5 与distinctrow同义
    6. 1.6. 1.6 对*的处理