mysql distinct 总是1_记不住的 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 ('yufei','apple',3),

('yufei','banana',5),

('yufei','peach',3),

('hero','apple',3),

('hero','peach',3),

('hero','pear',5);

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

mysql> SELECT * FROM fruits;

+----+-------+--------+------+

| id | user | fruit | owns |

+----+-------+--------+------+

| 1 | yufei | apple | 3 |

| 2 | yufei | banana | 5 |

| 3 | yufei | peach | 3 |

| 4 | hero | apple | 3 |

| 5 | hero | peach | 3 |

| 6 | hero | pear | 5 |

+----+-------+--------+------+

MySQL DISTINCT 的作用

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

「 排除重复的行 」

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

答案是

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

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

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

如果跟其它函数结合使用,那么只会使用小括号内的参数

否则,那么 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 |

+-------+----+--------+------+

| yufei | 1 | apple | 3 |

| yufei | 2 | banana | 5 |

| yufei | 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 |

+-------+--------------------------+

1 row in set (0.00 sec)

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

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

318ea5a4889e17152039a224ce0ac63c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值