1. 首页
  2. mysql基础

02-二、记不住的 MySQL DISTINCT 的用法 ( 下 )

上一章节我们学习了 SQL DISTINCT 的位置对结果的影响。但我们还没深入到 MySQL DISTINCT 关键字的核心用法,同时,我们也还未讲解 DISTINCT 有无小括号是否有影响等,这些,我们会在这一章节全部讲完。

DISTINCT 中的小括号 ()

SQL 解析器会忽略 DISTINCT 关键字后面的小括号,而把 DISTINCT 关键字后面的所有列都作为唯一条件 」

我们来看看几个实例


mysql> SELECT DISTINCT(user) FROM fruits; +-------+ | user | +-------+ | penglei | | hero | +-------+ rows in set (0.06 sec)

当只有一列时有两条记录


mysql> SELECT DISTINCT(user),fruit FROM fruits; +-------+--------+ | user | fruit | +-------+--------+ | penglei | apple | | penglei | banana | | penglei | peach | | hero | apple | | hero | peach | | hero | pear | +-------+--------+ rows in set (0.00 sec)

当带括号时,user 列放在括号内,fruit 放在括号外,会发现有五条记录,而 fruit 也参与了唯一条件检查


mysql> SELECT DISTINCT(fruit),owns FROM fruits; +--------+------+ | fruit | owns | +--------+------+ | apple | 3 | | banana | 5 | | peach | 3 | | pear | 5 | +--------+------+ rows in set (0.02 sec)

当使用 fruit 时就会有 4 条记录 ,因为有两条 apple 3

但是,如果把 fruitowns 都放在括号内,是会报错的


mysql> SELECT DISTINCT(fruit,owns) FROM fruits; ERROR 1241 (21000): Operand should contain 1 column(s)

好诡异,我暂时还想不到如何解释这种结果

SQL DISTINCT 的基本用法

在日常使用 DISTINCT 关键字时,一般有以下几种

注意: 请留意每种的列的数量

1、单独获取某一列不重复的值

这种情况下,有无小括号的结果是一样的


mysql> SELECT DISTINCT user FROM fruits; +-------+ | user | +-------+ | penglei | | hero | +-------+ mysql> SELECT DISTINCT(user) FROM fruits; +-------+ | user | +-------+ | penglei | | hero | +-------+

2、单独获取某一列不重复值的数量


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

3、以多列作为条件获取不同的值

一定要记住,当你使用多列时,并不仅仅时使用小括号内的列,而是全部列


mysql> SELECT DISTINCT(user),fruit FROM fruits; +-------+--------+ | user | fruit | +-------+--------+ | penglei | apple | | penglei | banana | | penglei | peach | | hero | apple | | hero | peach | | hero | pear | +-------+--------+

有可能你仅仅时想返回唯一的 user 列然后附带 fruit 列,比如你想要的结果是这样的


+-------+--------+ | user | fruit | +-------+--------+ | penglei | apple | | hero | apple | +-------+--------+

单独的 DISTINCT 关键字并不能实现这样的效果,而且也没有任何意义,因为每个 user 都有三条记录,为什么会单独返回 apple ?

如果你真需要这样的结果,有两种方法

1、附带 SQL WHERE 子句 子句


mysql> SELECT DISTINCT(user),fruit FROM fruits WHERE fruit='apple'; +-------+-------+ | user | fruit | +-------+-------+ | penglei | apple | | hero | apple | +-------+-------+

在这种语句下,fruit 返回的值是固定的
2、使用 GROUP BY 子句


mysql> SELECT DISTINCT(user),fruit FROM fruits GROUP BY user; +-------+-------+ | user | fruit | +-------+-------+ | hero | apple | | penglei | apple | +-------+-------+

这种情况下返回的 fruit 是不固定的,虽然,有时候是按照 id 的顺序取值,但并不保障

结束语

只能说,好诡异的 DISTINCT 关键字。使用的时候尽可能的保证列的简单,最好,只使用一列

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

看完两件小事

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

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

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

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

    标题:02-二、记不住的 MySQL DISTINCT 的用法 ( 下 )

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

« 03-三、被 MySQL sql_mode 深深伤害( 上 )
01-一、记不住的 MySQL DISTINCT 的用法 ( 上 )»

相关推荐

QR code