《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值是什么?”对于每间工厂,它们能生产什么化学制品?对于每个选区,参与竞选的候选人都有谁?对于每间音乐厅,这个月都有哪些艺术家在演出?