SELECT

中文man手册

SELECT

NAME
SYNOPSIS
DESCRIPTION æè¿°
PARAMETERS åæ°
FROM åå¥
WHERE åå¥
GROUP BY åå¥
HAVING åå¥
UNION åå¥
INTERSECT åå¥
EXCEPT åå¥
SELECT å表
ORDER BY åå¥
LIMIT åå¥
DISTINCT åå¥
FOR UPDATE åå¥
EXAMPLES ä¾å
COMPATIBILITY å¼å®¹æ§
çç¥ FROM åå¥
AS å³é®å
GROUP BY å ORDER BY éå¯ç¨çåå空é´
éæ ååå¥
è¯è
è·

NAME

SELECT - ä»è¡¨æè§å¾ä¸ååºè¥å¹²è¡

SYNOPSIS

SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ AS output_name ] [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
[ FOR UPDATE [ OF table_name [, ...] ] ]

where from_item can be one of:

[ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
function_name
( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]
function_name
( [ argument [, ...] ] ) AS ( column_definition [, ...] )
from_item
[ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]

[Comment: FIXME: This last syntax is incorrect if the join type is an INNER or OUTER join (in which case one of NATURAL, ON ..., or USING ... is mandatory, not optional). What’s the best way to fix this?]

DESCRIPTION æè¿°

SELECT å°ä»ä¸ä¸ªææ´å¤è¡¨ä¸è¿åè®°å½è¡ã SELECT é常çå¤çå¦ä¸ï¼

1.

计ç®ååºå¨ FROM ä¸çææåç´ ãï¼FROM ä¸çæ¯ä¸ªåç´ é½æ¯ä¸ä¸ªçæ- £çæèèæç表ãï¼å¦æå¨ FROM å表é声æäºå¤è¿ä¸ä¸ªåç´ ï¼é£ä¹ä»ä»¬å°±äº¤åè¿æ¥å¨ä¸èµ·ãï¼åéä¸é¢ç FROM Clause [select(7)] ï¼ã

2.

妿声æäº WHERE åå¥ï¼é£ä¹å¨è¾åºä¸æ¶é¤ææ 䏿»¡è¶³æ¡ä»¶çè¡ãï¼åéä¸é¢ç WHERE Clause [select(7)] ï¼ã

3.

妿声æäº GROUP BY åå¥ï¼è¾åºå°±åæå¹éä¸ä¸ªæå¤ä¸ªæ°å¼çä¸åç»éã 妿åºç°äº HAVING å- å¥ï¼é£ä¹å®æ¶é¤é£äºä¸æ»¡è¶³ç»åºæ¡ä»¶çç»ãï¼åéä¸é¢ç GROUP BY Clause [select(7)] å HAVING Clause [select(7)] ï¼ã

4.

ä½¿ç¨ UNIONï¼INTERSECTï¼ å EXCEPTï¼æä»¬å¯ä»¥æå¤ä¸ª SELECT è¯- å¥çè¾åºåå¹¶æä¸ä¸ªç»æéãUNION æä½ç¬¦è¿åå¨ä¸¤ä¸ªç»æéæèå¶ä¸ä¸ä¸ªä¸- çè¡ï¼ INTERSECT æä½ç¬¦è¿å严格å°å¨ä¸¤ä¸ªç»æéä¸é½æçè¡ã EXCEPT æä½ç¬¦è¿åå¨ç¬¬ä¸ä¸ªç»æéä¸ï¼ä½æ¯ä¸å¨ç¬¬äºä¸ªç»æéä¸- çè¡ãä¸ç®¡åªç§æåµï¼ éå¤çè¡é½è¢«å é¤ï¼é¤é声æäº ALLãï¼åéä¸é¢ç UNION Clause [select(7)], INTERSECT Clause [select(l)], å EXCEPT Clause [select(7)] ï¼ã

5.

å®éè¾åºè¡çæ¶åï¼SELECT å为æ¯ä¸ªéåºçè¡è®¡ç®è¾åºè¡¨è¾¾å¼ ï¼åéä¸é¢ç SELECT List [select(7)] ï¼ã

6.

妿声æäº ORDER BY åå¥ï¼é£ä¹è¿åçè¡æ¯æç§æå®çé¡ºåºæåºçã å¦ææ²¡æç»åº ORDER BYï¼é£ä¹æ°æ®è¡æ¯æç§ç³»ç»è®¤ä¸ºå¯ä»¥æå¿«çæçæ¹æ³ç»åºçã ï¼åéä¸é¢ç ORDER BY Clause [select(7)] ï¼ã

7.

妿ç»åºäº LIMIT æè OFFSET åå¥ï¼é£ä¹ SELECT è¯- å¥åªè¿åç»æè¡çä¸ä¸ªåéãï¼åéä¸é¢ç LIMIT Clause [select(7)] ï¼ã

8.

DISTINCT ä»ç»æä¸å é¤é£äºéå¤çè¡ã DISTINCT ON å é¤é£äºå¹éæææå®è¡¨è¾¾å¼çè¡ã ALL ï¼ç¼ºçï¼å°è¿åææåéè¡ï¼åæ¬éå¤çã ï¼åéä¸é¢ç DISTINCT Clause [select(7)] ï¼ã

9.

FOR UPDATE åå¥å¯¼è´ SELECT è¯å¥å¯¹å¹¶åçæ´æ°éä½éå®çè¡ãï¼åéä¸é¢ç FOR UPDATE Clause [select(7)] ï¼ã

ä½ å¿é¡»æ SELECT æéç¨æ¥ä»è¡¨ä¸è¯»åæ°å¼ã ä½¿ç¨ FOR UPDATE è¿è¦æ± UPDATE æéã

PARAMETERS åæ°

FROM åå¥

FROM åå¥ä¸º SELECT 声æä¸ä¸ªæèå¤ä¸ªæºè¡¨ã 妿声æäºå¤ä¸ªæºè¡¨ï¼é£ä¹ç»æå°±æ¯æææºè¡¨çç¬å¡å¿ç§¯ï¼äº¤åè¿æ¥ï¼ã 使¯é常æä»¬ä¼æ·»å ä¸äºæ¡ä»¶ï¼æè¿åè¡éå¶æç¬å¡å¿ç§¯çä¸ä¸ªå°çç»æéã

FROM-åå¥å¯ä»¥åæ¬ï¼
table_name

ä¸ä¸ªç°åç表æè§å¾çååï¼å¯ä»¥ææ¨¡å¼ä¿®é¥°ï¼ã 妿声æäºONLYï¼ååªæ«æè¯¥è¡¨ã å¦ææ²¡æå£°æONLYï¼è¯¥è¡¨åææå¶æ´¾ç表ï¼å¦ææçè¯ï¼é½è¢«æ«æã å¯ä»¥å¨è¡¨ååé¢è·ä¸ä¸ª*æ¥è¡¨ç¤ºæ«ææå¶åä»£è¡¨ï¼ ä½å¨ç®åççæ¬éï¼è¿æ¯ç¼ºçç¹æ§ã ï¼å¨ PostgreSQL 7.1 以åççæ¬éï¼ONLYæ¯ç¼ºçç¹æ§ãï¼ ç¼ºççç¹æ§å¯ä»¥éè¿ä¿®æ¹éç½®é项 sql_interitance æ¥æ¹åã

alias

为é£äºåå«å«åç FROM 项ç®åçå«åãå«åç¨äºç¼©åæèå¨èªè¿æ¥ä¸æ¶é¤æ- §ä¹ï¼èªè¿æ¥éï¼åä¸ä¸ªè¡¨æ«æäºå¤æ¬¡ï¼ã 妿æä¾äºå«åï¼é£ä¹å®å°±ä¼å®å¨éè表æè彿°çå®éååï¼ æ¯å¦ï¼å¦æç»åº FROM foo AS fï¼é£ä¹ SELECT å©ä¸çä¸è¥¿å¿é¡»å§è¿ä¸ª FROM 项以 f è䏿¯ foo å¼ç¨ã妿åäºå«åï¼ æä»¬ä¹å¯ä»¥æä¾ä¸ä¸ªå- 段å«åå表ï¼è¿æ ·å¯ä»¥æ¿æ¢è¡¨ä¸ä¸ä¸ªæèå¤ä¸ªå段çååã

select

ä¸ä¸ªå SELECT å¨ FROM åå¥éåºç°çã å®çè¾åºä½ç¨å¥½è±¡æ¯ä¸ºè¿æ¡ SELECT å½ä»¤å¨å¶çåæéå建ä¸ä¸ªä¸´æ¶è¡¨ã 请注æè¿ä¸ªå SELECT å¿é¡»ç¨åæ¬å¼§åå´ã å¹¶ä¸å¿é¡»ç»å®å å«åã

function_name

彿°è°ç¨å¯ä»¥åºç°å¨ FROM åå¥éã ï¼å¯¹äºé£äºè¿åç»æéç彿°ç¹å«æç¨ï¼ä½æ¯ä»»ä½å½æ°é½è½ç¨ãï¼ è¿ä¹å就好åå¨è¿ä¸ª SELECT å½ä»¤çç彿ä¸ï¼ æå½æ°çè¾åºå建为ä¸ä¸ªä¸´æ¶è¡¨ä¸æ·ãæä»¬ä¹å¯ä»¥ä½¿ç¨å«åã妿åäºå«åï¼ æä»¬è¿å¯ä»¥åä¸ä¸ªå- 段å«åå表ï¼ä¸ºå½æ°è¿åçå¤åç±»åçä¸ä¸ªæå¤ä¸ªå±æ§æä¾ååæ¿æ¢ã 妿彿°å®ä¹ä¸ºäº record æ°æ®ç±»åï¼ é£ä¹å¿é¡»åºç°ä¸ä¸ª AS å³é®å- æèå«åï¼åé¢è·çä¸ä¸ªå段å®ä¹åè¡¨ï¼ å½¢å¦ï¼( column_name data_type [, ... ])ã è¿ä¸ªå段å®ä¹å表å¿é¡»å¹é彿°è¿åçåæ®µçå®éæ°ç®åç±»åã

join_type

[ INNER ] JOIN

LEFT [ OUTER ] JOIN

RIGHT [ OUTER ] JOIN

FULL [ OUTER ] JOIN

CROSS JOIN

ä¹ä¸ã å°± INNER å OUTER è¿æ¥ç±»åï¼ æä»¬å¿é¡»å£°æä¸ä¸ªè¿æ¥æ¡ä»¶ï¼ä¹å°±æ¯è¯´ä¸ä¸ª NATURALï¼ ON join_conditionï¼ æè USING (join_column [, ...])ã è§ä¸æè·åå®ä»¬çå«ä¹ï¼å¯¹äº CROSS JOINï¼è¿äºåå¥é½ä¸è½åºç°ã

ä¸ä¸ª JOIN åå¥ï¼ç»åäºä¸¤ä¸ª FROM 项ã å¿è¦æ¶ä½¿ç¨åæ¬å¼§ä»¥å³å®åµå¥ç顺åºã å¦ææ²¡æåæ¬å¼§ï¼JOIN çåµå¥ä»å·¦åå³ã å¨ä»»ä½æåµä¸ï¼JOIN 齿¯éå·åéç FROM 项ç»å®å¾æ´ç´§ã

CROSS JOIN å INNER JOIN çæä¸ä¸ªç®åçç¬å¡å¿ç§¯ï¼åä½ å¨ FROM çé¡¶å±ååºä¸¤ä¸ªé¡¹çç»æç¸åã CROSS JOIN çæäº INNER JOIN ON (true)ï¼ ä¹å°±æ¯è¯´ï¼æ²¡æè¢«æ¡ä»¶å é¤çè¡ãè¿ç§è¿æ¥ç±»ååªæ¯ç¬¦å·ä¸çæ¹ä¾¿ï¼ å ä¸ºå®ä»¬åä½ ç¨ç®åç FROM å WHERE å¹²çäºææ¯ä¸æ ·çã

LEFT OUTER JOIN è¿åææ¡ä»¶çç¬å¡å¿ç§¯ï¼ä¹å°±æ¯è¯´ï¼ ææç»ååºæ¥çè¡é½éè¿äºè¿æ¥æ¡ä»¶ï¼ä¸çè¡ï¼å ä¸å·¦æè¾¹ç表ä¸- 没æå¯¹åºçå³æè¾¹è¡¨çè¡å¯ä»¥ä¸èµ·å¹ééè¿è¿æ¥æ¡ä»¶çé£äºè¡ã è¿æ ·çå·¦æè¾¹çè¡æ©å±æè¿æ¥çæè¡¨çå¨é¿ï¼æ¹æ³æ¯å¨é£äºå³æè¾¹è¡¨å¯¹åºçå- 段ä½ç½®å¡«ä¸ç©ºã请注æï¼åªæå¨å³å®é£äºè¡æ¯å¹éçæ¶åï¼ ä¹è®¡ç® JOIN å- å¥èªå·±çæ¡ä»¶ãå¤å±çæ¡ä»¶æ¯å¨è¿ä¹åæ½å çã

对åºçæ¯ï¼RIGHT OUTER JOIN è¿åææè¿æ¥åºæ¥çè¡ï¼ å䏿¯ä¸ªä¸å¹éçå³æè¾¹è¡ï¼å·¦è¾¹ç¨ç©ºå¼æ©å±ï¼ãè¿åªæ¯ä¸ä¸ªç¬¦å·ä¸ç便å©ï¼å为æä»¬æ»æ¯å¯ä»¥æå®è½¬æ¢æä¸ä¸ª LEFT OUTER JOINï¼ åªè¦æå·¦è¾¹åå³è¾¹çè¾å¥å¯¹æä¸ä¸å³å¯ã

FULL OUTER JOIN è¿åææè¿æ¥åºæ¥çè¡ï¼å ä¸æ¯ä¸ªä¸å¹éçå·¦æè¾¹çè¡ï¼å³è¾¹ç¨ç©ºå¼æ©å±ï¼ï¼ å ä¸æ¯ä¸ªä¸å¹éçå³æè¾¹çè¡ï¼å·¦è¾¹ç¨ç©ºå¼æ©å±ï¼ã
ON
join_condition

join_condition æ¯ä¸ä¸ªè¡¨è¾¾å¼ï¼ çæç±»å为 boolean çç»æï¼ç±»ä¼¼WHERE åå¥ï¼ï¼ è¡¨ç¤ºè¿æ¥ä¸é£äºè¡è¢«è®¤ä¸ºæ¯å¹éçã

USING (join_column [, ...])

ä¸ä¸ªå½¢å¦ USING ( a, b, ... ) çåå¥ï¼ æ¯ON left_table.a = right_table.a AND left_table.b = right_table.b ... ç缩åãåæ ·ï¼USING è´æ¶µçï¼æ¯å¯¹çæå段ä¸åªæä¸ä¸ªåå«å¨è¿æ¥è¾åºä¸- ï¼è䏿¯ä¸¤ä¸ªé½è¾åºçææã

NATURAL

NATURAL æ¯ä¸ä¸ª USING å表ç缩åï¼è¿ä¸ªåè¡¨è¯´çæ¯ä¸¤ä¸ªè¡¨ä¸- ååççåæ®µã

WHERE åå¥

å¯éç WHERE æ¡ä»¶æå¦ä¸å¸¸è§çå½¢å¼ï¼

WHERE condition

è¿é condition å¯ä»¥æ¯ä»»æçæç±»å为 boolean ç表达å¼ã ä»»ä½ä¸æ»¡è¶³è¿ä¸ªæ¡ä»¶çè¡é½ä¼ä»è¾åºä¸- å é¤ã妿ä¸ä¸ªè¡çæ°å¼æ¿æ¢å°æ¡ä»¶çå¼ç¨ä¸- 计ç®åºæ¥çæ¡ä»¶ä¸ºçï¼é£ä¹è¯¥è¡å°±ç®æ»¡è¶³æ¡ä»¶ã

GROUP BY åå¥

å¯éç GROUP BY åå¥çä¸è¬å½¢å¼

GROUP BY expression [, ...]

GROUP BY å°æææå¨ç»åäºç表达å¼ä¸å±äº«åæ ·çå¼çè¡å缩æä¸è¡ã expression å¯ä»¥æ¯ä¸ä¸ªè¾å¥å段ååï¼ æèæ¯ä¸ä¸ªè¾å¥å段ï¼SELECT å表ï¼çåºå·ï¼æèä¹å¯ä»¥æ¯ä»»æä»è¾å¥å段å¼å½¢æçä»»æè¡¨è¾¾å¼ã 卿æ- §ä¹çæåµä¸ï¼ä¸ä¸ª GROUP BY çååå°è¢«è§£éæè¾å¥å段çååï¼è䏿¯è¾åºå段çååã

å¦æä½¿ç¨äºèé彿°ï¼é£ä¹å°±ä¼å¯¹ç»æä¸ç»çææè¡è¿è¡è®¡ç®ï¼ä¸ºæ¯ä¸ªç»çæä¸ä¸ªç¬ç«çå¼ï¼èå¦ææ²¡æ GROUP BYï¼ é£ä¹èé对éåºæ¥çææè¡è®¡ç®åºä¸ä¸ªå¼ï¼ã妿åºç°äº GROUP BYï¼ é£ä¹ SELECT å表表达å¼ä¸åå¼ç¨é£äºæ²¡æåç»çåæ®µå°±æ¯éæ³çï¼ é¤éæ¾å¨èé彿°éï¼å ä¸ºå¯¹äºæªåç»çåæ®µï¼å¯è½ä¼è¿åå¤ä¸ªæ°å¼ã

HAVING åå¥

å¯éç HAVING å奿å¦ä¸å½¢å¼ï¼

HAVING condition

è¿é condition å为 WHERE åå¥é声æçç¸åã

HAVING å»é¤äºä¸äºä¸æ»¡è¶³æ¡ä»¶çç»è¡ã HAVING ä¸ WHERE ä¸åï¼ WHERE å¨ä½¿ç¨ GROUP BY ä¹åè¿æ»¤åºåç¬çè¡ï¼è HAVING è¿æ»¤ç± GROUP BY å建çè¡ã å¨ condition éå¼ç¨çæ¯ä¸ªå段é½å¿é¡»æ æ- §ä¹å°å¼ç¨ä¸ä¸ªåç»çè¡ï¼é¤éå¼ç¨åºç°å¨ä¸ä¸ªèé彿°éã

UNION åå¥

UNION åå¥çä¸è¬å½¢å¼æ¯ï¼

select_statement UNION [ ALL ] select_statement

è¿é select_statement æ¯ä»»ææ²¡æ ORDER BYï¼LIMITï¼æè FOR UPDATE åå¥ç SELECTè¯å¥ã ï¼å¦æç¨åæ¬å¼§åå´ï¼ORDER BY å LIMIT å¯ä»¥éçå¨å表达å¼éã å¦ææ²¡æåæ¬å¼§ï¼è¿äºåå¥å°äº¤ç» UNION çç»æä½¿ç¨ï¼ è䏿¯ç»å®ä»¬å³æè¾¹çè¾å¥è¡¨è¾¾å¼ãï¼

UNION æä½ç¬¦è®¡ç®é£äºæ¶åå°çææ SELECT è¯å¥è¿åçè¡çç»æèåã ä¸ä¸ªè¡å¦æè³å°å¨ä¸¤ä¸ªç»æéä¸- çä¸ä¸ªéé¢åºç°ï¼é£ä¹å®å°±ä¼å¨è¿ä¸¤ä¸ªç»æéçéåèåä¸ã 两个å为 UNION ç´æ¥æä½æ°çSELECTå¿é¡»çæç¸åæ°ç®çåæ®µï¼ å¹¶ä¸å¯¹åºçå- 段å¿é¡»æå¼å®¹çæ°æ®ç±»åã

缺çå°ï¼UNION çç»æä¸åå«ä»»ä½éå¤çè¡ï¼é¤é声æäº ALL åå¥ã ALL å¶æ- ¢äºæ¶é¤éå¤çå¨ä½ã

åä¸SELECTè¯å¥ä¸çå¤ä¸ª UNION æä½ç¬¦æ¯ä»å·¦åå³è®¡ç®çï¼ é¤éç¨åæ¬å¼§è¿è¡äºæ è¯ã

ç®åï¼FOR UPDATE ä¸è½å¨ UNION çç»ææè¾å¥ä¸å£°æã

INTERSECT åå¥

INTERSECT åå¥çä¸è¬å½¢å¼æ¯ï¼

select_statement INTERSECT [ ALL ] select_statement

select_statement æ¯ä»»ä½ä¸å¸¦ ORDER BYï¼ LIMITï¼æè FOR UPDATE åå¥ç SELECT è¯å¥ã

INTERSECT è®¡ç®æ¶åç SELECT è¯å¥è¿åçè¡çéå交éã 妿ä¸ä¸ªè¡å¨ä¸¤ä¸ªç»æéä¸é½åºç°ï¼é£ä¹å®å°±å¨ä¸¤ä¸ªç»æéç交éä¸ã

NTERSECT çç»æä¸åå«ä»»ä½éå¤è¡ï¼é¤é你声æäº ALL é项ã ç¨äº ALL 以åï¼ä¸ä¸ªå¨å·¦æè¾¹çè¡¨éæ m 个éå¤èå¨å³æè¾¹è¡¨éæ n 个éå¤çè¡å°åºç° min(m,n) 次ã

é¤éç¨åæ¬å·ææé¡ºåºï¼ åä¸ SELECT è¯å¥ä¸çå¤ä¸ª INTERSECT æä½ç¬¦æ¯ä»å·¦åå³è®¡ç®çã INTERSECT æ¯ UNION ç»å®å¾æ´ç´§ --- ä¹å°±æ¯è¯´ A UNION B INTERSECT C å°è¯»å A UNION (B INTERSECT C)ï¼é¤éä½ ç¨åæ¬å¼§å£°æã

EXCEPT åå¥

EXCEPT å奿å¦ä¸çéç¨å½¢å¼ï¼

select_statement EXCEPT [ ALL ] select_statement

è¿é fIselect_statement æ¯ä»»ä½æ²¡æ ORDER BYï¼LIMITï¼æè FOR UPDATE å- å¥ç SELECT 表达å¼ã

EXCEPT æä½ç¬¦è®¡ç®åå¨äºå·¦è¾¹SELECT è¯å¥çè¾åºèä¸åå¨äºå³è¾¹è¯å¥è¾åºçè¡ã

EXCEPT çç»æä¸åå«ä»»ä½éå¤çè¡ï¼é¤é声æäº ALL é项ã ä½¿ç¨ ALL æ¶ï¼ä¸ä¸ªå¨å·¦æè¾¹è¡¨ä¸æ m 个éå¤èå¨å³æè¾¹è¡¨ä¸æ n 个éå¤çè¡å°åºç° max(m-n,0) 次ã

é¤éç¨åæ¬å¼§ææé¡ºåºï¼åä¸ SELECT è¯å¥ä¸çå¤ä¸ª EXCEPT æä½ç¬¦æ¯ä»å·¦åå³è®¡ç®çã EXCEPT å UNION ç»å®çº§å«ç¸åã

SELECT å表

SELECT å表ï¼å¨å³é®å SELECT å FROM) ä¹é´çä¸è¥¿ï¼å£°æä¸ä¸ªè¡¨è¾¾å¼ï¼è¿ä¸ªè¡¨è¾¾å¼å½¢æ SELECT è¯- å¥çè¾åºè¡ãè¿ä¸ªè¡¨è¾¾å¼å¯ä»¥ï¼é常ä¹çç¡®æ¯ï¼å¼ç¨é£äºå¨ FROM å- å¥é计ç®çåæ®µã éè¿ä½¿ç¨ AS output_nameï¼ æä»¬å¯ä»¥ä¸ºä¸ä¸ªè¾åºè¡å£°æå¦å¤ä¸ä¸ªååãè¿ä¸ªåå主è¦ç¨åæ¾ç¤ºè¯¥è¡çæ ç¾ã å®ä¹å¯ä»¥å¨ ORDER BY å GROUP BY åå¥éå½ä½å段å¼çå¼ç¨ï¼ 使¯ä¸è½å¨ WHERE æè HAVING åå¥éè¿ä¹ç¨ï¼å¨é£éï¼ä½ å¿é¡»ååºè¡¨è¾¾å¼ã

é¤äºè¡¨è¾¾å¼ä¹å¤ï¼æä»¬ä¹å¯ä»¥å¨è¾åºå表ä¸åä¸ä¸ª * 表示éåºçè¡çææå- 段ç缩åãåæ ·ï¼æä»¬å¯ä»¥å table_name.* ä½ä¸ºæ¥èªæä¸ªç¹å®è¡¨çåæ®µç缩åã

ORDER BY åå¥

å¯éç ORDER BY å奿ä¸é¢çä¸è¬å½¢å¼ï¼

ORDER BY expression [ ASC | DESC | USING operator ] [, ...]

expression å¯ä»¥æ¯ä¸ä¸ªè¾åºå段ï¼SELECT å表ï¼çååæèåºå·ï¼ æèä¹å¯ä»¥æ¯ç¨è¾å¥åæ®µçæ°å¼ç»æçä»»æè¡¨è¾¾å¼ã

ORDER BY åå¥å¯¼è´ç»æè¡æ ¹æ®æå®ç表达å¼è¿è¡æåºã å¦ææ¹æ®æå·¦è¾¹ç表达å¼ï¼ä¸¤è¡çç»æç¸åï¼é£ä¹å°±æ¹æ®ä¸ä¸ä¸ªè¡¨è¾¾å¼è¿è¡æ¯è¾ï¼ 便¤ç±»æ¨ãå¦æå¯¹äºææå£°æç表达å¼ä»ä»¬é½ç¸åï¼é£ä¹ä»¥éæºé¡ºåºè¿åã

åºæ°æçæ¯å/åæ®µæé¡ºåºï¼ä»å·¦å°å³ï¼çä½ç½®ã è¿ä¸ªç¹æ§è®©æä»¬å¯ä»¥å¯¹æ²¡æå¯ä¸åç§°çå/åæ®µè¿è¡æåºã è¿ä¸ç¹ä»æ¥ä¸æ¯å¿é¡»çï¼ å ä¸ºæ»æ¯å¯ä»¥éè¿ AS åå¥ç»ä¸ä¸ªè¦è®¡ç®çå/å- 段èµäºä¸ä¸ªåç§°ã

å¨ ORDER BY éè¿å¯ä»¥ä½¿ç¨ä»»æè¡¨è¾¾å¼ï¼ 忬é£äºæ²¡æåºç°å¨SELECTç»æå表éé¢çåæ®µã å æ¤ä¸é¢çè¯å¥ç°å¨æ¯åæ³çï¼

SELECT name FROM distributors ORDER BY code;

è¿ä¸ªç¹æ§çä¸ä¸ªå±éå°±æ¯åºç¨äº UNIONï¼INTERSECTï¼ æè EXCEPT æ¥è¯¢ç ORDER BY åå¥åªè½å¨ä¸ä¸ªè¾åºå段åæèæ°å- ä¸å£°æï¼èä¸è½å¨ä¸ä¸ªè¡¨è¾¾å¼ä¸å£°æã

请注æå¦æä¸ä¸ª ORDER BY è¡¨è¾¾å¼æ¯ä¸ä¸ªç®ååç§°ï¼ åæ¶å¹éç»æåæ®µåè¾å¥å- æ®µï¼ ORDER BY å°æå®è§£éæç»æå段åç§°ã è¿å GROUP BY å¨åæ ·æåµä¸åçéæ©æ- £ç¸åã è¿æ ·çä¸ä¸è´æ¯ç± SQL æ å强å¶çã

æä»¬å¯ä»¥ç» ORDER BY åå¥éæ¯ä¸ªå/åæ®µå ä¸ä¸ªå³é®å DESC ï¼éåºï¼æ ASCï¼ååºï¼ã妿ä¸å£°æï¼ ASC æ¯ç¼ºçã æä»¬è¿å¯ä»¥å¨ USING å- å¥é声æä¸ä¸ªæåºæä½ç¬¦æ¥å®ç°æåºã ASC çæäºä½¿ç¨ USING < è DESC çæäºä½¿ç¨ USING >ã (But the creator of a user-defined data type can define exactly what the default sort ordering is, and it might correspond to operators with other names.)

å¨ä¸ä¸ªåéï¼ç©ºå¼æåºæ¶æå¨å¶å®æ°å¼åé¢ãæ¢å¥è¯è¯´ï¼ååºæåºæ¶ï¼ ç©ºå¼æå¨æ«å°¾ï¼èéåºæåºæ¶ç©ºå¼æå¨å¼å¤´ã

å符类åçæ°æ®æ¯æç§åºåç¸å³çå- 符éé¡ºåºæåºçï¼è¿ä¸ªåºåæ¯å¨æ°æ®åºé群åå§åçæ¶å建ç«çã

LIMIT åå¥

LIMIT åå¥ç±ä¸¤ä¸ªç¬ç«çåå¥ç»æï¼

LIMIT { count | ALL }
OFFSET start

è¿é count 声æè¿åçæå¤§è¡æ°ï¼è start 声æå¼å§è¿åè¡ä¹å忽ç¥çè¡æ°ã
.PP
LIMIT å许你æ£ç´¢ç±æ¥è¯¢å¶ä»é¨åçæçè¡çæä¸é¨åã 妿ç»åºäºéå¶è®¡æ°ï¼é£ä¹è¿åçè¡æ°ä¸ä¼è¶è¿åªä¸ªéå¶ã 妿ç»åºäºä¸ä¸ªåç§»éï¼é£ä¹å¼å§è¿åè¡ä¹åä¼å¿½ç¥é£ä¸ªæ°éçè¡ã

å¨ä½¿ç¨ LIMIT æ¶ï¼ ä¸ä¸ªå¥½ä¹ æ¯æ¯ä½¿ç¨ä¸ä¸ª ORDER BY å- å¥æç»æè¡éå¶æä¸ä¸ªå¯ä¸ç顺åºã å¦åä½ ä¼å¾å°æ æ³é¢æçæ¥è¯¢è¿åçåé --- ä½ å¯è½æ³è¦ç¬¬åè¡å°ç¬¬äºåè¡ï¼ ä½ä»¥ä»ä¹é¡ºåºï¼é¤é你声æ ORDER BYï¼å¦åä½ ä¸ç¥éä»ä¹é¡ºåºã

æ¥è¯¢ä¼åå¨å¨çææ¥è¯¢è§åæ¶æ LIMIT èèè¿å»äºï¼ æä»¥ä½ å¾æå¯è½å ç»åºç LIMIT å OFFSET å¼ä¸åèå¾å°ä¸åçè§åï¼çæä¸åçè¡åºï¼ã å æ¤ç¨ä¸åç LIMIT/OFFSET å¼éæ©ä¸åçæ¥è¯¢ç»æçåéå°ä¸ä¼äº§çä¸è´çç»æï¼ é¤éä½ ç¨ ORDER BY 强å¶çæä¸ä¸ªå¯é¢è®¡çç»æé¡ºåºã è¿å¯ä¸æ¯æ¯çï¼è¿æ¯ SQL çæ¥çç¹ç¹ï¼å ä¸ºé¤éç¨äº ORDER BY 约æé¡ºåºï¼ SQL ä¸ä¿è¯æ¥è¯¢çæçç»ææä»»ä½ç¹å®ç顺åºã

DISTINCT åå¥

妿声æäº DISTINCTï¼é£ä¹å°±ä»ç»æéä¸- å é¤ææéå¤çè¡ï¼æ¯ä¸ªæéå¤çç»é½ä¿çä¸è¡ï¼ã ALL 声æç¸åçä½ç¨ï¼ææè¡é½è¢«ä¿çï¼è¿ä¸ªæ¯ç¼ºçã

DISTINCT ON ( expression [, ...] ) åªä¿çé£äºå¨ç»åºç表达å¼ä¸è¿ç®åºç¸åç»æçè¡éåä¸ç第ä¸è¡ã DISTINCT ON è¡¨è¾¾å¼æ¯ä½¿ç¨ä¸ ORDER BY ï¼è§ä¸æï¼ ç¸åçè§åè¿è¡è§£éçã请注æï¼é¤éæä»¬ä½¿ç¨äº ORDER BY æ¥ä¿è¯æä»¬éè¦çè¡é¦ååºç°ï¼å¦åï¼æ¯ä¸ª "第ä¸è¡" æ¯ä¸å¯é¢æµçã æ¯å¦ï¼

SELECT DISTINCT ON (location) location, time, report
FROM weather_reports
ORDER BY location, time DESC;

为æ¯ä¸ªå°ç¹æ£ç´¢æè¿çå¤©æ°æ¥åã使¯å¦ææä»¬æ²¡æä½¿ç¨ ORDER BY æ¥å¼ºå¶å¯¹æ¯ä¸ªå°ç¹çæ¶é´å¼è¿è¡éåºæåºï¼é£ä¹æä»¬å°±ä¼å¾å°æ¯ä¸ªå°ç¹çä¸ç¥éä»ä¹æ¶åçæ¥åã

DISTINCT ON 表达å¼å¿é¡»å¹éæå·¦è¾¹ç ORDER BY 表达å¼ã ORDER BY å- å¥å°é常åå«é¢å¤çè¡¨è¾¾å¼æ¥å¤ææ¯ä¸ª DISTINCT ON ç»éé¢éè¦çè¡çä¼å级ã

FOR UPDATE åå¥

FOR UPDATE å奿ä¸é¢çå½¢å¼

FOR UPDATE [ OF table_name [, ...] ]

FOR UPDATE 令é£äºè¢« SELECT è¯å¥æ£ç´¢åºæ¥çè¡è¢«éä½ï¼å°±åè¦æ´æ°ä¸æ ·ã è¿æ ·å°±é¿åå®ä»¬å¨å½åäºå¡ç»æå被å¶å®äºå¡ä¿®æ¹æèå é¤ï¼ ä¹å°±æ¯è¯´ï¼å¶å®è§å¾ UPDATEï¼DELETEï¼ æè SELECT FOR UPDATE è¿äºè¡çäºå¡å°è¢«é»å¡ï¼ ç´å°å½åäºå¡ç»æãåæ ·ï¼å¦æä¸ä¸ªæ¥èªå¶å®äºå¡ç UPDATEï¼ DELETEï¼æè SELECT FOR UPDATE å·²ç»éä½äºæä¸ªææäºéå®çè¡ï¼SELECT FOR UPDATE å°çå°é£äºäºå¡ç»æï¼ å¹¶ä¸å°éåéä½å¹¶è¿åæ´æ°çè¡ï¼æèä¸è¿åè¡ï¼å¦æè¡å·²ç»è¢«å é¤ï¼ãæ´å¤ç讨论åé Chapter 12 ‘‘Concurrency Control’’ ã

妿ç¹å®çè¡¨å¨ FOR UPDATE ä¸ï¼é£ä¹åªææ¥èªè¿äºè¡¨ä¸çè¡æè¢«éä½ï¼ ä»»ä½å¨ SELECT ä¸ä½¿ç¨çå¶å®è¡¨é½åªæ¯å平叏䏿 ·è¯»åã

FOR UPDATE ä¸è½å¨é£äºæ æ³ä½¿ç¨ç¬ç«çè¡¨æ°æ®è¡æ¸æ°æ è¯è¿åè¡çç¯å¢éï¼ æ¯å¦ï¼å®ä¸è½åèéä¸èµ·ä½¿ç¨ã

FOR UPDATE å¯ä»¥å¨ LIMIT åé¢åºç°ï¼ ä¸»è¦æ¯ä¸ºäºå 7.3 ä¹åç PostgreSQL å¼å®¹ã ä¸è¿ï¼å®å¨ LIMIT å颿§è¡æ´é«æï¼å æ¤æä»¬å»ºè®®æ¾å¨ LIMIT åé¢ã

EXAMPLES ä¾å

å°è¡¨ films å表 distributors è¿æ¥å¨ä¸èµ·ï¼

SELECT f.title, f.did, d.name, f.date_prod, f.kind
FROM distributors d, films f
WHERE f.did = d.did

title | did | name | date_prod | kind
-------------------+-----+--------------+------------+----------
The Third Man | 101 | British Lion | 1949-12-23 | Drama
The African Queen | 101 | British Lion | 1951-08-11 | Romantic
...

ç»è®¡ç¨kind åç»çææçµå½±åç»çå/åæ®µç lenï¼é¿åº¦ï¼çåï¼

SELECT kind, sum(len) AS total FROM films GROUP BY kind;

kind | total
----------+-------
Action | 07:34
Comedy | 02:58
Drama | 14:28
Musical | 06:42
Romantic | 04:38

ç»è®¡ææçµå½±ï¼filmsï¼ï¼ç»çå/åæ®µ lenï¼é¿åº¦ï¼çåï¼ç¨ kind åç»å¹¶ä¸æ¾ç¤ºå°äº5å°æ¶çç»æ»åï¼

SELECT kind, sum(len) AS total
FROM films
GROUP BY kind
HAVING sum(len) < interval ’5 hours’;

kind | total
----------+-------
Comedy | 02:58
Romantic | 04:38

ä¸é¢ä¸¤ä¸ªä¾åæ¯æ ¹æ®ç¬¬äºåï¼nameï¼çå容对åç¬çç»ææåºçç»å¸çæ¹æ³ï¼

SELECT * FROM distributors ORDER BY name;
SELECT * FROM distributors ORDER BY 2;

did | name
-----+------------------
109 | 20th Century Fox
110 | Bavaria Atelier
101 | British Lion
107 | Columbia
102 | Jean Luc Godard
113 | Luso films
104 | Mosfilm
103 | Paramount
106 | Toho
105 | United Artists
111 | Walt Disney
112 | Warner Bros.
108 | Westward

ä¸é¢è¿ä¸ªä¾åæ¼ç¤ºå¦ä½è·å¾è¡¨ distributors å actorsçè¿æ¥ï¼ åªå°æ¯ä¸ªè¡¨ä¸ä»¥åæ¯ W å¼å¤´çååºæ¥ã å ä¸ºåªåäºä¸ç¸å³çè¡ï¼æä»¥å³é®å ALL 被çç¥äºï¼

distributors: actors:
did | name id | name
-----+-------------- ----+----------------
108 | Westward 1 | Woody Allen
111 | Walt Disney 2 | Warren Beatty
112 | Warner Bros. 3 | Walter Matthau
... ...

SELECT distributors.name
FROM distributors
WHERE distributors.name LIKE ’W%’
UNION
SELECT actors.name
FROM actors
WHERE actors.name LIKE ’W%’;

name
----------------
Walt Disney
Walter Matthau
Warner Bros.
Warren Beatty
Westward
Woody Allen

è¿ä¸ªä¾åæ¾ç¤ºäºå¦ä½å¨ FROM åå¥ä¸ä½¿ç¨ä¸ä¸ªå½æ°ï¼ 忬另æåä¸å¸¦å- 段å®ä¹å表çã

CREATE FUNCTION distributors(int) RETURNS SETOF distributors AS ’
SELECT * FROM distributors WHERE did = $1;
´ LANGUAGE SQL;

SELECT * FROM distributors(111);
did | name
-----+-------------
111 | Walt Disney

CREATE FUNCTION distributors_2(int) RETURNS SETOF record AS ’
SELECT * FROM distributors WHERE did = $1;
´ LANGUAGE SQL;

SELECT * FROM distributors_2(111) AS (f1 int, f2 text);
f1 | f2
-----+-------------
111 | Walt Disney

COMPATIBILITY å¼å®¹æ§

å½ç¶ï¼SELECT è¯å¥å SQL æ åå¼å®¹ã使¯è¿æä¸äºæ©å±åä¸äºç¼ºå°çç¹æ§ã

çç¥ FROM åå¥

PostgreSQL å许æä»¬å¨ä¸ä¸ªæ¥è¯¢éçç¥ FROM åå¥ã å®çæç´æ¥ç¨éå°±æ¯è®¡ç®ç®åç常é表达å¼çç»æï¼

SELECT 2+2;

?column?
----------
4

å¶å®æäº SQL æ°æ®åºä¸è½è¿ä¹åï¼é¤éå¼å¥ä¸ä¸ªåè¡ç伪表å SELECT çæ°æ®æºã

è¿ä¸ªç¹æ§çå¦å¤ä¸ä¸ªä¸å¤ªææ¾çç¨éæ¯æä¸ä¸ªæ®éçä»ä¸ä¸ªæå¤ä¸ªè¡¨ç SELECT 缩åï¼

SELECT distributors.* WHERE distributors.name = ’Westward’;

did | name
-----+----------
108 | Westward

è¿æ ·ä¹å¯ä»¥è¿è¡æ¯å ä¸ºæä»¬ç» SELECT ä¸å¼ç¨äºä½æ²¡æå¨ FROM ä¸- æå°çæ¯ä¸ªè¡¨é½å äºä¸ä¸ªéå«ç FROM 项ã

å°½ç®¡è¿æ¯ä¸ªå¾æ¹ä¾¿çåæ³ï¼ä½å®å´å®¹æè¯¯ç¨ã æ¯å¦ï¼ä¸é¢çæ¥è¯¢

SELECT distributors.* FROM distributors d;

å¯è½å°±æ¯ä¸ªé误ï¼ç¨æ·ææå¯è½çæææ¯

SELECT d.* FROM distributors d;

è䏿¯ä¸é¢çä»å®éä¸å¾å°çæ çº¦æçè¿æ¥

SELECT distributors.* FROM distributors d, distributors distributors;

为äºå¸®å©æ£æµè¿ç§éè¯¯ï¼ PostgreSQL 以å以åççæ¬å°å¨ä½ ä½¿ç¨ä¸æ¡å³æéå« FROM ç¹æ§åææç¡®ç FROM åå¥çæ¥è¯¢çæ¶åç»åºè¦åã Also, it is possible to disable the implicit-FROM feature by setting the ADD_MISSING_FROM parameter to false.

AS å³é®å

å¨ SQL æ åéï¼å¯éçå³é®å AS æ¯å¤ä½çï¼å¯ä»¥å¿½ç¥æèä¸å¯¹è¯å¥äº§çä»»ä½å½±åã PostgreSQL åæå¨å¨éå½åå/åæ®µæ¶éè¦è¿ä¸ªå³é®åï¼ å ä¸ºç±»åæ©å±çç¹æ§ä¼å¯¼è´å¨è¿ä¸ªç¯å¢éçæ§ä¹ã ä¸è¿ï¼AS å¨ FROM 项鿝å¯éçã

GROUP BY å ORDER BY éå¯ç¨çåå空é´

å¨ SQL92 æ åéï¼ORDER BY åå¥åªè½ä½¿ç¨ç»æå段åæèç¼å·ï¼ è GROUP BY å- å¥åªè½ç¨åºäºè¾å¥å段åç表达å¼ã PostgreSQL 对è¿ä¸¤ä¸ªåå¥é½è¿è¡äºæ©å±ï¼ å许å¦å¤ä¸ç§éæ©ï¼ä½æ¯å¦æå卿§ä¹ï¼åä½¿ç¨æ åçè§£éï¼ã PostgreSQL è¿å许两个åå¥å£°æä»»æç表达å¼ã 请注æå¨è¡¨è¾¾å¼ä¸åºç°çåå- å¼ºæ»æ¯è¢«å½ä½è¾å¥å段åï¼è䏿¯ç»æå段åã

SQL99 uses a slightly different definition which is not upward compatible with SQL92. In most cases, however, PostgreSQL will interpret an ORDER BY or GROUP BY expression the same way SQL99 does.

éæ ååå¥

DISTINCT ON, LIMIT, å OFFSET 齿²¡æå¨ SQL æ åä¸å®ä¹ã

è¯è

Postgresql 䏿ç½ç« ä½ä¼å¹³ <laser@pgsqldb.org>

è·

æ¬é¡µé¢ä¸æçç±ä¸æ man æå页计åæä¾ã
䏿 man æå页计åï¼https://github.com/man-pages-zh/manpages-zh