PostgreSQL SELECT 语句
本文介绍了 PostgreSQL 中的 SELECT
语句的基本形式,以及如何使用 SELECT
语句从数据表中查询数据。
在 PostgreSQL 中,SELECT
语句用于从一个或多个表中检索数据,它可能是使用最多的语句。
PostgreSQL SELECT
语法
让我们 SELECT
从从单个表中检索数据的语句的基本形式开始。
下面说明了 SELECT
语句的语法:
SELECT
expr_list
FROM
table_name
[other_clauses];
在这个语法中:
-
SELECT
和FROM
是关键字。 -
expr_list
是要选择的列或者表达式的列表。多个列或表达式需要使用逗号分隔。 -
table_name
是要查询的数据表。 -
FROM table_name
是可选的。如果你不查询任何表中的行,则可以省略FROM
子句。 -
other_clauses
是SELECT
语句支持的子句。SELECT
语句支持很多子句,包括:
请注意,SQL 关键字不区分大小写。但是为了让 SQL 代码更易于阅读,将 SQL 关键字书写为大写形式是一个好的编码习惯。
在本教程中,我们将聚焦于 SELECT
语句的基本用法,其他相关的子句的用法将在后续的教程中学习。
PostgreSQL SELECT
示例
我们来看一些使用 PostgreSQL SELECT
语句的例子。
我们将使用 PostgreSQL Sakila 示例数据库中 customer
表进行演示。
使用 PostgreSQL SELECT
语句查询一列数据
下面的 SELECT
语句从 customer
表中查找所有客户的名字:
SELECT first_name FROM customer;
这是部分输出:
first_name
------------
MARY
PATRICIA
LINDA
BARBARA
ELIZABETH
JENNIFER
MARIA
SUSAN
MARGARET
DOROTHY
请注意,我们在 SELECT
语句末尾添加了一个分号 (;
) 。分号不是 SQL 语句的一部分。它用于向 PostgreSQL 发出 SQL 语句结束的信号。分号也用于分隔两条 SQL 语句。
使用 PostgreSQL SELECT
语句查询多列数据示例
如果您想知道客户的名字、姓氏和电子邮件,您可以在 SELECT
子句中指定这些列名,如以下查询所示:
SELECT
first_name,
last_name,
email
FROM
customer;
以下是部分输出:
first_name | last_name | email
------------+-----------+-------------------------------------
MARY | SMITH | [email protected]
PATRICIA | JOHNSON | [email protected]
LINDA | WILLIAMS | [email protected]
BARBARA | JONES | [email protected]
ELIZABETH | BROWN | [email protected]
JENNIFER | DAVIS | [email protected]
MARIA | MILLER | [email protected]
SUSAN | WILSON | [email protected]
MARGARET | MOORE | [email protected]
DOROTHY | TAYLOR | [email protected]
使用 PostgreSQL SELECT
语句查询一个表的所有列的数据示例
如果您想使用 SELECT
语句从 customer
表中查找所有的列,请使用以下语句:
SELECT * FROM customer;
以下是部分输出:
customer_id | store_id | first_name | last_name | email | address_id | activebool | create_date | last_update | active
-------------+----------+------------+-----------+-------------------------------------+------------+------------+-------------+---------------------+--------
1 | 1 | MARY | SMITH | [email protected] | 5 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
2 | 1 | PATRICIA | JOHNSON | [email protected] | 6 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
3 | 1 | LINDA | WILLIAMS | [email protected] | 7 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
4 | 2 | BARBARA | JONES | [email protected] | 8 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
5 | 1 | ELIZABETH | BROWN | [email protected] | 9 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
6 | 2 | JENNIFER | DAVIS | [email protected] | 10 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
7 | 1 | MARIA | MILLER | [email protected] | 11 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
8 | 2 | SUSAN | WILSON | [email protected] | 12 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
9 | 2 | MARGARET | MOORE | [email protected] | 13 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
10 | 1 | DOROTHY | TAYLOR | [email protected] | 14 | t | 2006-02-14 | 2006-02-15 04:57:20 | 1
在此示例中,我们在 SELECT
子句中使用了星号 (*
),它是所有列的简写。星号 (*
) 可以让我们输入更少,而不用列出 customer
表中的所有的列名。
但是,在 SELECT
语句中使用星号 (*
) 并不是一个好习惯,原因如下:
- 数据库性能。假设您有一个包含许多列和大量数据的表,带有星号 (
*
) 速记的SELECT
语句将从表的所有列中选择数据,这对于应用程序来说可能不是必需的。 - 应用性能。从数据库中检索不必要的数据会增加数据库服务器和应用程序服务器之间的流量。因此,您的应用程序的响应速度可能较慢且可扩展性较差。
由于这些原因,最好在 SELECT
子句中明确指定列名,以便仅从数据库中获取必要的数据。
对于检查数据库数据的即时查询,您应只使用星号 (*
) 简写。
使用带有表达式的 PostgreSQL SELECT
语句示例
除了列名,您还可以在 SELECT
语句中使用表达式。以下示例使用 SELECT
语句返回所有客户的全名和电子邮件:
SELECT
first_name || ' ' || last_name,
email
FROM
customer;
以下是部分输出:
?column? | email
------------------+-------------------------------------
MARY SMITH | [email protected]
PATRICIA JOHNSON | [email protected]
LINDA WILLIAMS | [email protected]
BARBARA JONES | [email protected]
ELIZABETH BROWN | [email protected]
JENNIFER DAVIS | [email protected]
MARIA MILLER | [email protected]
SUSAN WILSON | [email protected]
MARGARET MOORE | [email protected]
DOROTHY TAYLOR | [email protected]
在此示例中,我们使用字符串连接运算符 ||
连接每个客户的名字、空格和姓氏。
您将在下一个教程中学习如何使用列别名为表达式分配更有意义的名称。
使用 PostgreSQL SELECT
语句计算表达式示例
如果您只想要单纯的计算一个表达式,您可以省略 SELECT
语句中的 FROM
子句。 以下 SELECT
语句用来计算 5 * 3
的结果:
SELECT 5 * 3;
这是输出:
?column?
----------
15
结论
在本教程中,您学习了如何使用 PostgreSQL SELECT
语句的基本形式从单个表中查询数据。如果您不需要从任何表查询数据,则可以省略 SELECT
语句中的 FROM
子句。