《SQL实战》书摘(14):使用DISTINCT查找唯一值

在一个表里面,不同行的同一列出现相同值的情况并不少见。比如在teachers表里面,就因为每间学校都雇用了多名教师,所以相同学校的名字就在school列里面出现了好几次。

为了了解列的值区间,我们可以在查询中包含DISTINCT关键字,以此来消除重复值并且只展示独一无二的值。正如代码清单3-5所示,DISTINCT应该紧紧跟在SELECT之后。

SELECT DISTINCT school
FROM teachers
ORDER BY school;

代码清单3-5:在school列中查询不同的值

这段代码的执行结果如下:

school
-------------------
F.D. Roosevelt HS
Myers Middle School

尽管这个表包含了六个行,但输出只展示了school列中两个独一无二的学校名称。这对于评估数据质量是非常有意义的一步。比如说,如果一个学校的名字具有多种拼法,那么这些拼写的变化就很容易会被发现并纠正,特别是当你对输出进行排序的时候。

当你在处理日期或者数字的时候,DISTINCT将有助于发现不一致或者破损的格式。比如说,你可能继承了一个数据集,它的日期以text数据类型的形式记录在列里面。这种做法允许畸形的日期存在(因此你应该避免这种做法):

date
---------
5/30/2023
6//2023
6/1/2023
6/2/2023

DISTINCT关键字可以同时对多个列产生作用。如果我们增加一个列,那么查询将会返回每一对唯一的值。请运行代码清单3-6中的代码。

SELECT DISTINCT school, salary
FROM teachers
ORDER BY school, salary;

代码清单3-6:查询school列和salary列中每一对不同的值

这段代码会返回每间学校每一份独一无二(或者说各不相同)的工资。因为Myers Middle School有两位教师的工资同为$43,500,它们被归纳到了同一个行里面,所以查询只返回了5行而不是表中的全部6行:

school                 salary
-------------------     ------
F.D. Roosevelt HS       36200
F.D. Roosevelt HS       38500
F.D. Roosevelt HS       65000
Myers Middle School     36200
Myers Middle School     43500

这项技术使得我们能够提出这样一个问题:“对于表中的每个x,与之对应的所有y值是什么?”对于每间工厂,它们能生产什么化学制品?对于每个选区,参与竞选的候选人都有谁?对于每间音乐厅,这个月都有哪些艺术家在演出?

Tip

本文摘录自《SQL实战》一书,欢迎访问本书主页以了解更多相关信息:huangz.works/sql/

../_images/psqlcn-banner.jpg