2.5. 查詢一個資料表

要從一個資料表中檢索資料就是查詢這個資料表。 SQLSELECT 就是做這個用途的。 該語句分為選擇列資料表(列出要返回的字串部分),資料表列資料表(列出從中檢索資料的資料表的部分), 以及可選的條件(聲明任意限制的部分)。比如,要檢索資料表 weather 的所有行,鍵入:

SELECT * FROM weather;

這裡 *"所有字串" 的縮寫。 [1] 因此同樣的結果可以用下面語句獲得:

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 子句包含一個布爾(真值)資料表達式,只有那些布爾資料表達式為真的行才會被返回。 允許您在條件中使用常用的布爾操作符(ANDOR, 和 NOT)。 比如,下面的查詢檢索舊金山的下雨天的天氣:

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

在這個例子裡,排序的順序並非絕對清晰的,因此您可能看到 San Francisco 行隨機的排序。 但是如果您使用下面的語句,那麼就總是會得到上面的結果

SELECT * FROM weather
    ORDER BY city, temp_lo;

您可以要求查詢的結果按照某種順序排序, 並且消除重複的行輸出:

SELECT DISTINCT city
    FROM weather;

     city
---------------
 Hayward
 San Francisco
(2 rows)

再次聲明,結果行的順序可能是隨機的。 您可以組合使用 DISTINCTORDER BY 來獲取一致的結果: [2]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;

Notes

[1]

雖然 SELECT * 對於把查詢的結果翻出來很有用, 我們普遍認為在生產代碼中這是很糟糕的風格,因為給資料表增加一個字串就改變了結果。

[2]

在一些資料庫系統裡,包括老版本的 PostgreSQLDISTINCT 的實現自動對行進行排序,因此 ORDER BY 是多餘的。但是這一點並不是 SQL 標準的要求,並且目前的 PostgreSQL 並不保證 DISTINCT 導致資料行被排序。