PostgreSQL / 读取和查询数据
如何在 PostgreSQL 中使用 `SELECT` 执行基本查询
简介
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
命令的附加项。您可以使用它们来帮助精确定位具有特定属性的数据、修改输出格式或进一步处理结果。
您可以在我们的 CRUD 操作 指南中了解如何使用 Prisma Client 进行查询。
使用 SELECT
指定要显示的列
SELECT
命令的列规范部分要求您命名要为您正在查询的数据显示的列。
对于临时查询和数据探索,最有用的选项之一是使用星号来表示您要显示来自每个可用列的值
SELECT * FROM my_table;
这将显示来自 my_table
的所有记录,因为我们没有提供任何过滤来缩小结果范围。每个记录的所有列将按照它们在表中定义的顺序显示。
您还可以选择通过按名称指定来查看可用列的子集。列名用逗号分隔,并按照给出的顺序显示
SELECT column2, column1 FROM my_table;
这将显示来自 my_table
的所有记录,但仅显示名为 column2
和 column1
的列,顺序如上。
如果使用 Prisma Client,您可以使用选择字段来实现相同的结果。
使用 AS
列别名修改结果表
您可以选择设置列别名来修改输出中用于列的名称。
SELECT column1 AS "first column" FROM my_table;
这将显示 my_table
中 column1
的每个值。但是,输出中的列将被标记为 first column
而不是 column1
。
如果输出组合了来自可能共享名称的多个表的列名,或者如果它包含尚无名称的计算列,则这尤其有用。
使用 ORDER BY
定义排序顺序
可以使用 ORDER BY
子句根据给定的标准对结果行进行排序。通用语法如下所示
SELECT * FROM my_table ORDER BY <sort_expression>;
这将显示 my_table
中所有记录的所有列的值。结果将根据占位符 <sort_expression>
表示的表达式排序。
例如,假设我们有一个 customer
表,其中包含 first_name
、last_name
、address
和 phone_number
列。如果我们想按 last_name
的字母顺序显示结果,我们可以使用以下命令
SELECT * FROM customer ORDER BY last_name;
结果按 last_name
列的升序字母顺序排序。
要反转排序,我们可以将 DESC
修饰符添加到 ORDER BY
子句的末尾
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;
您可以使用 Prisma Client 以与 SQL 查询中非常相似的方式对结果进行排序。
获取不同的结果
如果您想查找 PostgreSQL 中列的值范围,可以使用 SELECT DISTINCT
变体。这将为列的每个不同值显示一行。
基本语法如下所示
SELECT DISTINCT column1 FROM my_table;
这将为 column1
中的每个唯一值显示一行。
例如,要显示您的 shirt
表包含的所有不同 color
值,您可以键入
SELECT DISTINCT color FROM shirt;
color------bluegreenorangeredyellow
要显示跨多列的唯一性,您可以添加其他列,以逗号分隔。
例如,这将显示 shirt
表中 color
和 shirt_size
的所有不同组合
SELECT DISTINCT color,shirt_size FROM shirt;
color | shirt_size-------+-----------blue | Mblue | Sgreen | Mgreen | Lgreen | Sorange | Lorange | Mred | Myellow | S
这将显示表中 color
和 shirt_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 | Mgreen | Lgreen | 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 | Sred | Mgreen | L
您可以使用 Prisma Client 的distinct 功能从查询中过滤重复行。
结论
在本指南中,我们介绍了一些基本方法,您可以使用 SELECT
命令来识别和显示来自您的表和视图的记录。SELECT
命令是面向 SQL 的数据库中最灵活和最强大的操作之一,它有许多不同的方式来添加子句、条件和过滤。
虽然我们只在本指南中介绍了基本用法,但您在此处学到的通用格式将作为所有其他读取和许多写入查询的基础。学习更准确地过滤和定位结果的方法扩展了我们今天介绍的功能。
您可以在我们的过滤和排序文档中了解有关使用 Prisma Client 对查询进行排序和过滤的更多信息。