即使在自己记忆力最好的时候,也是记不住 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 |
+——-+————————–+
1 row in set (0.00 sec)
这个结果简直诡异到怀疑人生?
至于为什么会这样,我们下一章节再来解释
干货推荐
附录:MySQL 拾遗:系列文章
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36992.html