SQLite
如何在 SQLite 中使用 `SELECT` 執行基本查詢
簡介
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 進行列別名以修改結果表
與其他 SQL 資料庫(如 MySQL 和 PostgreSQL)相比,SQLite 預設不在其查詢輸出中顯示列名。為了強制 SQLite 顯示列名,可以執行一系列命令。
首先,您使用 .header 命令,它是輸出中顯示標頭的開關(開/關)
.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|+-------------+------------+-----------+--------------------------+
要反轉結果順序,我們可以在 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 表中 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 |--------+------------+
結論
本文介紹了從 SQLite 表返回資料的 SELECT 命令基礎知識。還有許多可選子句可以修改該命令的行為,使您能夠根據所需規範控制結果。在後續文章中,我們將深入探討這些修飾符,以進一步開發 SELECT 的實用性。
