PostgreSQL 教程: SELECT DISTINCT 去重

八月 30, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的SELECT DISTINCT子句,从查询返回的结果集中删除重复行。

PostgreSQL SELECT DISTINCT 子句简介

DISTINCT子句在SELECT语句中用于从结果集中删除重复行。DISTINCT子句为每组重复项保留一行。DISTINCT子句可以应用于SELECT语句的选择列表中的一列或多列。

下面说明了DISTINCT子句的语法:

SELECT
   DISTINCT column1
FROM
   table_name;

在此语句中,column1列中的值用于计算重复项。

如果指定多个列,DISTINCT子句将根据这些列值的组合计算重复项。

SELECT
   DISTINCT column1, column2
FROM
   table_name;

在这种情况下,column1column2列中的值的组合将用于计算重复项。

PostgreSQL 还提供了DISTINCT ON (expression)来保留每组重复项的第一行的功能,使用以下语法:

SELECT
   DISTINCT ON (column1) column_alias,
   column2
FROM
   table_name
ORDER BY
   column1,
   column2;

SELECT语句返回的行的顺序是未指定的,因此每组重复项的第一行也是未指定的。

最好始终使用带有DISTINCT ON(expression)ORDER BY子句,以使结果集可预测。

请注意,DISTINCT ON表达式必须与ORDER BY子句中最左边的表达式匹配。

PostgreSQL SELECT DISTINCT 示例

让我们创建一个新表,名为distinct_demo,并向其中插入数据来练习DISTINCT子句。

请注意,您将在后续教程中学习如何创建表并向表中插入数据。在本教程中,您只需在 psql 或 pgAdmin 中执行语句即可。

首先,使用以下CREATE TABLE语句创建distinct_demo表,它包含三列:idbcolorfcolor

CREATE TABLE distinct_demo (
	id serial NOT NULL PRIMARY KEY,
	bcolor VARCHAR,
	fcolor VARCHAR
);

其次,使用以下INSERT语句将一些行插入distinct_demo表中:

INSERT INTO distinct_demo (bcolor, fcolor)
VALUES
	('red', 'red'),
	('red', 'red'),
	('red', NULL),
	(NULL, 'red'),
	('red', 'green'),
	('red', 'blue'),
	('green', 'red'),
	('green', 'blue'),
	('green', 'green'),
	('blue', 'red'),
	('blue', 'green'),
	('blue', 'blue');

第三步,使用SELECT语句查询distinct_demo表中的数据:

SELECT
	id,
	bcolor,
	fcolor
FROM
	distinct_demo ;

PostgreSQL Distinct - Sample Table

PostgreSQL DISTINCT 单列示例

以下语句从t1表中查询bcolor列中的唯一值,并使用ORDER BY子句按字母顺序对结果集进行排序

SELECT
	DISTINCT bcolor
FROM
	distinct_demo
ORDER BY
	bcolor;

PostgreSQL Distinct - select distinct one column

PostgreSQL DISTINCT 多列示例

以下语句演示了如何在多个列上使用DISTINCT子句:

SELECT
	DISTINCT bcolor,
	fcolor
FROM
	distinct_demo
ORDER BY
	bcolor,
	fcolor;

PostgreSQL Distinct - select distinct two columns

因为我们在SELECT DISTINCT 子句中指定了bcolorfcolor列,所以 PostgreSQL 组合了bcolorfcolor列中的值来计算行的唯一性。

该查询返回distinct_demo表中bcolorfcolor的唯一组合。请注意,distinct_demo表有两行,并且bcolorfcolor列中都有red值 。当我们将DISTINCT应用于两列时,一行被从结果集中删除,因为它是重复的。

PostgreSQL DISTINCT ON 示例

以下语句按bcolorfcolor对结果集进行排序,然后对于每组重复项,它保留返回结果集中的第一行。

SELECT
	DISTINCT ON (bcolor) bcolor,
	fcolor
FROM
	distinct_demo 
ORDER BY
	bcolor,
	fcolor;

这是输出:

PostgreSQL Distinct - select distinct on

在本教程中,您学习了如何使用 PostgreSQL 的SELECT DISTINCT语句删除查询返回的重复行。