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 時,您可以使用選取欄位功能來控制傳回的欄位。
使用 AS
的欄位別名來修改結果表格
與其他 SQL 資料庫(例如 MySQL 和 PostgreSQL)相比,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
的實用性。