支援版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

2.5. 查詢表格 #

若要從表格中檢索資料,則查詢表格。 使用SQL SELECT 敘述來執行此動作。 該敘述分為選取列表 (列出要傳回的欄位的部分)、表格列表 (列出要從中檢索資料的表格的部分) 和可選的條件 (指定任何限制的部分)。 例如,若要檢索表格 weather 的所有列,請輸入

SELECT * FROM weather;

此處 *所有欄位的簡寫。 [2] 因此,使用下列指令會得到相同結果

SELECT city, temp_lo, temp_hi, prcp, date FROM weather;

輸出應為

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
 Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)

您可以在選取列表中撰寫運算式,而不僅僅是簡單的欄位參照。 例如,您可以執行

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

這應該會給出

     city      | temp_avg |    date
---------------+----------+------------
 San Francisco |       48 | 1994-11-27
 San Francisco |       50 | 1994-11-29
 Hayward       |       45 | 1994-11-29
(3 rows)

請注意如何使用 AS 子句重新標記輸出欄位。(AS 子句是可選的。)

可以透過新增 WHERE 子句來 限定查詢,該子句指定需要的列。WHERE 子句包含布林值(真值)運算式,並且僅傳回布林值運算式為 true 的列。 在條件中允許使用常用的布林運算子(ANDORNOT)。 例如,以下指令檢索舊金山在下雨天的天氣

SELECT * FROM weather
    WHERE city = 'San Francisco' AND prcp > 0.0;

結果

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

您可以請求以排序順序傳回查詢的結果

SELECT * FROM weather
    ORDER BY city;
     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 Hayward       |      37 |      54 |      | 1994-11-29
 San Francisco |      43 |      57 |    0 | 1994-11-29
 San Francisco |      46 |      50 | 0.25 | 1994-11-27

在此範例中,排序順序未完全指定,因此您可能會以任何順序取得舊金山的列。 但如果您執行以下指令,您將始終獲得上面顯示的結果

SELECT * FROM weather
    ORDER BY city, temp_lo;

您可以請求從查詢的結果中移除重複的列

SELECT DISTINCT city
    FROM weather;
     city
---------------
 Hayward
 San Francisco
(2 rows)

同樣地,此處的結果列排序可能會有所不同。 您可以使用 DISTINCTORDER BY 一起使用來確保一致的結果:[3]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;


[2] 雖然 SELECT * 對於臨時查詢很有用,但在生產程式碼中,它被廣泛認為是不良的風格,因為向表格新增欄位會變更結果。

[3] 在某些資料庫系統中,包括舊版本的 PostgreSQLDISTINCT 的實作會自動排序列,因此 ORDER BY 是不必要的。 但是 SQL 標準沒有要求這樣做,並且目前的 PostgreSQL 不保證 DISTINCT 會導致列被排序。

提交更正

如果您在文件中發現任何不正確之處、與您使用特定功能的經驗不符,或需要進一步澄清,請使用此表單報告文件問題。