Postgres DISTINCT 与 DISTINCT ON 有什么区别

postgresql

1个回答

写回答

ZHenn

2025-06-25 11:40

+ 关注

PostgreSQL
PostgreSQL

Postgres DISTINCT 与 DISTINCT ON 有什么区别?

在PostgreSQL数据库中,有两种用于去除重复行的关键字:DISTINCT 和 DISTINCT ON。尽管它们都用于相同的目的,但它们在使用和功能上有一些重要的区别。在本文中,我们将详细介绍这两个关键字的区别,并提供一些案例代码来帮助理解。

1. DISTINCT

DISTINCT 是一种用于从查询结果中去除重复行的关键字。它适用于所有的列,无论是单个列还是多个列的组合。当你使用DISTINCT时,查询结果将只包含唯一的行。

下面是一个使用DISTINCT的简单示例:

sql

SELECT DISTINCT column_name

FROM table_name;

在这个例子中,我们从名为table_name的表中选择特定的列column_name,并使用DISTINCT关键字去除重复的行。查询结果将只包含唯一的行。

2. DISTINCT ON

DISTINCT ON 是一种更为灵活的去重方法,它允许你指定一个列(或多个列的组合),并根据这些列的值来去除重复行。与DISTINCT不同的是,DISTINCT ON只返回每个指定列组合的第一行。

下面是一个使用DISTINCT ON的示例:

sql

SELECT DISTINCT ON (column_name) column_name, another_column

FROM table_name

ORDER BY column_name, another_column;

在这个例子中,我们从名为table_name的表中选择特定的列column_name和another_column,并使用DISTINCT ON关键字根据column_name的值去除重复行。ORDER BY子句用于指定按照哪些列的值进行排序,以便在去重时选择每个列组合的第一行。

区别:

- DISTINCT 用于去除查询结果中的重复行,而 DISTINCT ON 用于根据指定的列组合去除重复行。

- DISTINCT 可以应用于单个列或多个列的组合,而 DISTINCT ON 只能应用于指定的列。

- DISTINCT 返回所有唯一的行,而 DISTINCT ON 只返回每个指定列组合的第一行。

在使用PostgreSQL时,了解 DISTINCT 和 DISTINCT ON 的区别非常重要。根据你的具体需求,选择适当的关键字可以提高查询的效率和准确性。使用 DISTINCT 可以去除查询结果中的重复行,而使用 DISTINCT ON 可以根据指定的列组合去除重复行,并返回每个组合的第一行。

希望本文对你理解 Postgres DISTINCT 和 DISTINCT ON 的区别有所帮助,并能在实际的查询中正确地应用它们。

参考代码

下面是一个使用 DISTINCT 和 DISTINCT ON 的示例代码:

sql

-- 创建一个名为students的表

CREATE TABLE students (

id SERIAL PRIMARY KEY,

name VARCHAR(100),

age INT,

grade VARCHAR(10)

);

-- 向表中插入一些示例数据

INSERT INTO students (name, age, grade)

VALUES ('Alice', 18, 'A'),

('Bob', 19, 'B'),

('Alice', 18, 'A'),

('Charlie', 20, 'C'),

('Bob', 19, 'B');

-- 使用 DISTINCT 去除重复行

SELECT DISTINCT name, age, grade

FROM students;

-- 使用 DISTINCT ON 根据 name 和 grade 去除重复行,并返回每个组合的第一行

SELECT DISTINCT ON (name, grade) name, age, grade

FROM students

ORDER BY name, grade;

在上面的代码中,我们首先创建了一个名为students的表,并向表中插入了一些示例数据。然后,我们分别使用 DISTINCT 和 DISTINCT ON 来查询去除重复行后的结果。通过对比这两个查询的结果,我们可以更好地理解 DISTINCT 和 DISTINCT ON 的区别。

参考资料

- PostgreSQL官方文档:PostgreSQL.org/docs/">https://www.PostgreSQL.org/docs/

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号