八月 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;
在这种情况下,column1和column2列中的值的组合将用于计算重复项。
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表,它包含三列:id、bcolor和fcolor。
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 单列示例
以下语句从t1表中查询bcolor列中的唯一值,并使用 ORDER BY 子句按字母顺序对结果集进行排序。
SELECT
DISTINCT bcolor
FROM
distinct_demo
ORDER BY
bcolor;

PostgreSQL DISTINCT 多列示例
以下语句演示了如何在多个列上使用DISTINCT子句:
SELECT
DISTINCT bcolor,
fcolor
FROM
distinct_demo
ORDER BY
bcolor,
fcolor;

因为我们在SELECT DISTINCT 子句中指定了bcolor和fcolor列,所以 PostgreSQL 组合了bcolor和fcolor列中的值来计算行的唯一性。
该查询返回distinct_demo表中bcolor和fcolor的唯一组合。请注意,distinct_demo表有两行,并且bcolor和fcolor列中都有red值 。当我们将DISTINCT应用于两列时,一行被从结果集中删除,因为它是重复的。
PostgreSQL DISTINCT ON 示例
以下语句按bcolor和fcolor对结果集进行排序,然后对于每组重复项,它保留返回结果集中的第一行。
SELECT
DISTINCT ON (bcolor) bcolor,
fcolor
FROM
distinct_demo
ORDER BY
bcolor,
fcolor;
这是输出:

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