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
列的升序字母顺序排序。
要反转排序,可以在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;
您可以通过 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 对查询进行排序和过滤的更多信息。