?
This document uses PHP Chinese website manual Release
要從一個(gè)表中檢索數(shù)據(jù)就是queried這個(gè)表。 SQL的SELECT語(yǔ)句就是做這個(gè)用途的。 該語(yǔ)句分為選擇列表(列出要返回的字段)、表列表(列出從中檢索數(shù)據(jù)的表)、以及可選的條件(聲明任意限制)。 比如,要檢索表weather的所有行,鍵入:
SELECT * FROM weather;
這里的*是"all columns"的縮寫(xiě)。 [1] 因此同樣的結(jié)果可以用下面的語(yǔ)句獲得
SELECT city, temp_lo, temp_hi, prcp, date FROM weather;
而輸出應(yīng)該是:
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)
你可以在選擇列表中寫(xiě)任意表達(dá)式,而不僅僅是字段列表。比如,你可以:
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
這樣應(yīng)該得到:
city | temp_avg | date ---------------+----------+------------ San Francisco | 48 | 1994-11-27 San Francisco | 50 | 1994-11-29 Hayward | 45 | 1994-11-29 (3 rows)
請(qǐng)注意這里的AS子句是如何給輸出字段重新命名的。 AS子句是可選的。
一個(gè)查詢可以使用WHERE子句進(jìn)行"qualified", 聲明需要哪些行。WHERE子句包含一個(gè)布爾表達(dá)式, 只有那些布爾表達(dá)式為真的行才會(huì)被返回。 允許你在條件中使用常用的布爾操作符(AND, OR,和NOT)。 比如,下面的查詢檢索舊金山的下雨天的天氣:
SELECT * FROM weather WHERE city = 'San Francisco' AND prcp > 0.0;
結(jié)果如下:
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
在這個(gè)例子里,排序的順序并非絕對(duì)清晰的,因此你可能看到San Francisco行隨機(jī)的排序。 但是如果你使用下面的語(yǔ)句,那么就總是會(huì)得到上面的結(jié)果:
SELECT * FROM weather ORDER BY city, temp_lo;
你可以要求查詢的結(jié)果按照某種順序排序,并且消除重復(fù)行的輸出:
SELECT DISTINCT city FROM weather;
city --------------- Hayward San Francisco (2 rows)
再次聲明,結(jié)果行的順序可能是隨機(jī)的。 你可以組合使用DISTINCT和ORDER BY來(lái)獲取一致的結(jié)果: [2]
SELECT DISTINCT city FROM weather ORDER BY city;
[1] | 雖然SELECT *可以把查詢的結(jié)果翻出來(lái), 但我們普遍認(rèn)為在生產(chǎn)代碼中這是很糟糕的風(fēng)格, 因?yàn)榻o表增加一個(gè)字段就改變了結(jié)果。 |
[2] | 在一些數(shù)據(jù)庫(kù)系統(tǒng)里, 包括老版本的PostgreSQL, DISTINCT自動(dòng)對(duì)行進(jìn)行排序, 因此ORDER BY是多余的。 但是這一點(diǎn)并不是SQL標(biāo)準(zhǔn)的要求, 并且目前的PostgreSQL并不保證DISTINCT導(dǎo)致數(shù)據(jù)行被排序。 |