分享至

簡介

`SELECT` 命令是在 PostgreSQL 中查詢和讀取資料庫資料表內儲存記錄資訊的主要方式。然而,它的用途不限於唯讀操作。`SELECT` 語法與許多其他命令結合,以針對資料庫中的特定記錄或欄位進行更新、刪除和更複雜的操作。

在本指南中,我們將展示 `SELECT` 的基本語法如何支援從資料表收集資料。雖然我們將把該命令的大量可選子句留給其他文章,但希望它能清楚地表明,即使是最基本的組件也為查詢資料提供了堅實的基礎。這些基礎知識僅需您學習一些子句和結構。

`SELECT` 命令的一般語法

`SELECT` 命令的基本格式如下所示

SELECT <column_names> FROM <table_name> <additional_conditions_and_formatting>;

這個陳述式由幾個不同的部分組成

  • `SELECT`:`SELECT` 命令本身。這個 SQL 陳述式表示我們想要查詢資料表或視圖以取得它們包含的資料。圍繞它的引數和子句通過定義準則來決定輸出內容和格式。
  • ``:`SELECT` 陳述式可以傳回整個資料列(以 `*` 通配符表示)或可用資料行的子集。如果您只想輸出特定資料行,請提供您想要顯示的資料行名稱,並以逗號分隔。
  • `FROM `:`FROM` 關鍵字用於指示應查詢的資料表或視圖。在大多數簡單查詢中,這包含一個包含您感興趣資料的單一資料表。
  • ``:可以將大量篩選器、輸出修飾符和條件指定為 `SELECT` 命令的附加項。您可以使用它們來幫助精確定位具有特定屬性的資料、修改輸出格式或進一步處理結果。

使用 `SELECT` 指定要顯示的資料行

`SELECT` 命令的資料行規格部分要求您命名要為您正在查詢的資料顯示的資料行。

對於臨時查詢和資料探索期間,最有用的選項之一是使用星號來指示您想要顯示來自每個可用資料行的值

SELECT * FROM my_table;

這將顯示 `my_table` 中的所有記錄,因為我們沒有提供任何篩選來縮小結果範圍。每個記錄的所有資料行將按照它們在資料表內定義的順序顯示。

您也可以選擇通過按名稱指定它們來查看可用資料行的子集。資料行名稱以逗號分隔,並按給定的順序顯示

SELECT column2, column1 FROM my_table;

這將顯示 `my_table` 中的所有記錄,但僅顯示名為 `column2` 和 `column1` 的資料行,並按該順序排列。

使用 `AS` 設定資料行別名以修改結果資料表

您可以選擇性地設定資料行別名,以修改輸出中用於資料行的名稱。

SELECT column1 AS "first column" FROM my_table;

這將顯示 `my_table` 中 `column1` 的每個值。但是,輸出中的資料行將標記為 `first column` 而不是 `column1`。

如果輸出結合了可能共享名稱的多個資料表中的資料行名稱,或者如果它包含尚未命名的計算資料行,則這尤其有用。

使用 `ORDER BY` 定義排序順序

`ORDER BY` 子句可用於根據給定的準則對結果資料列進行排序。一般語法如下所示

SELECT * FROM my_table ORDER BY <sort_expression>;

這將顯示 `my_table` 中所有記錄的所有資料行值。結果將根據佔位符 `` 表示的表達式排序。

例如,假設我們有一個 `customer` 資料表,其中包含 `first_name`、`last_name`、`address` 和 `phone_number` 的資料行。如果我們想要按 `last_name` 的字母順序顯示結果,我們可以使用以下命令

SELECT * FROM customer ORDER BY last_name;
顯示結果

結果按 `last_name` 資料行以升序字母順序排序。

要反轉排序,我們可以在 `ORDER BY` 子句的末尾添加 `DESC` 修飾符

SELECT * FROM customer ORDER BY last_name DESC;
顯示結果

您也可以按多個資料行排序。在這裡,我們首先按 `last_name` 排序,然後對於任何具有相同 `last_name` 值的資料行,按 `first_name` 排序。這兩種排序都是升序。

SELECT * FROM customer ORDER BY last_name, first_name;
顯示結果

通常很重要的一個附加選項是闡明 `NULL` 值應在排序順序中顯示的位置。您可以通過為任何排序資料行添加 `NULLS FIRST`(預設值)或 `NULLS LAST` 來執行此操作

SELECT * FROM customer ORDER BY last_name NULLS LAST;

取得相異結果

如果您想在 PostgreSQL 中查找資料行的值範圍,可以使用 `SELECT DISTINCT` 變體。這將為資料行的每個相異值顯示一個資料列。

基本語法如下所示

SELECT DISTINCT column1 FROM my_table;

這將為 `column1` 中的每個唯一值顯示一個資料列。

例如,要顯示您的 `shirt` 資料表包含的 `color` 的所有不同值,您可以輸入

SELECT DISTINCT color FROM shirt;
color
------
blue
green
orange
red
yellow

要顯示跨多個資料行的唯一性,您可以添加以逗號分隔的其他資料行。

例如,這將顯示 `shirt` 資料表的所有不同 `color` 和 `shirt_size` 組合

SELECT DISTINCT color,shirt_size FROM shirt;
color | shirt_size
-------+-----------
blue | M
blue | S
green | M
green | L
green | S
orange | L
orange | M
red | M
yellow | S

這會顯示資料表內 `color` 和 `shirt_size` 的每個唯一組合。

一種通常更靈活的變體是 PostgreSQL 的 `SELECT DISTINCT ON` 命令。此格式允許您指定應組合唯一的資料行列表,並單獨列出您希望顯示的資料行。

一般語法如下所示,應唯一的資料行或多個資料行列在 `SELECT DISTINCT ON` 後面的括號中,後跟您希望顯示的資料行

SELECT DISTINCT ON (column1) column1, column2 FROM my_table ORDER BY column1;

例如,如果您想為每個襯衫尺寸顯示單一顏色,您可以輸入

SELECT DISTINCT ON (shirt_size) color,shirt_size FROM shirt;
color | shirt_size
------+-----------
red | M
green | L
green | S

這將為 `shirt_size` 中的每個唯一值顯示一個資料列。對於每個資料列,它將顯示 `color` 資料行,然後是 `shirt_size` 資料行。

如果使用 `ORDER BY` 子句,則為排序選擇的資料行必須與 `DISTINCT ON` 括號內選擇的資料行匹配,以使輸出具有可預測的結果

SELECT DISTINCT ON (shirt_size) color,shirt_size FROM shirt ORDER BY shirt_size DESC;
color | shirt_size
------+-----------
green | S
red | M
green | L

結論

在本指南中,我們介紹了您可以使用 `SELECT` 命令來識別和顯示資料表和視圖中記錄的一些基本方法。`SELECT` 命令是面向 SQL 的資料庫中最靈活和強大的操作之一,它有許多不同的方法可以添加子句、條件和篩選。

雖然我們在本指南中僅介紹了基本用法,但您在此處學到的一般格式將作為所有其他讀取和許多寫入查詢的基礎。學習更準確地篩選和定位結果的方法可以擴展我們今天介紹的功能。

關於作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以來一直撰寫關於資料庫、Linux、基礎架構和開發人員工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不必以第三人稱寫作,這讓所有相關方都鬆了一口氣。