分享到

簡介

SELECT SQL 命令是 SQLite 中最適合查詢和返回表中資訊的命令。此命令透過選擇符合指定條件的匹配記錄來實現其名稱的含義。此命令不僅可用於讀取資料,還可用於在資料庫中定位更新和其他操作。

本文將介紹 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 進行列別名以修改結果表

與其他 SQL 資料庫(如 MySQLPostgreSQL)相比,SQLite 預設不在其查詢輸出中顯示列名。為了強制 SQLite 顯示列名,可以執行一系列命令。

首先,您使用 .header 命令,它是輸出中顯示標頭的開關(開/關)

.header on

其次,您使用 .mode 命令將輸出模式設定為 column。這使得標頭與相應的列值對齊

.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 | felesp@university.com |
+-------------+------------+-----------+--------------------------+
2 | Bob | Smith | bobsmith@university.com |
+-------------+------------+-----------+--------------------------+
3 | Abigail | Smith | abismith@university.com |
+-------------+------------+-----------+--------------------------+
4 | Tamal | Wayne | tamalwayne@university.com|
+-------------+------------+-----------+--------------------------+

要反轉結果順序,我們可以在 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 | 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 表中 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 |
--------+------------+

結論

本文介紹了從 SQLite 表返回資料的 SELECT 命令基礎知識。還有許多可選子句可以修改該命令的行為,使您能夠根據所需規範控制結果。在後續文章中,我們將深入探討這些修飾符,以進一步開發 SELECT 的實用性。

關於作者
Alex Emerich

Alex Emerich

Alex 是典型的觀鳥愛好者、嘻哈迷書蟲,也喜歡寫資料庫相關文章。他目前住在柏林,在那裡可以看到他像利奧波德·布魯姆一樣漫無目的地在城市中漫步。
© . This site is unofficial and not affiliated with Prisma Data, Inc.