分享

介绍

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

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

`SELECT` 命令的一般语法

`SELECT` 命令的基本格式如下

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

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

  • `SELECT`: `SELECT` 命令本身。此 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` 中的所有記錄,但只顯示名為 `column2` 和 `column1` 的列,按此順序。

使用 `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、基础设施和开发人员工具的文章。他现在与他的妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对于所有相关方来说都是一种解脱。