| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 2. SQL 語言 | Fast Forward | Next |
要從一個資料表中檢索資料就是查詢這個資料表。 SQL 的 SELECT 就是做這個用途的。 該語句分為選擇列資料表(列出要返回的字串部分),資料表列資料表(列出從中檢索資料的資料表的部分), 以及可選的條件(聲明任意限制的部分)。比如,要檢索資料表 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 子句包含一個布爾(真值)資料表達式,只有那些布爾資料表達式為真的行才會被返回。 允許您在條件中使用常用的布爾操作符(AND,OR, 和 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)
再次聲明,結果行的順序可能是隨機的。 您可以組合使用 DISTINCT 和 ORDER BY 來獲取一致的結果: [2]
SELECT DISTINCT city
FROM weather
ORDER BY city;
| [1] | 雖然 SELECT * 對於把查詢的結果翻出來很有用, 我們普遍認為在生產代碼中這是很糟糕的風格,因為給資料表增加一個字串就改變了結果。 |
| [2] | 在一些資料庫系統裡,包括老版本的 PostgreSQL, DISTINCT 的實現自動對行進行排序,因此 ORDER BY 是多餘的。但是這一點並不是 SQL 標準的要求,並且目前的 PostgreSQL 並不保證 DISTINCT 導致資料行被排序。 |