mysql中distinct的学习

背景

今年给自己定下的基调就是要好好学一下数据库相关的知识,所以今天也开始弃用各类ORM框架,使用原生的sql来干一些活。这次遇到的问题就是一个去重查询的问题。

过程

去重查询,我第一个想到的就是group by。这个方法是可以去重的。

SELECT count(tag_id) FROM xx.xx GROUP BY tag_id;

结果看到的数据是每一个不同的tag_id的计数。类似下面这样的数据:

count(tag_id)
1
1
1
1
4
1
6

这样的数据显然不是我需要的,我要的数据是统计不同类型的tag_id有多少个,而不是每种tag_id有多少条记录。

经过搜索发现,distinct能满足我的要求。上面的sql改为:

SELECT count(distinct tag_id) FROM xx.xx GROUP BY tag_id;

这样的查询结果就是我想要的。

后续

问题虽然是解决了,但是抱着学习的心态,看了一下distinct相关的内容。

distinct翻译过来就是 不同的 类似的意思。

我是把它跟聚合函数count放在一起使用了,如果单独使用,其实就是去重的结果。

如果不使用count来统计总数,直接使用distinct,这个结果与group by都是去重的记录。区别就是排序不一样。group by会执行排序,而distinct不会执行排序。

如果查询的结果带上limit子句的话,distinctgroup by都会返回对应的limit数量,不过group by的结果也是排序后的结果。

性能

distinctgroup by功能类似。我查了一下资料。

DISTINCT:这种方式会将全部内容存储在一个hash结构里,最后通过计算hash结构中key的个数即可得到结果,典型的以空间换取时间的方式。
GROUP BY:这种方式是先将字段排序(一般使用sort),然后进行计数,典型的以时间换取空间。

根据这个说法,数据离散程度越大,用group by的方式就更高效,反之则是distinct更高效。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这一篇最主要是记录下命令,方便以后查找 使用Mysql 创建数据库 create database mysql_t...
    Treehl阅读 602评论 0 0
  • 一. Java基础部分.................................................
    wy_sure阅读 3,839评论 0 11
  • 2017/3/14 RDBMS:关系型数据库管理系统 关系模型独立于语言 SQL有几种不同类型的语言:数据定义语言...
    ancherl阅读 1,659评论 0 6
  • 表 存储在表中的数据是同一种类型的数据或清单。 数据库中的表有为一个名字来标识自己。 表具有一些特性,这些特性定义...
    蛐蛐囍阅读 1,343评论 0 7
  • 7_5-网络地址转换-Easyip easy-ip是NAT五个实验之一,其配置简单的特点,使得大量使用。 实现思想...
    Enomothem阅读 546评论 0 0