跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 面试了几个程序员,发现他们对于 mysql 的 distinct 关键字都存在错误的理解
未分類
21 7 月 2020

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

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

資深大佬 : JJstyle 4

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

select distinct(name), age from test; 

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

select distinct (name), age from test; 

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

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

大佬有話說 (41)

  • 資深大佬 : mightofcode

    学到了学到了

  • 資深大佬 : yishengyongyi

    踩过这个坑

  • 資深大佬 : achira

    前段时间在公司写 sql 发现了,和 select 的选取字段去重无关。是整体去重。实习生。

  • 資深大佬 : XGF

    难怪查询语句美化的时候 distinct 和 select 是同一行。
    当然我写的时候没加括号,也认为是给 name 去重(捂脸)
    学到了,学到了

  • 資深大佬 : Xusually

    嗯 需要单列去重,但是要读取多列的用 group by

  • 資深大佬 : gimp

    哈哈,这题我会。

  • 資深大佬 : yuk1no

    弄不清的可能没怎么学过 SQL
    如果 distinct 是单列聚合,其余的列怎么处理?

  • 資深大佬 : allAboutDbmss

    我做了一个很小的例子 用的是 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

    @yuk1no 可以用 group by 替代

  • 資深大佬 : windyboy

    有的时候考知识点并不是很好的方案
    毕竟有可能没有遇到过
    但并不和能力有直接关联

  • 資深大佬 : toyassb

    呃,看这个第一反应是 sql 还能这么写

  • 資深大佬 : javlib

    @allAboutDbmss 所以从 explain,可以看到 group 是对 t.a, t.b 两个字段一起做 group 。
    还有就是 with 可以这样用,学到了,谢谢

  • 資深大佬 : krixaar

    distinct 能这样用的话光语义上都解释不了,name 相同但 age 不同的行只挑其中一个?随机挑?按顺序挑?按什么顺序?

  • 資深大佬 : zppass

    这种 distinct 一般来说就是单独使用,算个数的话会使用。一般来说像聚合查找的话就是用 group by 来就满足要求了。

  • 資深大佬 : dongisking

    好奇 lz 是怎么找到答案的

  • 資深大佬 : aguesuka

    7 才是正确思路。”是什么”而不是”为什么”,比起什么都不知道,不过是多踩一个坑罢了

  • 資深大佬 : HankAviator

    @zppass 感觉 distinct 比 group by 资源消耗更大一点

  • 資深大佬 : gz911122

    卧槽那是有多菜

  • 資深大佬 : j0hnj

    distinct 与聚合函数一起使用的场景更常见一些,比如 select count(distinct name), select group_concat(distinct score)

  • 資深大佬 : lovecy

    distinct 感觉是出查询结果后再扫描查询结果去重的,`SELECT DISTINCT 字段 FROM 表;`如果字段没有索引就会全表扫描,我的理解就到这里了。。

  • 資深大佬 : raaaaaar

    比较赞同,“是什么”的知识更多的是考察经验,能解释“为什么”的知识才是重点,后者还能考察应试者的思路

  • 資深大佬 : NetCobra

    从来没有这么用过,意思上也解释不通。
    只给 name 去重不应该是 group by 吗?

  • 資深大佬 : fhsan

    我都是 group by,其实你这是考察一条 SQL 执行到底发生了什么

  • 資深大佬 : Still4

    没这么用过肯定不知道的,也就是说相当于
    “`
    select name,age from test group by name,age;
    “`

  • 資深大佬 : lxk11153

    select name,age from test group by name,age;
    select distinct name,age from test ;
    有性能,或者内存占用,等等差异吗?求解

  • 資深大佬 : zsdroid

    百度+bing 搜索 distinct,排第一的都是 w3school
    https://www.w3school.com.cn/sql/sql_distinct.asp
    该教程里只用了一个字段来做演示,有一定的误导性,让看的人以为这是针对某个字段的。

  • 資深大佬 : wshcdr

    w3school 的教程有点一言难尽

  • 資深大佬 : chaffy

    学习了学习了

  • 資深大佬 : Egfly

    估计是没系统学过 mysql,不然不可能不知道这个

  • 資深大佬 : hheedat

    工作六年,没用过 distinct … 学习了

  • 資深大佬 : Chieh

    蛤?怎么会是函数 distinct 只能和 select 一起用,我一直当作是 select 的另一个版本

  • 資深大佬 : talen666

    (・。・)虽然用的少,但知道是个关键字,不是函数

  • 資深大佬 : Justin13

    <query spec> ::= SELECT [ ALL | DISTINCT ] <select list> <table expression>

  • 資深大佬 : walkerliu

    这种题问我虽然我能答的上来,但我觉得这种题目是问不出一个人的真实水平的

  • 資深大佬 : l00t

    居然还能理解成只去重一个字段的函数?从知道这个 distinct 开始就从没那样理解过,句意上都不通啊……

  • 資深大佬 : jun0205

    这种面试能考啥,这样去重应该用 group by 的居多。
    你这算是自己设计的一个坑,大部分人用也不会这样用,文档语法也没有这种,也就不会遇不到这个坑。

  • 資深大佬 : Narcissu5

    @yuk1no 实际上 group 也有这种的问题,聚合条件之外的列怎么处理,sqlserver,oracle 里面这样的列不带聚合函数就会报错

    但是 mysql 是可以正常工作的,是的,mysql 就是这样一种神奇的数据库。所以在 mysql 里面即使认为是单列聚合也没什么说不通的

  • 資深大佬 : yuwangG

    学到了~

  • 資深大佬 : aguesuka

    @Narcissu5 没开严格模式

  • 資深大佬 : leonardyang

    我记得 distinct 在 oracle 和 sqlserver 的语法树上是关键字吧,肯定不是函数

  • 資深大佬 : dingyaguang117

    能写出这种 SQL, 本身思维就不严谨

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具