购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4.1 使用DISTINCT

相信同学们都注意到了,在联络清单的location列里存在一些重复值。没错,这是因为有些女孩来自同一座城市。事实上,由于相较于其他数据而言,空值和重复值都算得上是表中的特殊数据,所以在有些情况下,我们需要对它们进行额外的处理。

举例来讲,如果李乔丹想要查看Contact表中的姑娘们都来自哪些不同的城市,那么在这种情况下,我们就需要使用关键词DISTINCT,对location列中的数据进行去重。对应的SQL语句为:

瞧,结果显示表中的姑娘们一共来自8个不同的城市。除此以外,通过例句(1)我们还会发现,其实DISTINCT的用法非常简单,只需紧跟在SELECT后面使用就可以了。也就是说,关键词DISTINCT一般只能出现在第一个列名之前。

为了让同学们更加清楚DISTINCT的去重原理,现在我们将age列也加入检索队伍,然后观察结果:

虽然age和location两列都含有重复的值,但它们却都被保留了下来,这是为什么呢? 原因其实很简单,因为DISTINCT的去重目标是重复的输出行,而不是重复的列值。

没错,不妨这样理解,例句(2)中DISTINCT的去重目标是“age+location”的组合值。虽然age和location两列中都单独含有重复的值,但它们的组合值却是不重复的,所以DISTINCT在此处没有发挥自身作用的余地。

事实上,输出行必须在横向保证数据间原本的对应关系。请大家想象一下,如果DISTINCT只顾单独去掉age和location两列中含有的重复值,那么去重后两列数据间的对应关系很可能会出现张冠李戴的效果。这当然不是我们想要的。

正是这样!由于使用DISTINCT不能破坏数据间原本的对应关系,所以它的去重对象就是输出行,也就是所有检索对象的组合值。由于例句(1)的检索对象只有location一列,所以我们可能会误以为DISTINCT的去重对象是列。

讲到这里大家就会明白,不同的检索操作可能会对应不同的去重效果。这是因为执行不同的检索语句,我们得到的输出行(列值的组合)也不尽相同。除此以外,值得同学们注意的是,DISTINCT与我们前两节学习的ORDER BY和LIMIT一样,它们的操作对象都是行,也就是以行为单位在进行调整。如果它们同时出现在一条检索语句中,例如:

那么相应的执行顺序是,当MySQL从Contact表中抓取出age列含有的信息之后,会先去掉重复行,然后根据年龄排序,最后限制结果的输出行数。因此,各个关键词对应的执行顺序为: Vy7vwyRe+aS0klmC4IDpvYRp7N26k//F7sdqWUzZZL4t1l4tv68gnVMwOk8PLYET

点击中间区域
呼出菜单
上一章
目录
下一章
×