分享於

簡介

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 命令,它是輸出中標頭顯示的 on|off 開關

.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|
+-------------+------------+-----------+--------------------------+

若要反轉結果順序,我們可以將 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 表格中 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 是典型的賞鳥、熱愛嘻哈的書蟲,也喜歡撰寫關於資料庫的文章。他目前住在柏林,在那裡可以看到他像利奧波德·布魯姆一樣漫無目的地走在城市中。