分享到

简介

SELECT 命令是在 PostgreSQL 中查询和读取存储在数据库表中的记录信息的主要方式。然而,它的用途不限于只读操作。SELECT 语法与许多其他命令结合使用,以针对数据库中的特定记录或字段进行更新、删除和更复杂的操作。

在本指南中,我们将展示 SELECT 的基本语法如何支持从表中收集数据。虽然我们将把大量的可选子句留给其他文章,但希望它能清楚地表明,即使是最基本的组件也为查询数据提供了坚实的基础。这些基础知识只需要您学习一些子句和结构。

SELECT 命令的通用语法

SELECT 命令的基本格式如下所示

SELECT <column_names> FROM <table_name> <additional_conditions_and_formatting>;

这个语句由几个不同的部分组成

  • SELECTSELECT 命令本身。这个 SQL 语句表明我们想要查询表或视图以获取它们包含的数据。围绕它的参数和子句通过定义标准来确定输出的内容和格式。
  • <column_names>SELECT 语句可以返回整个行(用 * 通配符表示)或可用的子集。如果您只想输出特定的列,请提供您想要显示的列名,用逗号分隔。
  • FROM <table_name>FROM 关键字用于指示应该查询的视图。在大多数简单查询中,这由包含您感兴趣数据的单个表组成。
  • <additional_conditions_and_formatting>:大量的过滤器、输出修饰符和条件可以指定为 SELECT 命令的附加项。您可以使用它们来帮助精确定位具有特定属性的数据,修改输出格式,或进一步处理结果。

使用 SELECT 指定要显示的列

SELECT 命令的列规范部分要求您命名要为正在查询的数据显示的列。

对于临时查询和数据探索期间,最有用的选项之一是使用星号来指示您想要显示来自每个可用列的值

SELECT * FROM my_table;

这将显示来自 my_table 的所有记录,因为我们没有提供任何过滤来缩小结果范围。每个记录的所有列将按照它们在表中定义的顺序显示。

您还可以选择通过按名称指定来查看可用列的子集。列名用逗号分隔,并按照给定的顺序显示

SELECT column2, column1 FROM my_table;

这将显示来自 my_table 的所有记录,但仅显示名为 column2column1 的列,按该顺序排列。

使用 AS 列别名修改结果表

您可以选择设置列别名来修改输出中用于列的名称。

SELECT column1 AS "first column" FROM my_table;

这将显示 my_tablecolumn1 的每个值。但是,输出中的列将被标记为 first column 而不是 column1

如果输出组合了来自可能共享名称的多个表的列名,或者如果它包含尚未命名的计算列,则这尤其有用。

使用 ORDER BY 定义排序顺序

ORDER BY 子句可用于根据给定的条件对结果行进行排序。通用语法如下所示

SELECT * FROM my_table ORDER BY <sort_expression>;

这将显示 my_table 中所有记录的所有列的值。结果将根据占位符 <sort_expression> 表示的表达式排序。

例如,假设我们有一个 customer 表,其中包含 first_namelast_nameaddressphone_number 列。如果我们想按 last_name 的字母顺序显示结果,我们可以使用以下命令

SELECT * FROM customer ORDER BY last_name;
显示结果

结果按 last_name 列以升序字母顺序排序。

要反转排序,我们可以在 ORDER BY 子句的末尾添加 DESC 修饰符

SELECT * FROM customer ORDER BY last_name DESC;
显示结果

您也可以按多列排序。在这里,我们首先按 last_name 排序,然后对于任何具有相同 last_name 值的列,按 first_name 排序。两种排序都按升序排列

SELECT * FROM customer ORDER BY last_name, first_name;
显示结果

一个通常很重要的附加选项是阐明 NULL 值应在排序顺序中的位置。您可以通过为任何排序列添加 NULLS FIRST (默认) 或 NULLS LAST 来做到这一点

SELECT * FROM customer ORDER BY last_name NULLS LAST;

获取不同的结果

如果您想在 PostgreSQL 中查找列的值范围,可以使用 SELECT DISTINCT 变体。这将为列的每个不同值显示一行。

基本语法如下所示

SELECT DISTINCT column1 FROM my_table;

这将显示 column1 中每个唯一值的一行。

例如,要显示您的 shirt 表包含的所有不同的 color 值,您可以键入

SELECT DISTINCT color FROM shirt;
color
------
blue
green
orange
red
yellow

要显示跨多个列的唯一性,您可以添加用逗号分隔的附加列。

例如,这将显示 shirt 表的所有不同的 colorshirt_size 组合

SELECT DISTINCT color,shirt_size FROM shirt;
color | shirt_size
-------+-----------
blue | M
blue | S
green | M
green | L
green | S
orange | L
orange | M
red | M
yellow | S

这显示了表中 colorshirt_size 的每个唯一组合。

一个通常更灵活的变体是 PostgreSQL 的 SELECT DISTINCT ON 命令。这种格式允许您指定应组合唯一的列列表,并单独列出您希望显示的列。

通用语法如下所示,应唯一的列或列在 SELECT DISTINCT ON 之后的括号中列出,后跟您希望显示的列

SELECT DISTINCT ON (column1) column1, column2 FROM my_table ORDER BY column1;

例如,如果您想为每个衬衫尺寸显示一种颜色,您可以键入

SELECT DISTINCT ON (shirt_size) color,shirt_size FROM shirt;
color | shirt_size
------+-----------
red | M
green | L
green | S

这将为 shirt_size 中的每个唯一值显示一行。对于每一行,它将显示 color 列,后跟 shirt_size 列。

如果使用 ORDER BY 子句,则为排序选择的列必须与 DISTINCT ON 括号内选择的列匹配,以便输出具有可预测的结果

SELECT DISTINCT ON (shirt_size) color,shirt_size FROM shirt ORDER BY shirt_size DESC;
color | shirt_size
------+-----------
green | S
red | M
green | L

结论

在本指南中,我们介绍了使用 SELECT 命令来识别和显示来自您的表和视图的记录的一些基本方法。SELECT 命令是面向 SQL 的数据库中最灵活和最强大的操作之一,它有许多不同的方法来添加子句、条件和过滤。

虽然在本指南中我们只介绍了基本用法,但您在此处学习的通用格式将作为所有其他读取和许多写入查询的基础。学习更准确地过滤和定位结果的方法扩展了我们今天介绍的功能。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直撰写关于数据库、Linux、基础设施和开发者工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。