SELECT
目录
SELECT
NAMESYNOPSIS
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