添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

PostgreSQL SELECT DISTINCT 子句简介

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

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

SELECT
   DISTINCT column1
   table_name;

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

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

SELECT
   DISTINCT column1, column2
   table_name;

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

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

SELECT
   DISTINCT ON (column1) column_alias,
   column2
   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
	bcolor,
	fcolor
	distinct_demo ;

PostgreSQL DISTINCT 单列示例

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

SELECT
	DISTINCT bcolor
	distinct_demo
ORDER BY
	bcolor;

PostgreSQL DISTINCT 多列示例

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

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

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

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

PostgreSQL DISTINCT ON 示例

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

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

这是输出:

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