有时候数据库就像个记性不太好的家伙——啥都记,但老忘了自己已经记过啥。结果你打开客户城市的表,发现有十个“柏林”,五个“西雅图”,还有一堆别的重复。会这样,是因为不同客户可能来自同一个城市。但你肯定不想为十个“柏林”做广告活动吧,毕竟其实就一个城市,对吧?
想只拿到唯一的值——没有重复的——有个超方便的命令 DISTINCT。它就像魔法拖把:一挥就把重复的行全扫掉,只留下真正不一样的。
DISTINCT 让你从查询结果里只提取唯一的行。这在你想去掉重复数据时特别有用,比如:
- 订单里的唯一商品。
- 客户的唯一名字。
- 唯一的数据组合,比如“城市 + 国家”。
DISTINCT 怎么用?
DISTINCT 的语法很简单,和 SQL 一样直白:
SELECT DISTINCT 列1, 列2, ...
FROM 表名;
你在查询里加上 DISTINCT,数据库就保证结果里的每一行都是唯一的。
DISTINCT 的用法示例
先来点经典例子,看看 DISTINCT 到底怎么用。
例子 1:单列唯一值
假设我们有个 students 表,存着学生的信息:
-- 表 students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
我们想知道学生都来自哪些城市。写个查询
SELECT city
FROM students;
然后得到结果:
| city |
|---|
| Seattle |
| Toronto |
| Seattle |
| Chicago |
| Seattle |
这不是我们想要的 :(
要去掉重复就得用 DISTINCT:
SELECT DISTINCT city
FROM students;
结果:
| city |
|---|
| Seattle |
| Toronto |
| Chicago |
不用 DISTINCT 的话,“Seattle” 会出现三次,但我们只想要一次。
例子 2:多列唯一值
现在假设我们想拿到“名字 + 姓氏”的唯一组合,因为学生里可能有同名同姓的。
还是用同一个 students 表:
-- 表 students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
查询:
SELECT DISTINCT first_name, last_name
FROM students;
结果:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Alex | Lin |
| Anna | Song |
| Nat | Cole |
所以 DISTINCT 就像个过滤器:它会看你指定的所有列,只有这些列的值都一样才算重复,才会被去掉。
例子 3:唯一组合+排序
现在我们把 DISTINCT 和 ORDER BY 排序一起用,想让唯一值按姓氏字母顺序排好。
还是 students 表:
-- 表 students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
查询:
SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;
结果:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Nat | Cole |
| Alex | Lin |
| Anna | Song |
重复的行被干掉了,姓氏也按字母顺序排好了。
例子 4:聚合函数里用 DISTINCT
如果我们想把 DISTINCT 用在函数里,比如 COUNT 呢?
SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;
结果:
| unique_city_count |
|---|
| 3 |
这个查询会返回唯一城市的数量。是不是很方便?
DISTINCT 的一些细节
用 DISTINCT 的时候要记住,它是对你指定的所有列一起判断的。如果你在查询里加了更多列,结果可能就变了。
例子 5:为什么要理解上下文?
你在查询里加了额外的字段,可能会影响行的唯一性。
SELECT DISTINCT first_name, city
FROM students;
表 students:
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Austin |
| 3 | Anna | Song | Seattle |
| 4 | Otto | Art | Denver |
| 5 | Maria | Chi | Portland |
结果:
| first_name | city |
|---|---|
| Maria | Seattle |
| Alex | Austin |
| Anna | Seattle |
| Otto | Denver |
| Maria | Portland |
现在每个“名字 + 城市”的组合都是唯一的。所以记住:唯一性是由你指定的所有列一起决定的,不是单独每一列。
用 DISTINCT 时常见的坑
用 DISTINCT 最常见的坑就是没搞清楚查询到底干了啥。比如你查太多列,结果可能和你想的完全不一样,因为唯一性是按所有列一起算的。
比如:
SELECT DISTINCT *
FROM students;
这种情况下,每一行都会被当成唯一的,因为所有列都算上了。
还有一个坑——在不需要的地方用 DISTINCT。如果你确定数据已经唯一(比如主键列),那 DISTINCT 只会让数据库白白多干活。
GO TO FULL VERSION