1. 首页
  2. mysql基础

01-一、记不住的 MySQL DISTINCT 的用法 ( 上 )

即使在自己记忆力最好的时候,也是记不住 MySQL DISTINCT 的用法。我一直对这个记不住好奇,想不明白,为什么。

前几天翻 MySQL 手册,看到 DISTINCT 又发现自己似乎忘记。

我真的忘记了吗 ?

好像也没有,就是会混淆,到底 DISTINCT 要不要加括号 () ,不加括号又是什么情况呢 ? 这两个记不住

范例数据

在继续之前,我们先需要一个 MySQL 服务器和服务器上的一个 test 数据库中的一个 fruits

创建表和数据的语句如下


CREATE DATABASE IF NOT EXISTS test default character set utf8mb4 collate utf8mb4_unicode_ci; use test; CREATE TABLE IF NOT EXISTS `fruits`( `id` INT UNSIGNED AUTO_INCREMENT, `user` VARCHAR(64) NOT NULL, `fruit` VARCHAR(128) NOT NULL, `owns` INTEGER(11) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO fruits(user,fruit,owns) VALUES ('penglei','apple',3), ('penglei','banana',5), ('penglei','peach',3), ('hero','apple',3), ('hero','peach',3), ('hero','pear',5);

运行完语句后,fruits 表显示数据如下


mysql> SELECT * FROM fruits; +----+-------+--------+------+ | id | user | fruit | owns | +----+-------+--------+------+ | 1 | penglei | apple | 3 | | 2 | penglei | banana | 5 | | 3 | penglei | peach | 3 | | 4 | hero | apple | 3 | | 5 | hero | peach | 3 | | 6 | hero | pear | 5 | +----+-------+--------+------+

MySQL DISTINCT 的作用

我们先来看看 MySQL DISTINCT 的作用,其实就是几个字

「 排除重复的行 」

但是,就是因为字少,没有给个限定,如何排除重复的行呢 ?

答案是

「 根据参数所指定的列排除重复的行 」

坑来了,DISTINCT 有带括号和没括号的两种用法,这两种是如何指定参数的呢 ?

等等… 这个官方没给答案…,我们使用过程中发现

1、 如果跟其它函数结合使用,那么只会使用小括号内的参数
2、 否则,那么 DISTINCT 关键字后的所有列都是参数

MySQL DISTINCT 的位置

千万不要认为 DISTINCT 只能放在开头,也不要认为 DISTINCT 可以放在任意位置。

这个关键字的位置是有讲究的:

1. 单独的 DISTINCT 关键字只能放在开头,放在其它位置会报错

比如我们要根据 user 来获取不重复的行,如果像下面这样把 DISTINCT 放在中间是会报错的


mysql> SELECT id, DISTINCT ( user ),fruit,owns FROM fruits; ERROR 1064 (42000): 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 ( user ),fruit,owns FROM fruits' at line 1

但如果放在开头,则不会


mysql> SELECT DISTINCT ( user ),id,fruit,owns FROM fruits; +-------+----+--------+------+ | user | id | fruit | owns | +-------+----+--------+------+ | penglei | 1 | apple | 3 | | penglei | 2 | banana | 5 | | penglei | 3 | peach | 3 | | hero | 4 | apple | 3 | | hero | 5 | peach | 3 | | hero | 6 | pear | 5 | +-------+----+--------+------+

好诡异的用法,好诡异的结果 ( 为啥数据会全部显示 ?)

2. 但如果是配合其它的函数使用,比如 COUNT() 则可以任意位置

其实这句话不严谨,应该是其它函数可以任意位置时,DISTINCT 也可以任意位置


mysql> SELECT COUNT(DISTINCT ( user )),fruit FROM fruits; +--------------------------+-------+ | COUNT(DISTINCT ( user )) | fruit | +--------------------------+-------+ | 2 | apple | +--------------------------+-------+

好诡异的结果!!!!

COUNT(DISTINCT ( user )) 放在末尾以一样


mysql> SELECT fruit, COUNT(DISTINCT ( user )) FROM fruits; +-------+--------------------------+ | fruit | COUNT(DISTINCT ( user )) | +-------+--------------------------+ | apple | 2 | +-------+--------------------------+ row in set (0.00 sec)

这个结果简直诡异到怀疑人生?

至于为什么会这样,我们下一章节再来解释

希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:01-一、记不住的 MySQL DISTINCT 的用法 ( 上 )

    链接:https://www.javajike.com/article/1617.html

« 02-二、记不住的 MySQL DISTINCT 的用法 ( 下 )
12-十二、MySQL 面试题 InnoDB 创建 InnoDB 表»

相关推荐

QR code