分享到

简介

在 SQLite 中,SELECT SQL 命令是最适合查询和返回表中数据的命令。此命令实现了其名称所暗示的功能,即根据命令中指定的条件 *选择* 匹配的记录。此命令不仅对 读取 数据很有用,而且还用于定位更新以及数据库中的其他操作。

在本文中,我们将介绍 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 的所有记录,因为语句中没有指定列名。每条记录的所有列将按照它们在 my_table 中定义的顺序显示。

注意:星号通配符选项最适合测试、临时查询和数据探索。对于真实应用程序开发,它不是一种有用的方法,因为更受控制、更明确的语句语法更强大且更可靠。

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

SELECT column2, column1 FROM my_table;

这将显示来自 my_table 的所有记录,但只显示 column2column1,并且按照此顺序显示。

使用 AS 的列别名修改结果表

MySQLPostgreSQL 等其他 SQL 数据库相比,SQLite 默认情况下不会在查询输出中显示列名。为了强制在 SQLite 中显示列名,可以运行一系列命令。

首先,你使用 .header 命令,该命令是输出中标题显示的开/关开关

.header on

其次,你使用 .mode 命令将输出模式设置为列。这样,标题就会与相应的列值对齐

.mode column
显示结果

现在,在运行查询时,输出显示将包含结果上方的列名。现在,你可以选择设置 *列别名* 来修改输出中使用的列名

SELECT column1 AS 'first column' FROM my_table;

这将显示 my_tablecolumn1 的每个值。输出中的列现在将显示为 first column 而不是 column1

当输出组合来自可能共享名称的多个表的列名或包含没有名称的计算列时,别名设置特别有用。

使用 ORDER BY 定义排序顺序

SQLite 将数据存储在表中,但顺序未指定。如果您使用 SELECT 语句查询数据,但没有定义排序顺序的标准,则结果的顺序将不确定。

ORDER BY 子句可用于根据特定条件对结果行进行排序。其一般语法如下

SELECT * FROM my_table ORDER BY <sort expression>;

这将显示 my_table 中所有记录中所有列的值。记录将根据表达式占位符 <sort expression> 进行排序。

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

SELECT * FROM student ORDER BY last_name;

结果将根据 last_name 中的值,从 A 到 Z 显示学生姓氏。

+-------------+------------+-----------+--------------------------+
id | first_name | last_name | student_email |
+-------------+------------+-----------+--------------------------+
1 | Felipe | Espinosa | [email protected] |
+-------------+------------+-----------+--------------------------+
2 | Bob | Smith | [email protected] |
+-------------+------------+-----------+--------------------------+
3 | Abigail | Smith | [email protected] |
+-------------+------------+-----------+--------------------------+
4 | Tamal | Wayne | [email protected]|
+-------------+------------+-----------+--------------------------+

要反转结果顺序,可以在 ORDER BY 子句末尾添加 DESC 修饰符

SELECT * FROM student ORDER BY last_name DESC;

结果将与前一个查询相反,显示根据 last_name 中的值从 Z 到 A 的结果。

+-------------+------------+-----------+--------------------------+
id | first_name | last_name | student_email |
+-------------+------------+-----------+--------------------------+
4 | Tamal | Wayne | [email protected]|
+-------------+------------+-----------+--------------------------+
3 | Abigail | Smith | [email protected] |
+-------------+------------+-----------+--------------------------+
2 | Bob | Smith | [email protected] |
+-------------+------------+-----------+--------------------------+
1 | Felipe | Espinosa | [email protected] |
+-------------+------------+-----------+--------------------------+

也可以根据多列进行排序。这在例如多人共用姓氏的情况下尤其有用。查询将如下所示

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 | [email protected] |
+-------------+------------+-----------+--------------------------+
3 | Abigail | Smith | [email protected] |
+-------------+------------+-----------+--------------------------+
2 | Bob | Smith | [email protected] |
+-------------+------------+-----------+--------------------------+
4 | Tamal | Wayne | [email protected]|
+-------------+------------+-----------+--------------------------+

获取不同的结果

如果您想在 SQLite 中查询表中列的值范围,可以使用 SELECT DISTINCT 变量来实现。这将为列的每个唯一值显示一行。

其基本语法如下

SELECT DISTINCT column1 FROM my_table;

结果将是 column1 中每个唯一值的单行。

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

SELECT DISTINCT color FROM shoe;
--------+
color |
--------+
blue |
green |
orange |
red |
yellow |
--------+

要显示跨多个列的唯一性,可以在查询中添加用逗号分隔的额外列。

例如,以下查询将显示 shoe 表中 colorshoe_size 的所有不同组合

SELECT DISTINCT color, shoe_size FROM shoe;

这将显示您鞋类收藏中 colorshoe_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 的实用性。

关于作者
Alex Emerich

Alex Emerich

Alex 是典型的观鸟、喜欢嘻哈的书呆子,也喜欢写关于数据库的文章。他目前住在柏林,在那里他可以被看到像利奥波德·布鲁姆一样漫无目的地走在城市里。