侧边栏壁纸
  • 累计撰写 92 篇文章
  • 累计创建 98 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

MySQL-数据过滤之 distinct

汤圆学Java
2022-10-11 / 0 评论 / 0 点赞 / 75 阅读 / 1,296 字
温馨提示:
本文最后更新于 2022-10-11,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

distinct 意思是不同的,那么select distinct就是找出不同的数据,即实现简单去重;

目录

  1. distinct 语句介绍
  2. distinct 语句例子
  3. distinct 和 group by的区别

正文

1. distinct 语句介绍

语句格式如下:

select distinct column1, ... from table where filter... order by column1 desc
  • 其中column1为字段名,如果指定一个,则基于这个字段来查找不同的数据;如果指定多个,则组合多个字段来查找不同的数据;

  • distinct作用于where之后,order by之前:即先通过where过滤数据,再从过滤后的数据中查找不同的数据,最后再排序;

  • 流程如下图所示:

image-20220522102921604

2. distinct 例子

假设有如下所示的数据库 s_user;

image-20220522103216372

  • 下面我们先不用 distinct 进行查询:过滤条件为 名字以jalon开头的用户
select * from s_user where name like 'jalon%'

​ 输出结果如下:

image-20220522103335676

可以看到,三条数据都返回了,其中有名字重复的,也有年龄重复的;

  • 下面我们用 distinct 查询名字不同的数据:基于单个字段进行去重

    select distinct name from s_user where name like 'jalon%'
    

    输出结果如下:

    image-20220522103936531

    可以看到,刚才名字重复的数据,name=jalon2之前有两条,现在只剩一条了,这就是distinct的功劳:去重,找出不同的数据

  • 下面我们再用 distinct 查询名字和年龄都不同的数据:基于多个字段进行去重

    select distinct name, age from s_user where name like 'jalon%'
    

    输出结果如下:

    image-20220522104425585

    可以看到,三条数据都返回了:这是因为现在判断不同数据的条件增加了(多了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字段的值

    image-20220522105451021

  • group by 查找name字段不同的数据:可以返回所有数据,而且可以进行聚合操作

    image-20220522110049660

总结

  1. distinct可以用来对指定的字段进行去重(单个或多个字段都可以)
  2. distinct对于字段值为NULL的数据 也可以去重;去重后只剩一条NULL数据
  3. distinct和group by侧重点不同:前者侧重对指定字段去重并返回指定字段的值;后者侧重对指定字段分组并配合聚合函数进行下一步操作
0

评论区