SQLite
如何使用 `SELECT` 在 SQLite 中执行基本查询
简介
SELECT
SQL 命令是最适合从 SQLite 的表中查询和返回信息的命令。此命令通过选择与命令中指定的条件匹配的记录来实现其名称的含义。此命令不仅对于读取数据很有用,而且对于定位数据库中的更新和其他操作也很有用。
在本文中,我们将介绍 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
中的所有记录,因为语句中没有指定的列名。每个记录的所有列将按照它们在 my_table
中定义的顺序显示。
注意:星号通配符选项最适合测试、即席查询和数据探索。它不是实际应用程序开发的有用方法,在实际应用程序开发中,更受控、显式的语句语法更强大、更可靠。
您还可以选择通过指定列名来查看可用列的子集。列名用逗号分隔,并将按照您指定的顺序显示
SELECT column2, column1 FROM my_table;
这将显示 my_table
中的所有记录,但仅显示 column2
和 column1
,顺序完全相同。
使用 Prisma Client 时,您可以使用 select fields 功能控制返回的列。
使用 AS
列别名修改结果表
与 MySQL 和 PostgreSQL 等其他 SQL 数据库相比,SQLite 默认情况下不会在其查询输出中显示列名。为了强制在 SQLite 中显示列名,可以运行一系列命令。
首先,您使用 .header
命令,它是用于显示输出中标题的 on|off 开关
.header on
其次,您使用 .mode
命令将输出模式设置为 column。这使得标题与相应的列值对齐
.mode column
现在,当运行查询时,输出显示将包括结果上方的列名。现在,您可以选择设置列别名以修改输出中用于列的名称
SELECT column1 AS 'first column' FROM my_table;
这将显示 my_table
中 column1
的每个值。输出中的列现在将显示为 first column
而不是 column1
。
当输出组合来自可能共享名称的多个表的列名,或者如果它包含尚无名称的计算列时,别名的设置尤其有用。
使用 ORDER BY
定义排序顺序
SQLite 以未指定的顺序将数据存储在表中。如果您使用 SELECT
语句查询数据而没有任何条件定义顺序,则结果的顺序将是未指定的。
可以使用 ORDER BY
子句根据特定条件对结果行进行排序。其通用语法如下所示
SELECT * FROM my_table ORDER BY <sort expression>;
这将显示 my_table
中所有记录的所有列的值。记录将根据表达式占位符 <sort expression>
排序。
举个例子,假设有一个 student
表,其中包含 first_name
、last_name
和 student_email
列。如果我们想要按 last_name
的字母顺序显示结果,我们可以使用以下命令
SELECT * FROM student ORDER BY last_name;
结果将根据 last_name
中的值,按姓氏从 A 到 Z 的字母顺序显示学生。
+-------------+------------+-----------+--------------------------+id | first_name | last_name | student_email |+-------------+------------+-----------+--------------------------+1 | Felipe | Espinosa | felesp@university.com |+-------------+------------+-----------+--------------------------+2 | Bob | Smith | bobsmith@university.com |+-------------+------------+-----------+--------------------------+3 | Abigail | Smith | abismith@university.com |+-------------+------------+-----------+--------------------------+4 | Tamal | Wayne | tamalwayne@university.com|+-------------+------------+-----------+--------------------------+
要反转结果顺序,我们可以将 DESC
修饰符添加到 ORDER BY
子句的末尾
SELECT * FROM student ORDER BY last_name DESC;
结果将与之前的查询相反,根据 last_name
中的值显示从 Z 到 A 的结果。
+-------------+------------+-----------+--------------------------+id | first_name | last_name | student_email |+-------------+------------+-----------+--------------------------+4 | Tamal | Wayne | tamalwayne@university.com|+-------------+------------+-----------+--------------------------+3 | Abigail | Smith | abismith@university.com |+-------------+------------+-----------+--------------------------+2 | Bob | Smith | bobsmith@university.com |+-------------+------------+-----------+--------------------------+1 | Felipe | Espinosa | felesp@university.com |+-------------+------------+-----------+--------------------------+
也可以按多列排序。这在人们共享姓氏的情况下尤其有用。查询如下所示
SELECT * FROM student ORDER BY last_name, first_name;
结果将以升序显示两种排序。结果将首先按 last_name
从 A 到 Z 排序。接下来,结果将按 first_name
按字母顺序排序。如果多个记录的 last_name
相同,则 first_name
的排序将首先显示名字在字母表中较早的学生。
+-------------+------------+-----------+--------------------------+id | first_name | last_name | student_email |+-------------+------------+-----------+--------------------------+1 | Felipe | Espinosa | felesp@university.com |+-------------+------------+-----------+--------------------------+3 | Abigail | Smith | abismith@university.com |+-------------+------------+-----------+--------------------------+2 | Bob | Smith | bobsmith@university.com |+-------------+------------+-----------+--------------------------+4 | Tamal | Wayne | tamalwayne@university.com|+-------------+------------+-----------+--------------------------+
获取不同的结果
如果您想查询表中某一列的值范围,可以在 SQLite 中使用 SELECT DISTINCT
变体来实现。这将为列的每个唯一值显示一行。
其基本语法如下所示
SELECT DISTINCT column1 FROM my_table;
结果将是 column1
中每个唯一值的一行。
例如,要显示您的 shoe
表包含的所有不同 color
值,您可以键入
SELECT DISTINCT color FROM shoe;
--------+color |--------+blue |green |orange |red |yellow |--------+
要显示跨多列的唯一性,您可以将其他列添加到查询中,并用逗号分隔。
例如,以下查询将显示 shoe
表中 color
和 shoe_size
的所有不同组合
SELECT DISTINCT color, shoe_size FROM shoe;
这将显示您的鞋子系列中 color
和 shoe_size
的所有唯一组合。
--------+------------+color | shoe_size |--------+------------+blue | 11 |blue | 7 |green | 8.5 |green | 4 |green | 13.5 |orange | 9.5 |orange | 6 |red | 15 |yellow | 8 |--------+------------+
结论
本文介绍了 SELECT
命令的基础知识,用于从 SQLite 表返回数据。还有许多可选子句可以修改命令的行为,使您可以将结果控制为您想要的规范。在后续文章中,我们将深入研究这些修饰符,以进一步开发 SELECT
的实用性。