八月 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
语句删除查询返回的重复行。