PostgreSQL 教程: SELECT

九月 3, 2023

摘要:在本教程中,您将学习如何使用基本的 PostgreSQL SELECT 语句从表中查询数据。

请注意,如果您不知道如何使用 psql 命令行工具或 pgAdmin GUI 工具对 PostgreSQL 数据库执行查询,可以查看连接到 PostgreSQL 数据库教程

使用数据库时最常见的任务之一是使用SELECT语句从表中查询数据。

SELECT语句是 PostgreSQL 中最复杂的语句之一。它有许多子句,您可以使用它们来形成灵活的查询。

由于其复杂性,我们将其分解为许多简短且易于理解的教程,以便您可以更快地了解每个子句。

SELECT语句有以下子句:

  • 使用DISTINCT运算符选择不同的行。
  • 使用ORDER BY子句对行进行排序。
  • 使用WHERE子句过滤行。
  • 使用LIMITFETCH子句从表中选择行的子集。
  • 使用GROUP BY子句将行分组。
  • 使用HAVING子句过滤分组。
  • 使用INNER JOIN, LEFT JOIN, FULL OUTER JOIN, CROSS JOIN连接子句与其他表连接。
  • 使用UNIONINTERSECTEXCEPT执行集合运算。

在本教程中,您将重点关注SELECT列表和FROM子句。

PostgreSQL SELECT 语句语法

让我们从从单个表中检索数据的SELECT语句的基本形式开始。

下面说明了SELECT语句的语法:

SELECT
   select_list
FROM
   table_name;

让我们更详细地观察该SELECT语句:

  • 首先,指定一个选择列表,该列表可以是要从中检索数据的表中的一列或多列的列表。如果指定多列列表,则需要在两列之间放置逗号 (,) 来分隔它们。如果要从表的所有列中检索数据,可以使用星号 (*) 简写,而不用指定所有列名。选择列表还可以包含表达式或文字值。
  • 其次,在FROM关键字后指定要从中查询数据的表的名称。

其中FROM子句是可选的。如果不从任何表查询数据,则可以在SELECT语句中省略FROM子句。

PostgreSQL 在SELECT语句中SELECT列表子句之前计算FROM子句:

img

请注意,SQL 关键字不区分大小写。这意味着SELECT等价于selectSelect。按照惯例,我们将以大写方式使用所有 SQL 关键字,以使查询更易于阅读。

PostgreSQL SELECT 示例

让我们看一下使用 PostgreSQL 的SELECT语句的一些示例。

我们将使用示例数据库中的customer表进行演示,如下。

customer table

1) 使用 SELECT 语句查询一列数据的示例

此示例使用以下SELECT语句从customer表中查找所有客户的名字:

SELECT first_name FROM customer;

这是部分输出:

PostgreSQL Select - Selecting a single column

请注意,我们在SELECT语句末尾添加了一个分号 (;)。分号不是 SQL 语句的一部分。它用于向 PostgreSQL 发出 SQL 语句结束的标记。分号还用于分隔两个 SQL 语句。

2) 使用 SELECT 语句查询多列数据的示例

假设您只想知道客户的名字、姓氏和电子邮件,您可以在SELECT列表子句中指定这些列名称,如以下查询所示:

SELECT
   first_name,
   last_name,
   email
FROM
   customer;

PostgreSQL Select - Selecting multiple columns

3) 使用 SELECT 语句查询表所有列数据的示例

以下查询使用SELECT语句从customer表的所有列中检索数据:

SELECT * FROM customer;

PostgreSQL Select - Selecting all columns

在此示例中,我们在SELECT列表子句中使用了星号 (*),它是所有列的简写。我们没有在SELECT子句中列出所有列,而是使用星号 (*) 来简化查询语句。

但是,当您在 PythonJava、Node.js 或 PHP 等应用程序代码中嵌入 SQL 语句时,在SELECT语句中使用星号 (*) 并不是一个好的做法,原因如下:

  1. 数据库性能。假设您有一个包含许多列和大量数据的表,带有星号 (*) 简写的SELECT语句将从表的所有列中选择数据,这对于应用程序来说可能不是必需的。
  2. 应用性能。从数据库中检索不必要的数据会增加数据库服务器和应用程序服务器之间的流量。因此,您的应用程序可能响应速度较慢且可扩展性较差。

由于这些原因,只要有可能,最好在SELECT列表子句中显式指定列名,以便仅从数据库获取必要的数据。

对于检查数据库数据的临时查询,您可以使用星号 (*) 简写。

4) 使用带有表达式的 SELECT 语句的示例

以下示例使用SELECT语句返回所有客户的全名和电子邮件:

SELECT 
   first_name || ' ' || last_name,
   email
FROM 
   customer;

输出:

img

在此示例中,我们使用串联运算符 ||来串联每个客户的名字、空格和姓氏。

在下一个教程中,您将学习如何使用列别名为表达式分配更有意义的名称。

5) 使用带有表达式的 SELECT 语句的示例

以下示例使用带有表达式的SELECT语句。它省略了FROM子句:

SELECT 5 * 3;

这是输出:

img

在本教程中,您学习了如何使用 PostgreSQL 的SELECT语句的基本形式来查询单个表中的数据。