都认为这是一个函数,可以这样用:
select distinct(name), age from test;
目的是给 name 去重。虽然没有报错,但是其实上面的 sql 最终被解析成:
select distinct (name), age from test;
就是说 distinct 不是一个函数,而是 select 的一部分,结果是给 name,age 的组合数据去重,name 加括号在这里没有什么意义。
是那种工作了 3~5 年工作经验的,不知道 v 友们又没有发现这个问题。
![]() | 1 mightofcode 2020-07-20 16:03:54 +08:00 学到了学到了 |
2 yishengyongyi 2020-07-20 16:04:41 +08:00 踩过这个坑 |
3 achira 2020-07-20 16:07:00 +08:00 ![]() 前段时间在公司写 sql 发现了,和 select 的选取字段去重无关。是整体去重。实习生。 |
![]() | 4 XGF 2020-07-20 16:08:32 +08:00 ![]() 难怪查询语句美化的时候 distinct 和 select 是同一行。 当然我写的时候没加括号,也认为是给 name 去重(捂脸) 学到了,学到了 |
![]() | 5 Xusually 2020-07-20 16:09:20 +08:00 嗯 需要单列去重,但是要读取多列的用 group by |
![]() | 6 gimp 2020-07-20 16:13:04 +08:00 哈哈,这题我会。 |
![]() | 7 yuk1no 2020-07-20 16:16:56 +08:00 via iPhone ![]() 弄不清的可能没怎么学过 SQL 如果 distinct 是单列聚合,其余的列怎么处理? |
8 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) ``` |
![]() | 10 windyboy 2020-07-20 17:08:15 +08:00 ![]() 有的时候考知识点并不是很好的方案 毕竟有可能没有遇到过 但并不和能力有直接关联 |
span class="no">11 toyassb 2020-07-20 17:21:18 +08:00 via iPhone 呃,看这个第一反应是 sql 还能这么写 |
![]() | 12 javlib 2020-07-20 17:29:24 +08:00 @allAboutDbmss 所以从 explain,可以看到 group 是对 t.a, t.b 两个字段一起做 group 。 还有就是 with 可以这样用,学到了,谢谢 |
13 krixaar 2020-07-20 17:31:29 +08:00 distinct 能这样用的话光语义上都解释不了,name 相同但 age 不同的行只挑其中一个?随机挑?按顺序挑?按什么顺序? |
14 zppass 2020-07-20 17:35:29 +08:00 这种 distinct 一般来说就是单独使用,算个数的话会使用。一般来说像聚合查找的话就是用 group by 来就满足要求了。 |
15 dongisking 2020-07-20 17:36:37 +08:00 好奇 lz 是怎么找到答案的 |
16 aguesuka 2020-07-20 17:37:49 +08:00 via Android 7 楼才是正确思路。"是什么"而不是"为什么",比起什么都不知道,不过是多踩一个坑罢了 |
![]() | 17 HankAviator 2020-07-20 17:51:09 +08:00 via Android @zppass 感觉 distinct 比 group by 资源消耗更大一点 |
![]() | 18 gz911122 2020-07-20 18:00:41 +08:00 ![]() 卧槽那是有多菜 |
![]() | 19 j0hnj 2020-07-20 18:03:19 +08:00 distinct 与聚合函数一起使用的场景更常见一些,比如 select count(distinct name), select group_concat(distinct score) |
![]() | 20 lovecy 2020-07-20 18:06:32 +08:00 distinct 感觉是出查询结果后再扫描查询结果去重的,`SELECT DISTINCT 字段 FROM 表;`如果字段没有索引就会全表扫描,我的理解就到这里了。。 |
![]() | 21 raaaaaar 2020-07-20 18:09:49 +08:00 via Android ![]() 比较赞同,“是什么”的知识更多的是考察经验,能解释“为什么”的知识才是重点,后者还能考察应试者的思路 |
22 NetCobra 2020-07-20 18:26:37 +08:00 从来没有这么用过,意思上也解释不通。 只给 name 去重不应该是 group by 吗? |
![]() | 23 fhsan 2020-07-20 18:34:23 +08:00 我都是 group by,其实你这是考察一条 SQL 执行到底发生了什么 |
24 Still4 2020-07-20 18:47:06 +08:00 没这么用过肯定不知道的,也就是说相当于 ``` select name,age from test group by name,age; ``` |
![]() | 25 lxk11153 2020-07-20 18:54:13 +08:00 select name,age from test group by name,age; select distinct name,age from test ; 有性能,或者内存占用,等等差异吗?求解 |
![]() | 26 zsdroid 2020-07-20 18:55:09 +08:00 百度+bing 搜索 distinct,排第一的都是 w3school https://www.w3school.com.cn/sql/sql_distinct.asp 该教程里只用了一个字段来做演示,有一定的误导性,让看的人以为这是针对某个字段的。 |
27 wshcdr 2020-07-20 20:24:15 +08:00 w3school 的教程有点一言难尽 |
28 chaffy 2020-07-20 20:29:27 +08:00 学习了学习了 |
![]() | 29 Egfly 2020-07-20 20:41:05 +08:00 via iPhone 估计是没系统学过 mysql,不然不可能不知道这个 |
![]() | 30 hheedat 2020-07-20 20:42:51 +08:00 工作六年,没用过 distinct ... 学习了 |
31 Chieh 2020-07-20 20:59:42 +08:00 蛤?怎么会是函数 distinct 只能和 select 一起用,我一直当作是 select 的另一个版本 |
![]() | 32 talen666 2020-07-20 22:10:27 +08:00 (·。·)虽然用的少,但知道是个关键字,不是函数 |
33 Justin13 2020-07-20 22:12:39 +08:00 via Android <query spec> ::= SELECT [ ALL | DISTINCT ] <select list> <table expression> |
34 walkerliu 2020-07-20 22:19:13 +08:00 这种题问我虽然我能答的上来,但我觉得这种题目是问不出一个人的真实水平的 |
35 l00t 2020-07-20 22:22:13 +08:00 居然还能理解成只去重一个字段的函数?从知道这个 distinct 开始就从没那样理解过,句意上都不通啊…… |
![]() | 36 xAI 2020-07-20 23:18:36 +08:00 这种面试能考啥,这样去重应该用 group by 的居多。 你这算是自己设计的一个坑,大部分人用也不会这样用,文档语法也没有这种,也就不会遇不到这个坑。 |
![]() | 37 Narcissu5 2020-07-21 09:30:13 +08:00 @yuk1no 实际上 group 也有这种的问题,聚合条件之外的列怎么处理,sqlserver,oracle 里面这样的列不带聚合函数就会报错 但是 mysql 是可以正常工作的,是的,mysql 就是这样一种神奇的数据库。所以在 mysql 里面即使认为是单列聚合也没什么说不通的 |
![]() | 38 yuwangG 2020-07-21 10:17:29 +08:00 学到了~ |
![]() | 40 leonardyang 2020-07-21 16:56:43 +08:00 我记得 distinct 在 oracle 和 sqlserver 的语法树上是关键字吧,肯定不是函数 |
![]() | 41 dingyaguang117 2020-07-21 22:51:14 +08:00 能写出这种 SQL, 本身思维就不严谨 |
42 daimubai 2020-08-05 21:52:43 +08:00 distinct 不是函数,它是对查询的所有字段去重 |