数据库 / 09 SQL Distinct

SQL Distinct

1. 定义

维基百科:关键字Distinct用于返回唯一不同的值。

慕课解释:有时候,查询结果中会包含重复的信息,如年龄,很多人是同龄人,而我们只需要不同年龄的数据,加上 Distinct 关键字我们就可以获得不重复的数据。

2. 前言

本小节,我们将一起学习 SQL Distinct

Distinct 关键字既可以用来修饰单字段,也可以用来修饰多字段;在小节中,我们将分别介绍这两种情况的使用。

本小节测试数据如下,请先在数据库中执行:

DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
  id int,
  username varchar(20),
  age int
);
INSERT INTO imooc_user(id,username,age) 
VALUES(1,'pedro',23), (2,'mike',18), (3,'jerry',23), (4,'pedro',23);

3. 单字段查询

Distinct 多用于单字段查询去重。

语法如下:

SELECT DISTINCT [col] FROM [table_name];

其中col表示字段名,table_name表示数据表名称。

3.1 例1 查询年龄

请书写 SQL 语句,查询得到 imooc_user 表中所有的年龄值,且除去重复年龄。

分析:

对于存在重复年龄的用户,使用 Select 搭配 Distinct 即可。

语句

SELECT DISTINCT age from imooc_user;

结果如下:

+-----+
| age |
+-----+
| 23  |
| 18  |
+-----+

在表中,pedro 与 jerry 二人的年龄相同,使用 Distinct 后,结果集中只有一个 23 。

如若上面语句没有使用 Distinct :

SELECT age from imooc_user;

结果如下:

+-----+
| age |
+-----+
| 23  |
| 18  |
| 23  |
| 23  |
+-----+

对比发现,Distinct 确实能够很好的完成去重工作。

4. 多字段查询

Distinct 也可用于多字段查询去重。

语法如下:

SELECT DISTINCT [col1],[col2] FROM [table_name];

其中col表示字段名,table_name表示数据表名称,数字1,2表示多个字段。

4.1 例2 查询用户名和年龄

请书写 SQL 语句,查询得到 imooc_user 中的所有用户名和年龄,要求结果不允许重复。

分析:

按照上述语法写出查询语句即可。

语句

SELECT DISTINCT username,age from imooc_user;

结果如下:

+----------+-----+
| username | age |
+----------+-----+
| pedro    | 23  |
| mike     | 18  |
| jerry    | 23  |
+----------+-----+

在表中,有两个名为 pedro 的用户,他们年龄也一致,在 Distinct 的作用下只返回了一个 pedro。

5. 小结

  • Distinct 非常实用,很多时候都会存在字段重复的问题,如同龄同班级同地区等等。
  • Distinct 是要付出代价的,去掉重复值带来的时间损耗比查询本身更耗时,因此也请慎用。