前言
distinct 意思是不同的,那么select distinct就是找出不同的数据,即实现简单去重;
目录
- distinct 语句介绍
- distinct 语句例子
- distinct 和 group by的区别
正文
1. distinct 语句介绍
语句格式如下:
select distinct column1, ... from table where filter... order by column1 desc
-
其中column1为字段名,如果指定一个,则基于这个字段来查找不同的数据;如果指定多个,则组合多个字段来查找不同的数据;
-
distinct作用于where之后,order by之前:即先通过where过滤数据,再从过滤后的数据中查找不同的数据,最后再排序;
-
流程如下图所示:
2. distinct 例子
假设有如下所示的数据库 s_user;
- 下面我们先不用 distinct 进行查询:过滤条件为 名字以
jalon
开头的用户
select * from s_user where name like 'jalon%'
输出结果如下:
可以看到,三条数据都返回了,其中有名字重复的,也有年龄重复的;
-
下面我们用 distinct 查询名字不同的数据:基于单个字段进行去重
select distinct name from s_user where name like 'jalon%'
输出结果如下:
可以看到,刚才名字重复的数据,name=jalon2之前有两条,现在只剩一条了,这就是distinct的功劳:去重,找出不同的数据
-
下面我们再用 distinct 查询名字和年龄都不同的数据:基于多个字段进行去重
select distinct name, age from s_user where name like 'jalon%'
输出结果如下:
可以看到,三条数据都返回了:这是因为现在判断不同数据的条件增加了(多了age字段),即name和age都一致时,才认为是不同的数据;
如果distinct指定的字段值为NULL,则只会返回一条指定字段值为Null的数据,其他的Null数据会被排除掉
3. distinct 和 group by的区别
distinct用来查找不同的数据(去重),group by用来对数据进行分组(分组);
两者都可以用来查找不同的数据,区别是:
- 前者distinct只能返回指定的字段
- 而group by可以返回所有的字段,且多搭配聚合函数(比如sum等求和函数)进行使用:
以上面的s_user表为例,如果查找name不同的数据,前者只能返回不同的name值,而后者可以返回s_user表中的所有字段值,如下所示:
-
distinct查找name字段不同的数据:只能返回name字段的值
-
group by 查找name字段不同的数据:可以返回所有数据,而且可以进行聚合操作
总结
- distinct可以用来对指定的字段进行去重(单个或多个字段都可以)
- distinct对于字段值为NULL的数据 也可以去重;去重后只剩一条NULL数据
- distinct和group by侧重点不同:前者侧重对指定字段去重并返回指定字段的值;后者侧重对指定字段分组并配合聚合函数进行下一步操作
评论区