⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《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 对*的处理