CodeGym /课程 /SQL SELF /用 DISTINCT 提取唯一值

用 DISTINCT 提取唯一值

SQL SELF
第 6 级, 课程 1
可用

有时候数据库就像个记性不太好的家伙——啥都记,但老忘了自己已经记过啥。结果你打开客户城市的表,发现有十个“柏林”,五个“西雅图”,还有一堆别的重复。会这样,是因为不同客户可能来自同一个城市。但你肯定不想为十个“柏林”做广告活动吧,毕竟其实就一个城市,对吧?

想只拿到唯一的值——没有重复的——有个超方便的命令 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 只会让数据库白白多干活。

2
任务
SQL SELF, 第 6 级, 课程 1
已锁定
客户的唯一城市
客户的唯一城市
2
任务
SQL SELF, 第 6 级, 课程 1
已锁定
唯一的名字和姓氏组合
唯一的名字和姓氏组合
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION