面试了几个程序员,发现他们对于 mysql 的 distinct 关键字都存在错误的理解

2020-07-20 16:01:24 +08:00
 JJstyle

都认为这是一个函数,可以这样用:

select distinct(name), age from test;

目的是给 name 去重。虽然没有报错,但是其实上面的 sql 最终被解析成:

select distinct (name), age from test;

就是说 distinct 不是一个函数,而是 select 的一部分,结果是给 name,age 的组合数据去重,name 加括号在这里没有什么意义。

是那种工作了 3~5 年工作经验的,不知道 v 友们又没有发现这个问题。

7503 次点击
所在节点    MySQL
42 条回复
mightofcode
2020-07-20 16:03:54 +08:00
学到了学到了
yishengyongyi
2020-07-20 16:04:41 +08:00
踩过这个坑
achira
2020-07-20 16:07:00 +08:00
前段时间在公司写 sql 发现了,和 select 的选取字段去重无关。是整体去重。实习生。
XGF
2020-07-20 16:08:32 +08:00
难怪查询语句美化的时候 distinct 和 select 是同一行。
当然我写的时候没加括号,也认为是给 name 去重(捂脸)
学到了,学到了
Xusually
2020-07-20 16:09:20 +08:00
嗯 需要单列去重,但是要读取多列的用 group by
gimp
2020-07-20 16:13:04 +08:00
哈哈,这题我会。
yuk1no
2020-07-20 16:16:56 +08:00
弄不清的可能没怎么学过 SQL
如果 distinct 是单列聚合,其余的列怎么处理?
allAboutDbmss
2020-07-20 16:21:25 +08:00
我做了一个很小的例子 用的是 PosgreSQL
```
psql=# with test (a, b) as ( VALUES (1, 2), (1, 4), (1, 3) ) select distinct(t.a), t.b from test t;
a | b
---+---
1 | 3
1 | 2
1 | 4
(3 rows)

psql=# explain with test (a, b) as ( VALUES (1, 2), (1, 4), (1, 3) ) select distinct(t.a), t.b from test t;
QUERY PLAN
---------------------------------------------------------------------
HashAggregate (cost=0.11..0.14 rows=3 width=8)
Group Key: t.a, t.b
CTE test
-> Values Scan on "*VALUES*" (cost=0.00..0.04 rows=3 width=8)
-> CTE Scan on test t (cost=0.00..0.06 rows=3 width=8)
(5 rows)
```
outerws
2020-07-20 17:02:51 +08:00
@yuk1no 可以用 group by 替代
windyboy
2020-07-20 17:08:15 +08:00
有的时候考知识点并不是很好的方案
毕竟有可能没有遇到过
但并不和能力有直接关联
toyassb
2020-07-20 17:21:18 +08:00
呃,看这个第一反应是 sql 还能这么写
javlib
2020-07-20 17:29:24 +08:00
@allAboutDbmss 所以从 explain,可以看到 group 是对 t.a, t.b 两个字段一起做 group 。
还有就是 with 可以这样用,学到了,谢谢
krixaar
2020-07-20 17:31:29 +08:00
distinct 能这样用的话光语义上都解释不了,name 相同但 age 不同的行只挑其中一个?随机挑?按顺序挑?按什么顺序?
zppass
2020-07-20 17:35:29 +08:00
这种 distinct 一般来说就是单独使用,算个数的话会使用。一般来说像聚合查找的话就是用 group by 来就满足要求了。
dongisking
2020-07-20 17:36:37 +08:00
好奇 lz 是怎么找到答案的
aguesuka
2020-07-20 17:37:49 +08:00
7 楼才是正确思路。"是什么"而不是"为什么",比起什么都不知道,不过是多踩一个坑罢了
HankAviator
2020-07-20 17:51:09 +08:00
@zppass 感觉 distinct 比 group by 资源消耗更大一点
gz911122
2020-07-20 18:00:41 +08:00
卧槽那是有多菜
j0hnj
2020-07-20 18:03:19 +08:00
distinct 与聚合函数一起使用的场景更常见一些,比如 select count(distinct name), select group_concat(distinct score)
lovecy
2020-07-20 18:06:32 +08:00
distinct 感觉是出查询结果后再扫描查询结果去重的,`SELECT DISTINCT 字段 FROM 表;`如果字段没有索引就会全表扫描,我的理解就到这里了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/691611

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX