SELECT
SELECT, TABLE, WITH â полÑÑиÑÑ ÑÑÑоки из ÑаблиÑÑ Ð¸Ð»Ð¸ пÑедÑÑавлениÑ
СинÑакÑиÑ
[ WITH [ RECURSIVE ]запÑоÑ_WITH[, ...] ] SELECT [ ALL | DISTINCT [ ON (вÑÑажение[, ...] ) ] ] [ { * |вÑÑажение[ [ AS ]имÑ_ÑезÑлÑÑаÑа] } [, ...] ] [ FROMÑлеменÑ_FROM[, ...] ] [ WHEREÑÑловие] [ GROUP BY [ ALL | DISTINCT ]ÑлеменÑ_гÑÑппиÑованиÑ[, ...] ] [ HAVINGÑÑловие] [ WINDOWимÑ_окнаAS (опÑеделение_окна) [, ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ]вÑбоÑка] [ ORDER BYвÑÑажение[ ASC | DESC | USINGопеÑаÑоÑ] [ NULLS { FIRST | LAST } ] [, ...] ] [ LIMIT {ÑиÑло| ALL } ] [ OFFSETнаÑало[ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ÑиÑло] { ROW | ROWS } { ONLY | WITH TIES } ] [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OFимÑ_ÑаблиÑÑ[, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ] ÐдеÑÑ Ð´Ð¾Ð¿ÑÑкаеÑÑÑÑлеменÑ_FROM: [ ONLY ]имÑ_ÑаблиÑÑ[ * ] [ [ AS ]пÑевдоним[ (пÑевдоним_ÑÑолбÑа[, ...] ) ] ] [ TABLESAMPLEмеÑод_вÑбоÑки(аÑгÑменÑ[, ...] ) [ REPEATABLE (заÑÑавка) ] ] [ LATERAL ] (вÑбоÑка) [ AS ]пÑевдоним[ (пÑевдоним_ÑÑолбÑа[, ...] ) ]имÑ_запÑоÑа_WITH[ [ AS ]пÑевдоним[ (пÑевдоним_ÑÑолбÑа[, ...] ) ] ] [ LATERAL ]имÑ_ÑÑнкÑии( [аÑгÑменÑ[, ...] ] ) [ WITH ORDINALITY ] [ [ AS ]пÑевдоним[ (пÑевдоним_ÑÑолбÑа[, ...] ) ] ] [ LATERAL ]имÑ_ÑÑнкÑии( [аÑгÑменÑ[, ...] ] ) [ AS ]пÑевдоним(опÑеделение_ÑÑолбÑа[, ...] ) [ LATERAL ]имÑ_ÑÑнкÑии( [аÑгÑменÑ[, ...] ] ) AS (опÑеделение_ÑÑолбÑа[, ...] ) [ LATERAL ] ROWS FROM(имÑ_ÑÑнкÑии( [аÑгÑменÑ[, ...] ] ) [ AS (опÑеделение_ÑÑолбÑа[, ...] ) ] [, ...] ) [ WITH ORDINALITY ] [ [ AS ]пÑевдоним[ (пÑевдоним_ÑÑолбÑа[, ...] ) ] ]ÑлеменÑ_FROMÑип_ÑоединениÑÑлеменÑ_FROM{ ONÑÑловие_ÑоединениÑ| USING (ÑÑолбеÑ_ÑоединениÑ[, ...] ) [ ASпÑевдоним_иÑполÑзованиÑ_ÑоединениÑ] }ÑлеменÑ_FROMNATURALÑип_ÑоединениÑÑлеменÑ_FROMÑлеменÑ_FROMCROSS JOINÑлеменÑ_FROMиÑлеменÑ_гÑÑппиÑованиÑÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑледÑÑÑим: ( )вÑÑажение(вÑÑажение[, ...] ) ROLLUP ( {вÑÑажение| (вÑÑажение[, ...] ) } [, ...] ) CUBE ( {вÑÑажение| (вÑÑажение[, ...] ) } [, ...] ) GROUPING SETS (ÑлеменÑ_гÑÑппиÑованиÑ[, ...] ) изапÑоÑ_WITH:имÑ_запÑоÑа_WITH[ (имÑ_ÑÑолбÑа[, ...] ) ] AS [ [ NOT ] MATERIALIZED ] (вÑбоÑка|values|insert|update|delete) [ SEARCH { BREADTH | DEPTH } FIRST BYимÑ_ÑÑолбÑа[, ...] SETимÑ_ÑÑолбÑа_поÑлед_поиÑка] [ CYCLEимÑ_ÑÑолбÑа[, ...] SETимÑ_ÑÑолбÑа_помеÑки_Ñикла[ TOзнаÑение_помеÑки_ÑиклаDEFAULTпомеÑка_Ñикла_по_ÑмолÑаниÑ] USINGимÑ_ÑÑолбÑа_пÑÑи_Ñикла] TABLE [ ONLY ]имÑ_ÑаблиÑÑ[ * ]
ÐпиÑание
SELECT полÑÑÐ°ÐµÑ ÑÑÑоки из множеÑÑва ÑÐ°Ð±Ð»Ð¸Ñ (возможно, пÑÑÑого). ÐбÑÐ°Ñ Ð¿ÑоÑедÑÑа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SELECT ÑледÑÑÑаÑ:
ÐÑполнÑÑÑÑÑ Ð²Ñе запÑоÑÑ Ð² ÑпиÑке
WITH. Ðо ÑÑÑи они ÑоÑмиÑÑÑÑ Ð²ÑеменнÑе ÑаблиÑÑ, к коÑоÑÑм заÑем можно обÑаÑаÑÑÑÑ Ð² ÑпиÑкеFROM. ÐапÑÐ¾Ñ Ð²WITHбез ÑказаниÑNOT MATERIALIZEDвÑполнÑеÑÑÑ ÑолÑко один Ñаз, даже когда он ÑигÑÑиÑÑÐµÑ Ð² ÑпиÑкеFROMнеоднокÑаÑно. (См. ÐÑедложение WITH ниже.)ÐÑÑиÑлÑÑÑÑÑ Ð²Ñе ÑлеменÑÑ Ð² ÑпиÑке
FROM. (ÐаждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² ÑпиÑкеFROMпÑедÑÑавлÑÐµÑ Ñобой ÑеалÑнÑÑ Ð¸Ð»Ð¸ виÑÑÑалÑнÑÑ ÑаблиÑÑ.) ÐÑли ÑпиÑокFROMÑодеÑÐ¶Ð¸Ñ Ð½ÐµÑколÑко ÑлеменÑов, они обÑединÑÑÑÑÑ Ð¿ÐµÑекÑÑÑÑнÑм Ñоединением. (См. ÐÑедложение FROM ниже.)ÐÑли Ñказано пÑедложение
WHERE, вÑе ÑÑÑоки, не ÑдовлеÑвоÑÑÑÑие ÑÑловиÑ, иÑклÑÑаÑÑÑÑ Ð¸Ð· ÑезÑлÑÑаÑа. (См. ÐÑедложение WHERE ниже.)ÐÑли пÑиÑÑÑÑÑвÑÐµÑ Ñказание
GROUP BY, либо в запÑоÑе вÑзÑваÑÑÑÑ Ð°Ð³ÑегаÑнÑе ÑÑнкÑии, вÑвод ÑазделÑеÑÑÑ Ð¿Ð¾ гÑÑппам ÑÑÑок, ÑооÑвеÑÑÑвÑÑÑим Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð»Ð¸ неÑколÑким знаÑениÑм, а заÑем вÑÑиÑлÑÑÑÑÑ ÑезÑлÑÑаÑÑ Ð°Ð³ÑегаÑнÑÑ ÑÑнкÑий. ÐÑли добавлено пÑедложениеHAVING, оно иÑклÑÑÐ°ÐµÑ Ð³ÑÑппÑ, не ÑдовлеÑвоÑÑÑÑие Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑловиÑ. (См. ÐÑедложение GROUP BY и ÐÑедложение HAVING ниже.) ХоÑÑ ÑÑолбÑÑ Ð²Ñвода запÑоÑа номиналÑно вÑÑиÑлÑÑÑÑÑ Ð½Ð° ÑледÑÑÑем Ñаге, на Ð½Ð¸Ñ Ñакже можно ÑÑÑлаÑÑÑÑ (по имени или поÑÑÐ´ÐºÐ¾Ð²Ð¾Ð¼Ñ Ð½Ð¾Ð¼ÐµÑÑ) в пÑедложенииGROUP BY.ÐÑÑиÑлÑÑÑÑÑ ÑакÑиÑеÑкие вÑÑ Ð¾Ð´Ð½Ñе ÑÑÑоки по заданнÑм в
SELECTвÑÑажениÑм Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ вÑбÑанной ÑÑÑоки или гÑÑÐ¿Ð¿Ñ ÑÑÑок. (См. СпиÑок SELECT ниже.)SELECT DISTINCTиÑклÑÑÐ°ÐµÑ Ð¸Ð· ÑезÑлÑÑаÑа повÑоÑÑÑÑиеÑÑ ÑÑÑоки.SELECT DISTINCT ONиÑклÑÑÐ°ÐµÑ ÑÑÑоки, ÑовпадаÑÑие по вÑем ÑказаннÑм вÑÑажениÑм.SELECT ALL(по ÑмолÑаниÑ) возвÑаÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки ÑезÑлÑÑаÑа, вклÑÑÐ°Ñ Ð´ÑбликаÑÑ. (См. ÐÑедложение DISTINCT ниже.)ÐпеÑаÑоÑÑ
UNION,INTERSECTиEXCEPTобÑединÑÑÑ Ð²Ñвод неÑколÑÐºÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´SELECTв один ÑезÑлÑÑиÑÑÑÑий набоÑ. ÐпеÑаÑоÑUNIONвозвÑаÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки, пÑедÑÑавленнÑе в одном, либо Ð¾Ð±Ð¾Ð¸Ñ Ð½Ð°Ð±Ð¾ÑÐ°Ñ ÑезÑлÑÑаÑов. ÐпеÑаÑоÑINTERSECTвозвÑаÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки, пÑедÑÑавленнÑе ÑÑÑого в Ð¾Ð±Ð¾Ð¸Ñ Ð½Ð°Ð±Ð¾ÑÐ°Ñ . ÐпеÑаÑоÑEXCEPTвозвÑаÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки, пÑедÑÑавленнÑе в пеÑвом набоÑе, но не во вÑоÑом. Ðо вÑÐµÑ ÑÑÑÑ ÑлÑÑаÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ ÑÑÑоки иÑклÑÑаÑÑÑÑ Ð¸Ð· ÑезÑлÑÑаÑа, еÑли Ñвно не ÑказаноALL. ЧÑÐ¾Ð±Ñ Ñвно обознаÑиÑÑ, ÑÑо вÑдаваÑÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑолÑко неповÑоÑÑÑÑиеÑÑ ÑÑÑоки, можно добавиÑÑ Ð¸Ð·Ð±ÑÑоÑное ÑловоDISTINCT. ÐамеÑÑÑе, ÑÑо в данном конÑекÑÑе по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑDISTINCT, Ñ Ð¾ÑÑ Ð² ÑамомSELECTпо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑALL. (См. ÐÑедложение UNION+, ÐÑедложение INTERSECT и ÐÑедложение EXCEPT ниже.)ÐÑли пÑиÑÑÑÑÑвÑÐµÑ Ð¿Ñедложение
ORDER BY, возвÑаÑаемÑе ÑÑÑоки ÑоÑÑиÑÑÑÑÑÑ Ð² Ñказанном поÑÑдке. РоÑÑÑÑÑÑвиеORDER BYÑÑÑоки возвÑаÑаÑÑÑÑ Ð² Ñом поÑÑдке, в каком ÑиÑÑеме бÑÐ´ÐµÑ Ð¿ÑоÑе Ð¸Ñ Ð²ÑдаÑÑ. (См. ÐÑедложение ORDER BY> ниже.)ÐÑли Ñказано пÑедложение
LIMIT(илиFETCH FIRST) либоOFFSET, опеÑаÑоÑSELECTвозвÑаÑÐ°ÐµÑ ÑолÑко подмножеÑÑво ÑÑÑок ÑезÑлÑÑаÑа. (См. ÐÑедложение LIMIT ниже.)ÐÑли Ñказано
FOR UPDATE,FOR NO KEY UPDATE,FOR SHAREилиFOR KEY SHARE, опеÑаÑоÑSELECTблокиÑÑÐµÑ Ð²ÑбÑаннÑе ÑÑÑоки, заÑиÑÐ°Ñ Ð¸Ñ Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð²ÑеменнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. (См. ÐÑедложение блокиÑовки ниже.)
ÐÐ»Ñ Ð²ÑеÑ
ÑÑолбÑов, задейÑÑвованнÑÑ
в команде SELECT, необÑ
одимо имеÑÑ Ð¿Ñаво SELECT. ÐÑименение блокиÑовок FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE или FOR KEY SHARE ÑÑебÑÐµÑ Ñакже пÑава UPDATE (как минимÑм Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа в каждой вÑбÑанной Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки ÑаблиÑе).
ÐаÑамеÑÑÑ
ÐÑедложение WITH
ÐÑедложение WITH позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко подзапÑоÑов, к коÑоÑÑм заÑем можно обÑаÑиÑÑÑÑ Ð¿Ð¾ имени в оÑновном запÑоÑе. ÐÑи подзапÑоÑÑ Ð¿Ð¾ ÑÑÑи дейÑÑвÑÑÑ ÐºÐ°Ðº вÑеменнÑе ÑаблиÑÑ Ð¸Ð»Ð¸ пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ запÑоÑа. ÐаждÑй подзапÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ñобой опеÑаÑÐ¾Ñ SELECT, TABLE, VALUES, INSERT, UPDATE или DELETE. ÐÑи иÑполÑзовании в WITH опеÑаÑоÑа, изменÑÑÑего даннÑе, (INSERT, UPDATE или DELETE) обÑÑно добавлÑеÑÑÑ Ð¿Ñедложение RETURNING. ÐамеÑÑÑе, ÑÑо именно ÑезÑлÑÑÐ°Ñ RETURNING, а не нижележаÑÐ°Ñ ÑаблиÑа, изменÑÐµÐ¼Ð°Ñ Ð·Ð°Ð¿ÑоÑом, ÑоÑмиÑÑÐµÑ Ð²ÑеменнÑÑ ÑаблиÑÑ, коÑоÑÑÑ Ð·Ð°Ñем ÑиÑÐ°ÐµÑ Ð¾Ñновной запÑоÑ. ÐÑли RETURNING опÑÑено, опеÑаÑÐ¾Ñ Ñем не менее вÑполнÑеÑÑÑ, но не вÑдаÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ ÑезÑлÑÑаÑа, Ñак ÑÑо на него нелÑÐ·Ñ ÑоÑлаÑÑÑÑ ÐºÐ°Ðº на ÑаблиÑÑ Ð² оÑновном запÑоÑе.
ÐÐ¼Ñ (без ÑÑ
емÑ) должно бÑÑÑ Ñказано Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запÑоÑа WITH. Также можно задаÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑй ÑпиÑок Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ ÑÑолбÑов; еÑли он опÑÑен, имена ÑÑолбÑов ÑоÑмиÑÑÑÑÑÑ Ð¸Ð· ÑезÑлÑÑаÑа подзапÑоÑа.
ÐÑли Ñказано RECURSIVE, подзапÑÐ¾Ñ SELECT Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ñам на ÑÐµÐ±Ñ Ð¿Ð¾ имени. Такой подзапÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ ÑоÑмÑ
неÑекÑÑÑивнаÑ_ÑаÑÑÑUNION [ ALL | DISTINCT ]ÑекÑÑÑивнаÑ_ÑаÑÑÑ
, где ÑекÑÑÑÐ¸Ð²Ð½Ð°Ñ ÑÑÑлка на Ñам запÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ñ
одиÑÑÑÑ ÑолÑко ÑпÑава Ð¾Ñ UNION. ÐÐ»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ запÑоÑа допÑÑкаеÑÑÑ ÑолÑко одна ÑекÑÑÑÐ¸Ð²Ð½Ð°Ñ ÑÑÑлка на него же. ÐпеÑаÑоÑÑ, изменÑÑÑие даннÑе, не могÑÑ Ð±ÑÑÑ ÑекÑÑÑивнÑми, но ÑезÑлÑÑÐ°Ñ ÑекÑÑÑивного запÑоÑа SELECT в ÑакиÑ
опеÑаÑоÑаÑ
можно иÑполÑзоваÑÑ. Ðа пÑимеÑом обÑаÑиÑеÑÑ Ðº РазделÑ 7.8.
ÐÑÑ Ð¾Ð´Ð½Ð° оÑобенноÑÑÑ RECURSIVE в Ñом, ÑÑо запÑоÑÑ WITH могÑÑ Ð±ÑÑÑ Ð½ÐµÑпоÑÑдоÑеннÑми: запÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° дÑÑгой, идÑÑий в ÑпиÑке поÑле него. (Ðднако ÑиклиÑеÑкие ÑÑÑлки или Ð²Ð·Ð°Ð¸Ð¼Ð½Ð°Ñ ÑекÑÑÑÐ¸Ñ Ð½Ðµ поддеÑживаÑÑÑÑ.) Ðез RECURSIVE запÑÐ¾Ñ Ð² WITH Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ ÑолÑко на запÑоÑÑ Ñого же ÑÑÐ¾Ð²Ð½Ñ Ð² WITH, пÑедÑеÑÑвÑÑÑие ÐµÐ¼Ñ Ð² ÑпиÑке WITH.
Ðогда в пÑедложении WITH задаÑÑÑÑ Ð½ÐµÑколÑко запÑоÑов, RECURSIVE ÑледÑÐµÑ ÑказÑваÑÑ ÑолÑко единождÑ, ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле WITH. ÐÑо Ñказание бÑÐ´ÐµÑ Ð´ÐµÐ¹ÑÑвоваÑÑ Ð½Ð° вÑе запÑоÑÑ Ð² пÑедложении WITH, Ñ
оÑÑ Ð¾Ð½Ð¾ никак не ÑкажеÑÑÑ Ð½Ð° запÑоÑаÑ
, не иÑполÑзÑÑÑиÑ
ÑекÑÑÑÐ¸Ñ Ð¸Ð»Ð¸ ÑÑÑлки на поÑледÑÑÑие запÑоÑÑ.
ÐеобÑзаÑелÑное пÑедложение SEARCH вÑÑиÑлÑÐµÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑи поиÑка, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ ÑезÑлÑÑаÑов ÑекÑÑÑивного запÑоÑа «ÑнаÑала в ÑиÑинÑ» или «ÑнаÑала в глÑбинÑ». ÐеÑедаваемÑй ÑпиÑок имÑн ÑÑолбÑов задаÑÑ ÐºÐ»ÑÑ ÑÑÑоки, по коÑоÑÐ¾Ð¼Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑÑлеживаÑÑÑÑ, какие ÑÑÑоки бÑли поÑеÑенÑ. СÑÐ¾Ð»Ð±ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ имÑ_ÑÑолбÑа_поÑлед_поиÑка бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ в ÑпиÑок ÑезÑлÑÑиÑÑÑÑиÑ
ÑÑолбÑов запÑоÑа WITH. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð½Ñжного поÑÑдка можно вÑполниÑÑ ÑоÑÑиÑÐ¾Ð²ÐºÑ Ð¿Ð¾ ÑÑÐ¾Ð¼Ñ ÑÑолбÑÑ Ð²Ð¾ внеÑнем запÑоÑе. Ðа пÑимеÑами обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 7.8.2.1.
ÐеобÑзаÑелÑное пÑедложение CYCLE пÑименÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±Ð½Ð°ÑÑÐ¶ÐµÐ½Ð¸Ñ Ñиклов в ÑекÑÑÑивнÑÑ
запÑоÑаÑ
. ÐадаваемÑй в нÑм ÑпиÑок имÑн ÑÑолбÑов опÑеделÑÐµÑ ÐºÐ»ÑÑ ÑÑÑоки, по коÑоÑÐ¾Ð¼Ñ Ð±ÑдÑÑ Ð¾ÑÑлеживаÑÑÑÑ Ð¿Ð¾ÑеÑÑннÑе ÑÑÑоки. СÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð¼Ñ_ÑÑолбÑа_помеÑки_Ñикла бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ в ÑпиÑок ÑезÑлÑÑиÑÑÑÑиÑ
ÑÑолбÑов запÑоÑа WITH. Ð ÑлÑÑае обнаÑÑÐ¶ÐµÐ½Ð¸Ñ Ñикла в ÑÑом ÑÑолбÑе окажеÑÑÑ Ð·Ð½Ð°Ñение_помеÑки_Ñикла, а инаÑе â помеÑка_Ñикла_по_ÑмолÑаниÑ. Ðолее Ñого, в ÑлÑÑае обнаÑÑÐ¶ÐµÐ½Ð¸Ñ Ñикла обÑабоÑка ÑекÑÑÑивного обÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑÑановлена. ÐадаваемÑе знаÑение_помеÑки_Ñикла и помеÑка_Ñикла_по_ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÐºÐ¾Ð½ÑÑанÑами и Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиводиÑÑÑÑ Ðº обÑÐµÐ¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
, а Ð´Ð»Ñ ÑÑого Ñипа должен бÑÑÑ Ð¾Ð¿ÑеделÑн опеÑаÑÐ¾Ñ Ð½ÐµÑавенÑÑва. (СÑандаÑÑ SQL ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ бÑли бÑлевÑми конÑÑанÑами или ÑимволÑнÑми ÑÑÑоками, но в PostgreSQL ÑÑо необÑзаÑелÑно.) Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваÑÑÑÑ ÑооÑвеÑÑÑвенно конÑÑанÑÑ TRUE и FALSE (Ñипа boolean). ÐÑоме Ñого, в ÑпиÑок ÑезÑлÑÑиÑÑÑÑиÑ
ÑÑолбÑов запÑоÑа WITH бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð¼Ñ_ÑÑолбÑа_пÑÑи_Ñикла. ÐÑÐ¾Ñ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð¼ÐµÐµÑ Ð²Ð½ÑÑÑеннее пÑедназнаÑение, в нÑм оÑÑлеживаÑÑÑÑ Ð¿Ð¾ÑеÑÑннÑе ÑÑÑоки. Ðа пÑимеÑами обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 7.8.2.2.
ÐÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ SEARCH и CYCLE ÑабоÑаÑÑ ÑолÑко Ñ ÑекÑÑÑивнÑми запÑоÑами WITH. ÐÑи ÑÑом запÑоÑ_WITH должен бÑÑÑ Ð¾Ð±Ñединением (UNION или UNION ALL) двÑÑ
SELECT (или ÑавнознаÑнÑÑ
команд) без вложеннÑÑ
UNION. Ð ÑлÑÑае пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±Ð¾Ð¸Ñ
пÑедложений ÑÑолбеÑ, добавлÑемÑй пÑедложением SEARCH, ÑазмеÑаеÑÑÑ Ð¿ÐµÑед ÑÑолбÑами, добавлÑемÑми пÑедложением CYCLE.
ÐÑновной запÑÐ¾Ñ Ð¸ вÑе запÑоÑÑ WITH, ÑÑловно говоÑÑ, вÑполнÑÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно. ÐÑо знаÑиÑ, ÑÑо дейÑÑвие опеÑаÑоÑа, изменÑÑÑего даннÑе в WITH, не бÑдÑÑ Ð²Ð¸Ð´ÐµÑÑ Ð´ÑÑгие ÑаÑÑи запÑоÑа, кÑоме как пÑоÑиÑав его вÑвод RETURNING. ÐÑли два ÑакиÑ
опеÑаÑоÑа попÑÑаÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¾Ð´Ð½Ñ ÑÑÑокÑ, ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð½ÐµÐ¾Ð¿ÑеделÑннÑм.
ÐлÑÑевое ÑвойÑÑво запÑоÑов WITH ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо они обÑÑно вÑÑиÑлÑÑÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз Ð´Ð»Ñ Ð²Ñего оÑновного запÑоÑа, даже еÑли в оÑновном запÑоÑе ÑодеÑжаÑÑÑ Ð½ÐµÑколÑко ÑÑÑлок на ниÑ
. Ð ÑаÑÑноÑÑи, гаÑанÑиÑÑеÑÑÑ, ÑÑо опеÑаÑоÑÑ, изменÑÑÑие даннÑе, бÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ñовно один Ñаз, вне завиÑимоÑÑи Ð¾Ñ Ñого, бÑÐ´ÐµÑ Ð»Ð¸ иÑ
ÑезÑлÑÑÐ°Ñ Ð¿ÑоÑиÑан оÑновнÑм запÑоÑом и в каком обÑÑме.
Ðднако Ð¾Ñ ÑÑой гаÑанÑии можно оÑказаÑÑÑÑ, добавив Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа WITH помеÑÐºÑ NOT MATERIALIZED. Ð ÑÑом ÑлÑÑае запÑÐ¾Ñ WITH Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑвÑÑнÑÑ Ð² оÑновной запÑоÑ, как еÑли Ð±Ñ ÑÑо бÑл пÑоÑÑой SELECT внÑÑÑи пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FROM оÑновного запÑоÑа. Ð ÑезÑлÑÑаÑе запÑÐ¾Ñ WITH Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑиÑлÑÑÑÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑаÑно, еÑли оÑновной запÑÐ¾Ñ Ð¾Ð±ÑаÑаеÑÑÑ Ðº Ð½ÐµÐ¼Ñ Ð½ÐµÑколÑко Ñаз. Ðо еÑли пÑи каждом Ñаком обÑаÑении ÑÑебÑÑÑÑÑ Ð»Ð¸ÑÑ Ð¾ÑделÑнÑе ÑÑÑоки из вÑего ÑезÑлÑÑаÑа запÑоÑа WITH, Ñказание NOT MATERIALIZED, позволÑÑÑее опÑимизиÑоваÑÑ Ð·Ð°Ð¿ÑоÑÑ ÑовмеÑÑно, в Ñелом Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð²ÑгоднÑм. Указание NOT MATERIALIZED игноÑиÑÑеÑÑÑ Ð² запÑоÑе WITH, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ ÑекÑÑÑивнÑй Ñ
аÑакÑÐµÑ Ð¸Ð»Ð¸ не Ñвободен Ð¾Ñ Ð¿Ð¾Ð±Ð¾ÑнÑÑ
ÑÑÑекÑов (Ñо еÑÑÑ ÐºÐ¾Ð³Ð´Ð° ÑÑо не пÑоÑÑой SELECT без изменÑивÑÑ
ÑÑнкÑий).
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑÐ¾Ñ WITH, ÑвободнÑй Ð¾Ñ Ð¿Ð¾Ð±Ð¾ÑнÑÑ
ÑÑÑекÑов, завоÑаÑиваеÑÑÑ Ð² оÑновной запÑоÑ, еÑли он иÑполÑзÑеÑÑÑ Ð² его пÑедложении FROM Ñовно один Ñаз. ÐÑо позволÑÐµÑ ÑовмеÑÑно опÑимизиÑоваÑÑ Ð´Ð²Ð° ÑÑÐ¾Ð²Ð½Ñ Ð·Ð°Ð¿ÑоÑов в ÑиÑÑаÑиÑÑ
, когда ÑеманÑика запÑоÑа в Ñелом ÑоÑ
ÑанÑеÑÑÑ. Ðо ÑÑо завоÑаÑивание можно пÑедоÑвÑаÑиÑÑ, помеÑив запÑÐ¾Ñ WITH как MATERIALIZED. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, напÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð³Ð´Ð° пÑедложение WITH пÑименÑеÑÑÑ ÐºÐ°Ðº пÑегÑада Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑоÑа, не позволÑÑÑÐ°Ñ ÐµÐ¼Ñ Ð²ÑбÑаÑÑ Ð½ÐµÑдаÑнÑй план. Ð Postgres Pro до веÑÑии 12 Ñакое завоÑаÑивание не вÑполнÑлоÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð°, поÑÑÐ¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ, напиÑаннÑе Ð´Ð»Ñ Ð¿ÑедÑдÑÑиÑ
веÑÑий, могли полагаÑÑÑÑ Ð½Ð° Ñо, ÑÑо опÑимизаÑии бÑÐ´ÐµÑ Ð¿ÑепÑÑÑÑвоваÑÑ ÑобÑÑвенно пÑедложение WITH.
Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 7.8.
ÐÑедложение FROM
РпÑедложении FROM пеÑеÑиÑлÑÑÑÑÑ Ð¾Ð´Ð½Ð° или неÑколÑко ÑаблиÑ, ÑлÑжаÑиÑ
иÑÑоÑниками даннÑÑ
Ð´Ð»Ñ SELECT. ÐÑли Ñказано неÑколÑко иÑÑоÑников, ÑезÑлÑÑаÑом бÑÐ´ÐµÑ Ð´ÐµÐºÐ°ÑÑово пÑоизведение (пеÑекÑÑÑÑное Ñоединение) вÑеÑ
иÑ
ÑÑÑок. Ðо обÑÑно в запÑÐ¾Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ ÑÑоÑнÑÑÑие ÑÑÐ»Ð¾Ð²Ð¸Ñ (в пÑедложении WHERE), коÑоÑÑе огÑаниÑиваÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑок неболÑÑим подмножеÑÑвом ÑÑого пÑоизведениÑ.
ÐÑедложение FROM Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑледÑÑÑие ÑлеменÑÑ:
имÑ_ÑаблиÑÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) ÑÑÑеÑÑвÑÑÑей ÑаблиÑÑ Ð¸Ð»Ð¸ пÑедÑÑавлениÑ. ÐÑли пеÑед именем ÑаблиÑÑ Ñказано
ONLY, ÑÑиÑÑваеÑÑÑ ÑолÑко Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ ÑаблиÑа. ÐезONLYÑÑиÑÑваеÑÑÑ Ð¸ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ ÑаблиÑа, и вÑе ÐµÑ Ð¿Ð¾Ñомки (еÑли ÑаковÑе еÑÑÑ). ÐоÑле имени ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñакже добавиÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑное Ñказание*, ÑÑÐ¾Ð±Ñ Ñвно обознаÑиÑÑ, ÑÑо блокиÑовка заÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð¸ вÑе доÑеÑние ÑаблиÑÑ.пÑевдонимÐлÑÑеÑнаÑивное Ð¸Ð¼Ñ Ð´Ð»Ñ ÑлеменÑа ÑпиÑка
FROM. ÐÑÐ¾Ñ Ð¿Ñевдоним иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÐºÑаÑкоÑÑи или Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑи Ñ Ð·Ð°Ð¼ÐºÐ½ÑÑÑми ÑоединениÑми (когда одна ÑаблиÑа ÑиÑаеÑÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑаÑно). Ðогда задаÑÑÑÑ Ð¿Ñевдоним, он полноÑÑÑÑ ÑкÑÑÐ²Ð°ÐµÑ Ð½Ð°ÑÑоÑÑее Ð¸Ð¼Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ ÑÑнкÑии; напÑимеÑ, пÑи запиÑиFROM foo AS f, в пÑодолжении запÑоÑаSELECTк ÑÑÐ¾Ð¼Ñ ÑлеменÑÑFROMнÑжно обÑаÑаÑÑÑÑ Ð¿Ð¾ имениf, а неfoo. ÐÑли задан пÑевдоним ÑаблиÑÑ, за ним можно Ñакже напиÑаÑÑ ÑпиÑок пÑевдонимов ÑÑолбÑов, коÑоÑÑй опÑÐµÐ´ÐµÐ»Ð¸Ñ Ð°Ð»ÑÑеÑнаÑивнÑе имена Ð´Ð»Ñ ÑÑолбÑов ÑаблиÑÑ.TABLESAMPLEмеÑод_вÑбоÑки(аÑгÑменÑ[, ...] ) [ REPEATABLE (заÑÑавка) ]ÐÑедложение
TABLESAMPLE, ÑопÑовождаÑÑееимÑ_ÑаблиÑÑ, показÑваеÑ, ÑÑо Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑва ÑÑÑок в ÑÑой ÑаблиÑе должен пÑименÑÑÑÑÑ ÑказаннÑймеÑод_вÑбоÑки. ÐÑа вÑбоÑка пÑедÑеÑÑвÑÐµÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð»ÑбÑÑ Ð´ÑÑÐ³Ð¸Ñ ÑилÑÑÑов, напÑимеÑ, в пÑедложенииWHERE. Ð ÑÑандаÑÑнÑй диÑÑÑибÑÑив Postgres Pro вклÑÑÐµÐ½Ñ Ð´Ð²Ð° меÑода вÑбоÑки,BERNOULLIиSYSTEM; дÑÑгие меÑÐ¾Ð´Ñ Ð²ÑбоÑки можно ÑÑÑановиÑÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ÑеÑез ÑаÑÑиÑениÑ.ÐеÑÐ¾Ð´Ñ Ð²ÑбоÑки
BERNOULLIиSYSTEMпÑинимаÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑйаÑгÑменÑ, опÑеделÑÑÑий, какой пÑоÑÐµÐ½Ñ ÑаблиÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ попаÑÑÑ Ð² вÑбоÑкÑ, Ð¾Ñ 0 до 100. ÐÑÐ¾Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð»ÑбÑм вÑÑажением Ñо знаÑением Ñипаreal. (ÐÑÑгие меÑÐ¾Ð´Ñ Ð²ÑбоÑки могÑÑ Ð¿ÑинимаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе или дÑÑгие паÑамеÑÑÑ.) Ðба ÑÑÐ¸Ñ Ð¼ÐµÑода возвÑаÑаÑÑ ÑлÑÑайнÑÑ Ð²ÑбоÑÐºÑ ÑаблиÑÑ, ÑодеÑжаÑÑÑ Ð¿ÑимеÑно ÑказаннÑй пÑоÑÐµÐ½Ñ ÑÑÑок ÑаблиÑÑ. ÐеÑодBERNOULLIÑканиÑÑÐµÑ Ð²ÑÑ ÑаблиÑÑ Ð¸ вÑбиÑÐ°ÐµÑ Ð¸Ð»Ð¸ игноÑиÑÑÐµÑ Ð¾ÑделÑнÑе ÑÑÑоки незавиÑимо, Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ веÑоÑÑноÑÑÑÑ. ÐеÑодSYSTEMÑÑÑÐ¾Ð¸Ñ Ð²ÑбоÑÐºÑ Ð½Ð° ÑÑовне блоков, опÑеделÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ блока ÑÐ°Ð½Ñ ÐµÐ³Ð¾ задейÑÑвоваÑÑ, и возвÑаÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки из каждого задейÑÑвÑемого блока. ÐеÑодSYSTEMÑабоÑÐ°ÐµÑ Ð·Ð½Ð°ÑиÑелÑно бÑÑÑÑееBERNOULLI, когда вÑбиÑаеÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑой пÑоÑÐµÐ½Ñ ÑÑÑок, но он Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð¼ÐµÐ½ÐµÐµ ÑлÑÑайнÑÑ Ð²ÑбоÑÐºÑ ÑаблиÑÑ Ð¸Ð·-за ÑÑÑекÑов кÑÑноÑÑи.РнеобÑзаÑелÑном пÑедложении
REPEATABLEзадаÑÑÑÑзаÑÑавкаâ ÑиÑло или вÑÑажение, задаÑÑее оÑпÑавное знаÑение Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑоÑа ÑлÑÑайнÑÑ ÑиÑел в меÑоде вÑбоÑки. ÐнаÑением заÑÑавки Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбое оÑлиÑное Ð¾Ñ NULL ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой. Ðва запÑоÑа, в коÑоÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð·Ð°ÑÑавки иаÑгÑменÑа, вÑдадÑÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ вÑбоÑÐºÑ ÑаблиÑÑ Ð¿Ñи ÑÑловии неизменноÑÑи ÑодеÑжимого ÑаблиÑÑ. Ðо Ñ ÑазнÑми знаÑениÑми заÑÑавки вÑбоÑки обÑÑно полÑÑаÑÑÑÑ ÑазнÑми. РоÑÑÑÑÑÑвие пÑедложениÑREPEATABLEÐ´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запÑоÑа вÑдаÑÑÑÑ Ð½Ð¾Ð²Ð°Ñ ÑлÑÑÐ°Ð¹Ð½Ð°Ñ Ð²ÑбоÑка, в завиÑимоÑÑи Ð¾Ñ Ð·Ð°ÑÑавки, ÑгенеÑиÑованной ÑиÑÑемой. ÐамеÑÑÑе, ÑÑо некоÑоÑÑе дополниÑелÑнÑе меÑÐ¾Ð´Ñ Ð²ÑбоÑки не пÑинимаÑÑ Ð¿ÑедложениеREPEATABLEи вÑдаÑÑ ÑазнÑе вÑбоÑки пÑи каждом иÑполÑзовании.вÑбоÑкаÐÑедложение
FROMÐ¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñй запÑоÑSELECT. Ðожно ÑÑиÑаÑÑ, ÑÑо из его ÑезÑлÑÑаÑа ÑоздаÑÑÑÑ Ð²ÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑаблиÑа на вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ñновной командÑSELECT. ÐамеÑÑÑе, ÑÑо вложеннÑй запÑоÑSELECTдолжен заклÑÑаÑÑÑÑ Ð² Ñкобки и Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ должен задаваÑÑÑÑ Ð¿Ñевдоним. ÐдеÑÑ Ñакже можно иÑполÑзоваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑVALUES.имÑ_запÑоÑа_WITHÐа запÑоÑ
WITHможно ÑÑÑлаÑÑÑÑ Ð¿Ð¾ имени, как еÑли Ð±Ñ Ð¸Ð¼Ñ Ð·Ð°Ð¿ÑоÑа пÑедÑÑавлÑло Ð¸Ð¼Ñ ÑаблиÑÑ. (Ðа Ñамом деле запÑоÑWITHÑкÑÑÐ²Ð°ÐµÑ Ð»ÑбÑÑ ÑеалÑнÑÑ ÑаблиÑÑ Ñ Ñем же именем Ð´Ð»Ñ Ð¾Ñновного запÑоÑа. ÐÑли Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ обÑаÑиÑÑÑÑ Ðº одноимÑнной ÑеалÑной ÑаблиÑе, можно дополниÑÑ Ð¸Ð¼Ñ ÑÑой ÑаблиÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑ ÐµÐ¼Ñ.) ÐÐ»Ñ ÑÑого имени можно задаÑÑ Ð¿Ñевдоним, Ñак же, как и Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑаблиÑÑ.имÑ_ÑÑнкÑииРпÑедложении
FROMмогÑÑ ÑодеÑжаÑÑÑÑ Ð²ÑÐ·Ð¾Ð²Ñ ÑÑнкÑий. (ÐÑо оÑобенно полезно Ð´Ð»Ñ ÑÑнкÑий, возвÑаÑаÑÑÐ¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва, но в пÑинÑипе можно иÑполÑзоваÑÑ Ð»ÑбÑе ÑÑнкÑии.) Ðожно ÑÑиÑаÑÑ, ÑÑо Ð´Ð»Ñ ÑезÑлÑÑаÑа ÑÑнкÑии ÑоздаÑÑÑÑ Ð²ÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑаблиÑа на вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑекÑÑей командÑSELECT. ÐÑли ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ ÑоÑÑавного Ñипа (ÑÑо каÑаеÑÑÑ Ð¸ ÑÑнкÑий Ñ Ð½ÐµÑколÑкими аÑгÑменÑамиOUT), каждÑй аÑÑибÑÑ ÑезÑлÑÑаÑа помеÑаеÑÑÑ Ð² оÑделÑнÑй ÑÑÐ¾Ð»Ð±ÐµÑ ÑÑой неÑвной ÑаблиÑÑ.Ðогда вÑзов ÑÑнкÑии дополнÑеÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм пÑедложением
WITH ORDINALITY, к ÑÑолбÑам ÑезÑлÑÑаÑа ÑÑнкÑии добавлÑеÑÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ñипаbigint. Ð ÑÑом ÑÑолбÑе нÑмеÑÑÑÑÑÑ ÑÑÑоки набоÑа ÑезÑлÑÑаÑов ÑÑнкÑии, наÑÐ¸Ð½Ð°Ñ Ñ 1. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÐµÐ¼Ñ Ð¿ÑиÑваиваеÑÑÑ Ð¸Ð¼Ñordinality.ÐÑевдоним Ð´Ð»Ñ ÑÑнкÑии можно задаÑÑ Ñак же, как и Ð´Ð»Ñ ÑаблиÑÑ. ÐÑли ÑÑÐ¾Ñ Ð¿Ñевдоним задан, за ним можно Ñакже напиÑаÑÑ ÑпиÑок пÑевдонимов ÑÑолбÑов, коÑоÑÑй опÑÐµÐ´ÐµÐ»Ð¸Ñ Ð°Ð»ÑÑеÑнаÑивнÑе имена Ð´Ð»Ñ Ð°ÑÑибÑÑов ÑоÑÑавного Ñипа ÑезÑлÑÑаÑа ÑÑнкÑии, вклÑÑÐ°Ñ Ð¸Ð¼Ñ ÑÑолбÑа нÑмеÑаÑии (еÑли он пÑиÑÑÑÑÑвÑеÑ).
ÐеÑколÑко вÑзовов ÑÑнкÑий можно обÑединиÑÑ Ð² одном ÑлеменÑе пÑедложениÑ
FROM, заклÑÑив Ð¸Ñ Ð² конÑÑÑÑкÑиÑROWS FROM( ... ). ÐÑводом Ñакого ÑлеменÑа бÑÐ´ÐµÑ Ñоединение пеÑвÑÑ ÑÑÑок вÑÐµÑ ÑÑнкÑий, заÑем вÑоÑÑÑ ÑÑÑок и Ñ. д. ÐÑли одни ÑÑнкÑии вÑдаÑÑ Ð¼ÐµÐ½ÑÑе ÑÑÑок, Ñем дÑÑгие, недоÑÑаÑÑие даннÑе заменÑÑÑÑÑ Ð·Ð½Ð°ÑениÑми NULL, Ñак ÑÑо обÑее ÑиÑло возвÑаÑаемÑÑ ÑÑÑок вÑегда бÑÐ´ÐµÑ ÑавнÑÑÑÑÑ Ð¼Ð°ÐºÑималÑÐ½Ð¾Ð¼Ñ ÑиÑÐ»Ñ ÑÑÑок из возвÑаÑÑннÑÑ Ð²Ñеми ÑÑнкÑиÑми.ÐÑли ÑÑнкÑÐ¸Ñ Ð¾Ð¿Ñеделена как возвÑаÑаÑÑÐ°Ñ Ñип даннÑÑ
record, Ð´Ð»Ñ Ð½ÐµÑ Ð½Ñжно ÑказаÑÑ Ð¿Ñевдоним или клÑÑевое ÑловоAS, за коÑоÑÑм должен идÑи ÑпиÑок опÑеделений ÑÑолбÑов в ÑоÑме(. СпиÑок опÑеделений ÑÑолбÑов должен ÑооÑвеÑÑÑвоваÑÑ ÑакÑиÑеÑÐºÐ¾Ð¼Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑÐ²Ñ Ð¸ ÑÐ¸Ð¿Ñ ÑÑолбÑов, возвÑаÑаемÑÑ ÑÑнкÑией.имÑ_ÑÑолбÑаÑип_даннÑÑ[, ... ])ÐÑли пÑи иÑполÑзовании ÑинÑакÑиÑа
ROWS FROM( ... )одна из ÑÑнкÑий ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÑпиÑка опÑеделений ÑÑолбÑов, ÑÑÐ¾Ñ ÑпиÑок лÑÑÑе ÑазмеÑÑиÑÑ Ð¿Ð¾Ñле вÑзова ÑÑнкÑии внÑÑÑиROWS FROM( ... ). СпиÑок опÑеделений ÑÑолбÑов можно помеÑÑиÑÑ Ð¿Ð¾Ñле конÑÑÑÑкÑииROWS FROM( ... ), ÑолÑко еÑли вÑзÑваеÑÑÑ Ð²Ñего одна ÑÑнкÑиÑ, а пÑедложениеWITH ORDINALITYоÑÑÑÑÑÑвÑеÑ.ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ
ORDINALITYÑо ÑпиÑком опÑеделений ÑÑолбÑов, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пÑимениÑÑ Ð·Ð°Ð¿Ð¸ÑÑROWS FROM( ... )и помеÑÑиÑÑ ÑпиÑок Ñ Ð¾Ð¿ÑеделениÑми ÑÑолбÑов внÑÑÑÑROWS FROM( ... ).Ñип_ÑоединениÑÐдин из ÑледÑÑÑÐ¸Ñ Ð²Ð°ÑианÑов:
[ INNER ] JOINLEFT [ OUTER ] JOINRIGHT [ OUTER ] JOINFULL [ OUTER ] JOIN
ÐÐ»Ñ Ñипов Ñоединений
INNERиOUTERÐ½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑказаÑÑ ÑÑловие ÑоединениÑ, а именно одно из пÑедложенийON,ÑÑловие_ÑоединениÑUSING (, илиÑÑолбеÑ_ÑоединениÑ[, ...])NATURAL. ÐÑи пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð¿Ð¸ÑÑваÑÑÑÑ Ð½Ð¸Ð¶Ðµ.ÐÑедложение
JOINобÑединÑÐµÑ Ð´Ð²Ð° ÑлеменÑа ÑпиÑкаFROM, коÑоÑÑе Ð¼Ñ Ð´Ð»Ñ Ð¿ÑоÑÑоÑÑ Ð´Ð°Ð»ÑÑе бÑдем назÑваÑÑ Â«ÑаблиÑами», Ñ Ð¾ÑÑ Ð½Ð° Ñамом деле ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой обÑекÑ, допÑÑÑимÑй в каÑеÑÑве ÑлеменÑаFROM. ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑдка вложенноÑÑи пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ñкобки. РоÑÑÑÑÑÑвие Ñкобок пÑедложениÑJOINобÑабаÑÑваеÑÑÑ Ñлева напÑаво. РлÑбом ÑлÑÑаеJOINÑвÑзÑÐ²Ð°ÐµÑ ÑлеменÑÑ ÑилÑнее, Ñем запÑÑÑе, ÑазделÑÑÑие ÑлеменÑÑ Ð² ÑпиÑкеFROM. ÐÑе возможноÑÑиJOINÑÑÑеÑÑвÑÑÑ Ð¿ÑоÑÑо Ð´Ð»Ñ ÑдобÑÑва запиÑи, они не даÑÑ Ð½Ð¸Ñего Ñакого, Ñего нелÑÐ·Ñ Ð±Ñло Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ, пÑименÑÑ Ð¾Ð±ÑÑнÑе пÑедложениÑFROMиWHERE.LEFT OUTER JOINвозвÑаÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки огÑаниÑенного декаÑÑова пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ (Ñ. е. вÑе обÑединÑннÑе ÑÑÑоки, ÑдовлеÑвоÑÑÑÑие ÑÑÐ»Ð¾Ð²Ð¸Ñ ÑоединениÑ) плÑÑ Ð²Ñе ÑÑÑоки в ÑаблиÑе Ñлева, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð½Ðµ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ ÑÑÑок в ÑаблиÑе ÑпÑава, ÑдовлеÑвоÑÑÑÑÐ¸Ñ ÑÑловиÑ. СÑÑока, взÑÑÐ°Ñ Ð¸Ð· ÑаблиÑÑ Ñлева, дополнÑеÑÑÑ Ð´Ð¾ полной ÑиÑÐ¸Ð½Ñ Ð¾Ð±ÑединÑнной ÑаблиÑÑ Ð·Ð½Ð°ÑениÑми NULL в ÑÑолбÑÐ°Ñ ÑаблиÑÑ ÑпÑава. ÐамеÑÑÑе, ÑÑо Ð´Ð»Ñ Ð¾Ð¿ÑеделениÑ, какие ÑÑÑоки двÑÑ ÑÐ°Ð±Ð»Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑ Ð´ÑÑг дÑÑгÑ, пÑовеÑÑеÑÑÑ ÑолÑко ÑÑловие Ñамого пÑедложениÑJOIN. ÐнеÑние ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿ÑовеÑÑÑÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ.RIGHT OUTER JOIN, напÑоÑив, возвÑаÑÐ°ÐµÑ Ð²Ñе ÑоединÑннÑе ÑÑÑоки плÑÑ Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки ÑпÑава, не имеÑÑей ÑооÑвеÑÑÑÐ²Ð¸Ñ Ñлева (ÑÑа ÑÑÑока дополнÑеÑÑÑ Ð·Ð½Ð°ÑениÑми NULL влево). ÐÑо пÑедложение введено иÑклÑÑиÑелÑно Ð´Ð»Ñ ÑдобÑÑва запиÑи, Ñак как его можно легко ÑвеÑÑи кLEFT OUTER JOIN, поменÑв левÑÑ Ð¸ пÑавÑÑ ÑаблиÑÑ Ð¼ÐµÑÑами.FULL OUTER JOINвозвÑаÑÐ°ÐµÑ Ð²Ñе ÑоединÑннÑе ÑÑÑоки плÑÑ Ð²Ñе ÑÑÑоки Ñлева, не имеÑÑие ÑооÑвеÑÑÑÐ²Ð¸Ñ ÑпÑава, (дополненнÑе знаÑениÑми NULL впÑаво) плÑÑ Ð²Ñе ÑÑÑоки ÑпÑава, не имеÑÑие ÑооÑвеÑÑÑÐ²Ð¸Ñ Ñлева (дополненнÑе знаÑениÑми NULL влево).ONÑÑловие_ÑоединениÑÐадаваемое
ÑÑловие_ÑоединениÑпÑедÑÑавлÑÐµÑ Ñобой вÑÑажение, вÑдаÑÑее знаÑение Ñипаboolean(как в пÑедложенииWHERE), коÑоÑое опÑеделÑеÑ, какие ÑÑÑоки ÑÑиÑаÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑими пÑи Ñоединении.USING (ÑÑолбеÑ_ÑоединениÑ[, ...] ) [ ASпÑевдоним_иÑполÑзованиÑ_ÑоединениÑ]ÐÑедложение вида
USING ( a, b, ... )пÑедÑÑавлÑÐµÑ Ñобой ÑокÑаÑÑннÑÑ ÑоÑÐ¼Ñ Ð·Ð°Ð¿Ð¸ÑиON ÑаблиÑа_Ñлева.a = ÑаблиÑа_ÑпÑава.a AND ÑаблиÑа_Ñлева.b = ÑаблиÑа_ÑпÑава.b .... ÐÑоме Ñого,USINGподÑазÑмеваеÑ, ÑÑо в ÑезÑлÑÑÐ°Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÐºÐ»ÑÑÑн ÑолÑко один из паÑÑ ÑавнÑÑ ÑÑолбÑов, но не оба.ÐÑли задан
пÑевдоним_иÑполÑзованиÑ_ÑоединениÑ, он опÑеделÑÐµÑ Ð¿Ñевдоним ÑаблиÑÑ Ñо ÑÑолбÑами ÑоединениÑ. Ðо ÑÑÐ¾Ð¼Ñ Ð¸Ð¼ÐµÐ½Ð¸ можно бÑÐ´ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ ÑолÑко к ÑÑолбÑам ÑоединениÑ, пеÑеÑиÑленнÑм в пÑедложенииUSING. РоÑлиÑие Ð¾Ñ Ð¾Ð±ÑÑногопÑевдонима, он не ÑкÑÑÐ²Ð°ÐµÑ Ð¸Ð¼ÐµÐ½Ð° ÑоединÑемÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ð¾Ñ Ð¾ÑÑалÑного запÑоÑа. Также в оÑлиÑие оÑпÑевдонима, Ñ Ð½Ð¸Ð¼ нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ ÑпиÑок пÑевдонимов ÑÑолбÑов â вÑÑ Ð¾Ð´Ð½Ñми именами ÑÑолбÑов ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ñе же имена, ÑÑо ÑигÑÑиÑÑÑÑ Ð² ÑпиÑкеUSING.NATURALNATURALпÑедÑÑавлÑÐµÑ Ñобой кÑаÑкÑÑ Ð·Ð°Ð¿Ð¸ÑÑUSINGÑо ÑпиÑком, в коÑоÑом пеÑеÑиÑлÑÑÑÑÑ Ð²Ñе ÑÑолбÑÑ Ð´Ð²ÑÑ ÑаблиÑ, имеÑÑие одинаковÑе имена. ÐÑли одинаковÑÑ Ð¸Ð¼Ñн неÑ, ÑказаниеNATURALÑавнознаÑноON TRUE.CROSS JOINÐÑедложение
CROSS JOINÑавнознаÑноINNER JOIN ON (TRUE), Ñо еÑÑÑ Ñ Ð½Ð¸Ð¼ никакие ÑÑÑоки по ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ðµ ÑдалÑÑÑÑÑ. Ðба ÑÑи пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑоÑмиÑÑÑÑ Ð¿ÑоÑÑое декаÑÑово пÑоизведение â ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð¿Ð¾Ð»ÑÑиÑÑÑ, еÑли ÑказаÑÑ Ð´Ð²Ðµ ÑаблиÑÑ Ð½Ð° веÑÑ Ð½ÐµÐ¼ ÑÑовнеFROMи добавиÑÑ Ð² каÑеÑÑве огÑаниÑÐµÐ½Ð¸Ñ ÑÑловие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (еÑли оно еÑÑÑ).LATERALÐлÑÑевое Ñлово
LATERALÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑедваÑÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñй запÑоÑSELECTв ÑпиÑкеFROM. Ðно позволÑÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð² ÑÑом вложенномSELECTк ÑÑолбÑам ÑлеменÑовFROM, пÑедÑеÑÑвÑÑÑим ÐµÐ¼Ñ Ð² ÑпиÑкеFROM. (ÐезLATERALвÑе вложеннÑе подзапÑоÑÑSELECTобÑабаÑÑваÑÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо и не могÑÑ ÑÑÑлаÑÑÑÑ Ð½Ð° дÑÑгие ÑлеменÑÑ ÑпиÑкаFROM.)Слово
LATERALможно Ñакже добавиÑÑ Ð¿ÐµÑед вÑзовом ÑÑнкÑии в ÑпиÑкеFROM, но в ÑÑом ÑлÑÑае оно бÑÐ´ÐµÑ Ð¸Ð·Ð±ÑÑоÑнÑм, Ñак как вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑÑнкÑиÑми могÑÑ ÑÑÑлаÑÑÑÑ Ð½Ð° пÑедÑдÑÑие ÑлеменÑÑ ÑпиÑкаFROMв лÑбом ÑлÑÑае.ÐлеменÑ
LATERALÐ¼Ð¾Ð¶ÐµÑ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð½Ð° веÑÑ Ð½ÐµÐ¼ ÑÑовне ÑпиÑкаFROMили в деÑевеJOIN. РпоÑледнем ÑлÑÑае он Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑÑÑлаÑÑÑÑ Ð½Ð° лÑбÑе ÑлеменÑÑ Ð² левой ÑаÑÑиJOIN, ÑпÑава Ð¾Ñ ÐºÐ¾ÑоÑого он Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ.Ðогда ÑлеменÑ
FROMÑодеÑÐ¶Ð¸Ñ ÑÑÑлкиLATERAL, запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ ÑледÑÑÑим обÑазом: ÑнаÑала Ð´Ð»Ñ ÑÑÑоки ÑлеменÑаFROMÑ ÑелевÑми ÑÑолбÑами, или набоÑа ÑÑÑок из неÑколÑÐºÐ¸Ñ ÑлеменÑовFROM, ÑодеÑжаÑÐ¸Ñ ÑелевÑе ÑÑолбÑÑ, вÑÑиÑлÑеÑÑÑ ÑлеменÑLATERALÑо знаÑениÑми ÑÑÐ¸Ñ ÑÑолбÑов. ÐаÑем ÑезÑлÑÑиÑÑÑÑие ÑÑÑоки обÑÑнÑм обÑазом ÑоединÑÑÑÑÑ Ñо ÑÑÑоками, из коÑоÑÑÑ Ð¾Ð½Ð¸ бÑли вÑÑиÑленÑ. ÐÑа пÑоÑедÑÑа повÑоÑÑеÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ ÑÑÑок иÑÑ Ð¾Ð´Ð½ÑÑ ÑаблиÑ.ТаблиÑа, ÑлÑжаÑÐ°Ñ Ð¸ÑÑоÑником ÑÑолбÑов, должна бÑÑÑ ÑвÑзана Ñ ÑлеменÑом
LATERALÑоединениемINNERилиLEFT, в пÑоÑивном ÑлÑÑае не обÑазÑеÑÑÑ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñно опÑеделÑемÑй Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, из коÑоÑого можно бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð½Ð°Ð±Ð¾ÑÑ ÑÑÑок Ð´Ð»Ñ ÑлеменÑаLATERAL. Таким обÑазом, Ñ Ð¾ÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑиÑÑинÑакÑиÑеÑки пÑавилÑнаÑ,XRIGHT JOIN LATERALYYв ней не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ ÐºX.
ÐÑедложение WHERE
ÐеобÑзаÑелÑное пÑедложение WHERE Ð¸Ð¼ÐµÐµÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ
WHERE ÑÑловие
, где ÑÑловие â лÑбое вÑÑажение, вÑдаÑÑее ÑезÑлÑÑÐ°Ñ Ñипа boolean. ÐÑÐ±Ð°Ñ ÑÑÑока, не ÑдовлеÑвоÑÑÑÑÐ°Ñ ÑÑÐ¾Ð¼Ñ ÑÑловиÑ, иÑклÑÑаеÑÑÑ Ð¸Ð· ÑезÑлÑÑаÑа. СÑÑока ÑдовлеÑвоÑÑÐµÑ ÑÑловиÑ, еÑли оно возвÑаÑÐ°ÐµÑ true пÑи подÑÑановке вмеÑÑо ÑÑÑлок на пеÑеменнÑе ÑакÑиÑеÑкиÑ
знаÑений из ÑÑой ÑÑÑоки.
ÐÑедложение GROUP BY
ÐеобÑзаÑелÑное пÑедложение GROUP BY Ð¸Ð¼ÐµÐµÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ
GROUP BY [ ALL | DISTINCT ] ÑлеменÑ_гÑÑппиÑÐ¾Ð²Ð°Ð½Ð¸Ñ [, ...]
GROUP BY ÑобиÑÐ°ÐµÑ Ð² Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð²Ñе вÑбÑаннÑе ÑÑÑоки, вÑдаÑÑие одинаковÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÑÑажений гÑÑппиÑовки. РкаÑеÑÑве вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð½ÑÑÑи ÑлеменÑа_гÑÑппиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑÑÑпаÑÑ Ð¸Ð¼Ñ Ð²Ñ
одного ÑÑолбÑа, либо Ð¸Ð¼Ñ Ð¸Ð»Ð¸ поÑÑдковÑй Ð½Ð¾Ð¼ÐµÑ Ð²ÑÑ
одного ÑÑолбÑа (из ÑпиÑка ÑлеменÑов SELECT), либо пÑоизволÑное знаÑение, вÑÑиÑлÑемое по знаÑениÑм вÑ
однÑÑ
ÑÑолбÑов. Ð ÑлÑÑае неоднознаÑноÑÑи Ð¸Ð¼Ñ Ð² GROUP BY бÑÐ´ÐµÑ Ð²Ð¾ÑпÑинимаÑÑÑÑ ÐºÐ°Ðº Ð¸Ð¼Ñ Ð²Ñ
одного, а не вÑÑ
одного ÑÑолбÑа.
ÐÑли в ÑлеменÑе гÑÑппиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ GROUPING SETS, ROLLUP или CUBE, пÑедложение GROUP BY в Ñелом опÑеделÑÐµÑ Ð½ÐµÐºÐ¾ÑоÑое ÑиÑло незавиÑимÑÑ
набоÑов гÑÑппиÑованиÑ. ÐÑо даÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑÑÑекÑ, ÑÑо и обÑединение подзапÑоÑов (Ñ UNION ALL) Ñ Ð¾ÑделÑнÑми набоÑами гÑÑппиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² иÑ
пÑедложениÑÑ
GROUP BY. ÐеобÑзаÑелÑное пÑедложение DISTINCT иÑклÑÑÐ°ÐµÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ Ð½Ð°Ð±Ð¾ÑÑ Ð¿ÐµÑед обÑабоÑкой, но оно не пÑеобÑазÑÐµÑ UNION ALL в UNION DISTINCT. ÐодÑобнее иÑполÑзование набоÑов гÑÑппиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ Ð² ÐодÑазделе 7.2.4.
ÐгÑегаÑнÑе ÑÑнкÑии, еÑли они иÑполÑзÑÑÑÑÑ, вÑÑиÑлÑÑÑÑÑ Ð¿Ð¾ вÑем ÑÑÑокам, ÑоÑÑавлÑÑÑим каждÑÑ Ð³ÑÑппÑ, и в иÑоге вÑдаÑÑ Ð¾ÑделÑное знаÑение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ гÑÑппÑ. (ÐÑли агÑегаÑнÑе ÑÑнкÑии иÑполÑзÑÑÑÑÑ Ð±ÐµÐ· пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ GROUP BY, запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ ÐºÐ°Ðº Ñ Ð¾Ð´Ð½Ð¾Ð¹ гÑÑппой, вклÑÑаÑÑей вÑе вÑбÑаннÑе ÑÑÑоки.) ÐÐ°Ð±Ð¾Ñ ÑÑÑок, поÑÑÑпаÑÑиÑ
в каждÑÑ Ð°Ð³ÑегаÑнÑÑ ÑÑнкÑиÑ, можно дополниÑелÑно оÑÑилÑÑÑоваÑÑ, добавив пÑедложение FILTER к вÑÐ·Ð¾Ð²Ñ Ð°Ð³ÑегаÑной ÑÑнкÑии; за дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 4.2.7. С пÑедложением FILTER на вÑ
од агÑегаÑной ÑÑнкÑии поÑÑÑпаÑÑ ÑолÑко Ñе ÑÑÑоки, коÑоÑÑе ÑооÑвеÑÑÑвÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑилÑÑÑÑ.
Ðогда в запÑоÑе пÑиÑÑÑÑÑвÑÐµÑ Ð¿Ñедложение GROUP BY или какаÑ-либо агÑегаÑÐ½Ð°Ñ ÑÑнкÑиÑ, вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² ÑпиÑке SELECT не могÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº негÑÑппиÑÑемÑм ÑÑолбÑам, кÑоме как в агÑегаÑнÑÑ
ÑÑнкÑиÑÑ
или в ÑлÑÑае ÑÑнкÑионалÑной завиÑимоÑÑи, Ñак как инаÑе в негÑÑппиÑÑемом ÑÑолбÑе нÑжно бÑло Ð±Ñ Ð²ÐµÑнÑÑÑ Ð±Ð¾Ð»ÐµÐµ одного возможного знаÑениÑ. ФÑнкÑионалÑÐ½Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑ Ð¾Ð±ÑазÑеÑÑÑ, еÑли гÑÑппиÑÑемÑе ÑÑолбÑÑ (или иÑ
подмножеÑÑво) ÑоÑÑавлÑÑÑ Ð¿ÐµÑвиÑнÑй клÑÑ ÑаблиÑÑ, ÑодеÑжаÑей негÑÑппиÑÑемÑй ÑÑолбеÑ.
ÐмейÑе в видÑ, ÑÑо вÑе агÑегаÑнÑе ÑÑнкÑии вÑÑиÑлÑÑÑÑÑ Ð¿ÐµÑед «ÑкалÑÑнÑми» вÑÑажениÑми в пÑедложении HAVING или ÑпиÑке SELECT. ÐÑо знаÑиÑ, ÑÑо напÑимеÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ CASE нелÑÐ·Ñ Ð¾Ð±Ð¾Ð¹Ñи вÑÑиÑление агÑегаÑной ÑÑнкÑии; Ñм. ÐодÑаздел 4.2.14.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð²Ð¼ÐµÑÑе Ñ GROUP BY.
ÐÑедложение HAVING
ÐеобÑзаÑелÑное пÑедложение HAVING Ð¸Ð¼ÐµÐµÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ
HAVING ÑÑловие
ÐдеÑÑ ÑÑловие задаÑÑÑÑ Ñак же, как и Ð´Ð»Ñ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE.
HAVING иÑклÑÑÐ°ÐµÑ Ð¸Ð· ÑезÑлÑÑаÑа ÑÑÑоки гÑÑпп, не ÑдовлеÑвоÑÑÑÑиÑ
ÑÑловиÑ. HAVING оÑлиÑаеÑÑÑ Ð¾Ñ WHERE: WHERE ÑилÑÑÑÑÐµÑ Ð¾ÑделÑнÑе ÑÑÑоки до пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ GROUP BY, а HAVING ÑилÑÑÑÑÐµÑ ÑÑÑоки гÑÑпп, ÑозданнÑÑ
пÑедложением GROUP BY. ÐаждÑй ÑÑолбеÑ, ÑигÑÑиÑÑÑÑий в ÑÑловии, должен однознаÑно ÑÑÑлаÑÑÑÑ Ð½Ð° гÑÑппиÑÑемÑй ÑÑолбеÑ, за иÑклÑÑением ÑлÑÑаев, когда ÑÑа ÑÑÑлка наÑ
одиÑÑÑ Ð²Ð½ÑÑÑи агÑегаÑной ÑÑнкÑии или негÑÑппиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ ÑÑнкÑионалÑно завиÑÐ¸Ñ Ð¾Ñ Ð³ÑÑппиÑÑемÑÑ
.
РпÑиÑÑÑÑÑвие HAVING запÑÐ¾Ñ Ð¿ÑевÑаÑаеÑÑÑ Ð² гÑÑппиÑÑемÑй, даже еÑли GROUP BY оÑÑÑÑÑÑвÑеÑ. То же Ñамое пÑоиÑÑ
одиÑ, когда запÑÐ¾Ñ ÑодеÑÐ¶Ð¸Ñ Ð°Ð³ÑегаÑнÑе ÑÑнкÑии, но не пÑедложение GROUP BY. ÐÑе вÑбÑаннÑе ÑÑÑоки ÑÑиÑаÑÑÑÑ ÑоÑмиÑÑÑÑими Ð¾Ð´Ð½Ñ Ð³ÑÑппÑ, а в ÑпиÑке SELECT и пÑедложении HAVING можно обÑаÑаÑÑÑÑ Ðº ÑÑолбÑам ÑаблиÑÑ ÑолÑко из агÑегаÑнÑÑ
ÑÑнкÑий. Такой запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð²ÑдаваÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑÑ ÑÑÑокÑ, еÑли ÑезÑлÑÑÐ°Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ HAVING â true, и Ð½Ð¾Ð»Ñ ÑÑÑок в пÑоÑивном ÑлÑÑае.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð²Ð¼ÐµÑÑе Ñ HAVING.
ÐÑедложение WINDOW
ÐеобÑзаÑелÑное пÑедложение WINDOW Ð¸Ð¼ÐµÐµÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ
WINDOWимÑ_окнаAS (опÑеделение_окна) [, ...]
ÐдеÑÑ Ð¸Ð¼Ñ_окна â ÑÑо имÑ, на коÑоÑое можно ÑÑÑлаÑÑÑÑ Ð¸Ð· пÑедложений OVER или поÑледÑÑÑиÑ
опÑеделений окон, а опÑеделение_окна Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑий вид:
[имÑ_ÑÑÑеÑÑвÑÑÑего_окна] [ PARTITION BYвÑÑажение[, ...] ] [ ORDER BYвÑÑажение[ ASC | DESC | USINGопеÑаÑоÑ] [ NULLS { FIRST | LAST } ] [, ...] ] [пÑедложение_Ñамки]
ÐÑли Ñказано имÑ_ÑÑÑеÑÑвÑÑÑего_окна, оно должно ÑÑÑлаÑÑÑÑ Ð½Ð° пÑедÑеÑÑвÑÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² ÑпиÑке WINDOW; новое окно копиÑÑÐµÑ Ð¿Ñедложение ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· ÑÑой запиÑи, а Ñакже пÑедложение ÑоÑÑиÑовки, еÑли оно пÑиÑÑÑÑÑвÑеÑ. Ð ÑÑом ÑлÑÑае Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ окна нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ ÑобÑÑвенное пÑедложение PARTITION BY, а ORDER BY можно ÑказаÑÑ, ÑолÑко еÑли его не бÑло Ñ ÐºÐ¾Ð¿Ð¸ÑÑемого окна. Ðовое окно вÑегда иÑполÑзÑÐµÑ ÑобÑÑвенное пÑедложение Ñамки; в копиÑÑемом окне оно задаваÑÑÑÑ Ð½Ðµ должно.
ÐлеменÑÑ ÑпиÑка PARTITION BY инÑеÑпÑеÑиÑÑеÑÑÑ Ð²Ð¾ многом Ñак же, как и ÑлеменÑÑ ÑпиÑка GROUP BY, за иÑклÑÑением Ñого, ÑÑо ÑÑо вÑегда пÑоÑÑÑе вÑÑажениÑ, но не Ð¸Ð¼Ñ Ð¸Ð»Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð²ÑÑ
одного ÑÑолбÑа. ÐÑÑгое ÑазлиÑие ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо ÑÑи вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ Ð²ÑÐ·Ð¾Ð²Ñ Ð°Ð³ÑегаÑнÑÑ
ÑÑнкÑий, коÑоÑÑе не допÑÑкаÑÑÑÑ Ð² обÑÑном пÑедложении GROUP BY. ÐдеÑÑ Ð¾Ð½Ð¸ допÑÑкаÑÑÑÑ Ð¿Ð¾ÑомÑ, ÑÑо ÑоÑмиÑование окна пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ñле гÑÑппиÑовки и агÑегиÑованиÑ.
ÐодобнÑм обÑазом, ÑлеменÑÑ ÑпиÑка ORDER BY инÑеÑпÑеÑиÑÑÑÑÑÑ Ð²Ð¾ многом Ñак же, как и ÑлеменÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ORDER BY на ÑÑовне опеÑаÑоÑа, за иÑклÑÑением Ñого, ÑÑо они вÑегда воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº пÑоÑÑÑе вÑÑажениÑ, но не как Ð¸Ð¼Ñ Ð¸Ð»Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð²ÑÑ
одного ÑÑолбÑа.
ÐеобÑзаÑелÑное пÑедложение_Ñамки опÑеделÑÐµÑ ÑÐ°Ð¼ÐºÑ Ð¾ÐºÐ½Ð° Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½Ð½ÑÑ
ÑÑнкÑий, коÑоÑÑе завиÑÑÑ Ð¾Ñ Ñамки (не вÑе ÑÑнкÑии ÑаковÑ). Рамка окна â ÑÑо Ð½Ð°Ð±Ð¾Ñ ÑвÑзаннÑÑ
ÑÑÑок Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки запÑоÑа (назÑваемой ÑекÑÑей ÑÑÑокой). РкаÑеÑÑве пÑедложениÑ_Ñамки Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ
{ RANGE | ROWS | GROUPS } наÑало_Ñамки [ иÑклÑÑение_Ñамки ]
{ RANGE | ROWS | GROUPS } BETWEEN наÑало_Ñамки AND конеÑ_Ñамки [ иÑклÑÑение_Ñамки ]
ÐдеÑÑ Ð½Ð°Ñало_Ñамки и конеÑ_Ñамки Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ ÐºÐ°Ðº
UNBOUNDED PRECEDINGÑмеÑениеPRECEDING CURRENT ROWÑмеÑениеFOLLOWING UNBOUNDED FOLLOWING
и иÑклÑÑение_Ñамки Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñаким:
EXCLUDE CURRENT ROW EXCLUDE GROUP EXCLUDE TIES EXCLUDE NO OTHERS
ÐÑли конеÑ_Ñамки опÑÑен, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ CURRENT ROW. РкаÑеÑÑве наÑала_Ñамки нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ UNBOUNDED FOLLOWING, в каÑеÑÑве конÑа_Ñамки не допÑÑкаеÑÑÑ UNBOUNDED PRECEDING, и конеÑ_Ñамки не Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð´Ñи в показанном вÑÑе ÑпиÑке Ñказаний наÑало_Ñамки AND конеÑ_Ñамки пеÑед наÑалом_Ñамки â напÑимеÑ, ÑинÑакÑÐ¸Ñ RANGE BETWEEN CURRENT ROW AND не допÑÑкаеÑÑÑ.ÑмеÑение PRECEDING
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ñамка обÑазÑеÑÑÑ Ð¿Ñедложением RANGE UNBOUNDED PRECEDING, ÑÑо по ÑÑÑи Ñо же, ÑÑо RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; оно ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑÐ°Ð¼ÐºÑ Ñак, ÑÑо она вклÑÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки Ð¾Ñ Ð½Ð°Ñала Ñаздела до поÑледней ÑÑÑоки, ÑодÑÑвенной ÑекÑÑей (ÑÑÑоки, коÑоÑÑе ÑоглаÑно ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð´Ð»Ñ Ð¾ÐºÐ½Ð° пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ORDER BY ÑÑиÑаÑÑÑÑ ÑавнÑми ÑекÑÑей; еÑли ORDER BY оÑÑÑÑÑÑвÑеÑ, вÑе ÑÑÑоки ÑÑиÑаÑÑÑÑ ÑодÑÑвеннÑми). ÐообÑе UNBOUNDED PRECEDING ознаÑаеÑ, ÑÑо Ñамка наÑинаеÑÑÑ Ñ Ð¿ÐµÑвой ÑÑÑоки Ñаздела, а UNBOUNDED FOLLOWING ознаÑаеÑ, ÑÑо Ñамка заканÑиваеÑÑÑ Ð½Ð° поÑледней ÑÑÑоке Ñаздела, незавиÑимо Ð¾Ñ Ñежима RANGE, ROWS или GROUPS. Ð Ñежиме ROWS Ñказание CURRENT ROW ознаÑаеÑ, ÑÑо Ñамка наÑинаеÑÑÑ Ð¸Ð»Ð¸ заканÑиваеÑÑÑ ÑекÑÑей ÑÑÑокой; но в Ñежиме RANGE или GROUPS оно ознаÑаеÑ, ÑÑо Ñамка наÑинаеÑÑÑ Ð¸Ð»Ð¸ заканÑиваеÑÑÑ Ð¿ÐµÑвой или поÑледней ÑÑÑокой, ÑодÑÑвенной ÑекÑÑей, ÑоглаÑно поÑÑÐ´ÐºÑ ORDER BY. ÐаÑианÑÑ ÑмеÑение PRECEDING и ÑмеÑение FOLLOWING ознаÑаÑÑ Ñазное в завиÑимоÑÑи Ð¾Ñ Ñежима Ñамки. Ð Ñежиме ROWS ÑелоÑиÑленное ÑмеÑение опÑеделÑÐµÑ Ñдвиг, Ñ ÐºÐ¾ÑоÑÑм наÑало Ñамки позиÑиониÑÑеÑÑÑ Ð¿ÐµÑед ÑекÑÑей ÑÑÑокой, а ÐºÐ¾Ð½ÐµÑ Ñамки â поÑле ÑекÑÑей ÑÑÑоки. Ð Ñежиме GROUPS ÑелоÑиÑленное ÑмеÑение аналогиÑнÑм обÑазом опÑеделÑÐµÑ Ñдвиг оÑноÑиÑелÑно гÑÑÐ¿Ð¿Ñ ÑÑÑок, ÑодÑÑвеннÑÑ
ÑекÑÑей, где гÑÑппа ÑодÑÑвеннÑÑ
ÑÑÑок â гÑÑппа ÑÑÑок, ÑÑиÑаÑÑиÑ
ÑÑ ÑавнÑми ÑоглаÑно пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ORDER BY Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ окна. Ð Ñежиме RANGE Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑмеÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ
одимо пÑиÑÑÑÑÑвие в опÑеделении окна Ñовно одного ÑÑолбÑа ORDER BY. Тогда Ñамка бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ñе ÑÑÑоки, в коÑоÑÑÑ
знаÑение ÑпоÑÑдоÑиваÑÑего ÑÑолбÑа не более Ñем на ÑмеÑение менÑÑе (Ð´Ð»Ñ PRECEDING) или болÑÑе (Ð´Ð»Ñ FOLLOWING) знаÑÐµÐ½Ð¸Ñ ÑпоÑÑдоÑиваÑÑего ÑÑолбÑа в ÑекÑÑей ÑÑÑоке. Ð ÑÑом ÑлÑÑае Ñип даннÑÑ
вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑмеÑение завиÑÐ¸Ñ Ð¾Ñ Ñипа даннÑÑ
ÑпоÑÑдоÑиваÑÑего ÑÑолбÑа. ÐÐ»Ñ ÑиÑловÑÑ
ÑÑолбÑов ÑÑо обÑÑно ÑÐ¾Ñ Ð¶Ðµ ÑиÑловой Ñип, а Ð´Ð»Ñ ÑÑолбÑов Ñ Ñипом даÑа/вÑÐµÐ¼Ñ â Ñип interval. Ðо вÑеÑ
ÑÑиÑ
ÑлÑÑаÑÑ
знаÑение ÑмеÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð¾ÑлиÑнÑм Ð¾Ñ NULL и неоÑÑиÑаÑелÑнÑм. ÐÑоме Ñого, Ñ
оÑÑ ÑмеÑение не обÑзаÑелÑно должно бÑÑÑ Ð¿ÑоÑÑой конÑÑанÑой, оно не Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿ÐµÑеменнÑе, агÑегаÑнÑе или оконнÑе ÑÑнкÑии.
Ðополнение иÑклÑÑение_Ñамки позволÑÐµÑ Ð¸ÑклÑÑиÑÑ Ð¸Ð· Ñамки ÑÑÑоки, коÑоÑÑе окÑÑжаÑÑ ÑекÑÑÑÑ ÑÑÑокÑ, даже еÑли они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ñ ÑоглаÑно ÑказаниÑм, опÑеделÑÑÑим наÑало и ÐºÐ¾Ð½ÐµÑ Ñамки. EXCLUDE CURRENT ROW иÑклÑÑÐ°ÐµÑ Ð¸Ð· Ñамки ÑекÑÑÑÑ ÑÑÑокÑ. EXCLUDE GROUP иÑклÑÑÐ°ÐµÑ Ð¸Ð· Ñамки ÑекÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð¸ ÑодÑÑвеннÑе ей ÑоглаÑно поÑÑÐ´ÐºÑ ÑоÑÑиÑовки. EXCLUDE TIES иÑклÑÑÐ°ÐµÑ Ð¸Ð· Ñамки вÑе ÑодÑÑвеннÑе ÑÑÑоки Ð´Ð»Ñ ÑекÑÑей, но не ÑобÑÑвенно ÑекÑÑÑÑ ÑÑÑокÑ. EXCLUDE NO OTHERS пÑоÑÑо Ñвно вÑÑÐ°Ð¶Ð°ÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ по ÑмолÑÐ°Ð½Ð¸Ñ â не иÑклÑÑÐ°ÐµÑ Ð½Ð¸ ÑекÑÑÑÑ ÑÑÑокÑ, ни ÑодÑÑвеннÑе ей.
УÑÑиÑе, ÑÑо в Ñежиме ROWS могÑÑ Ð²ÑдаваÑÑÑÑ Ð½ÐµÐ¿ÑедÑказÑемÑе ÑезÑлÑÑаÑÑ, еÑли ÑоглаÑно поÑÑдкÑ, Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð² ORDER BY, ÑÑÑоки ÑоÑÑиÑÑÑÑÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñно. Ð ÐµÐ¶Ð¸Ð¼Ñ RANGE и GROUPS пÑедÑÑмоÑÑÐµÐ½Ñ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑÑÑоки, ÑвлÑÑÑиеÑÑ ÑодÑÑвеннÑми в поÑÑдке ORDER BY, обÑабаÑÑвалиÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾: вÑе ÑÑÑоки опÑеделÑнной гÑÑÐ¿Ð¿Ñ Ð¿Ð¾Ð¿Ð°Ð´ÑÑ Ð² Ð¾Ð´Ð½Ñ ÑÐ°Ð¼ÐºÑ Ð¸Ð»Ð¸ бÑдÑÑ Ð¸ÑклÑÑÐµÐ½Ñ Ð¸Ð· неÑ.
ÐÑедложение WINDOW пÑименÑеÑÑÑ Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ оконнÑÑ
ÑÑнкÑий, ÑигÑÑиÑÑÑÑиÑ
в запÑоÑе, в ÑпиÑке SELECT или пÑедложении ORDER BY. ÐÑи ÑÑнкÑии могÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑлеменÑам WINDOW по именам в ÑвоиÑ
пÑедложениÑÑ
OVER. ÐÑи ÑÑом ÑлеменÑÑ WINDOW не обÑзаÑелÑно задейÑÑвоваÑÑ Ð² запÑоÑе; еÑли они не иÑполÑзÑÑÑÑÑ, они пÑоÑÑо игноÑиÑÑÑÑÑÑ. ÐконнÑе ÑÑнкÑии можно иÑполÑзоваÑÑ Ð²Ð¾Ð²Ñе без ÑлеменÑов WINDOW, Ñак как в вÑзове оконной ÑÑнкÑии можно задаÑÑ Ð¾Ð¿Ñеделение окна непоÑÑедÑÑвенно в пÑедложении OVER. Ðднако пÑедложение WINDOW позволÑÐµÑ ÑокÑаÑиÑÑ ÑекÑÑ Ð·Ð°Ð¿ÑоÑа, когда одно и Ñо же опÑеделение окна пÑименÑеÑÑÑ Ð¿Ñи вÑзове неÑколÑкиÑ
оконнÑÑ
ÑÑнкÑий.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð²Ð¼ÐµÑÑе Ñ WINDOW.
ÐконнÑе ÑÑнкÑии подÑобно опиÑÑваÑÑÑÑ Ð² Разделе 3.5, ÐодÑазделе 4.2.8 и ÐодÑазделе 7.2.5.
СпиÑок SELECT
СпиÑок SELECT (Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»ÑÑевÑми Ñловами SELECT и FROM) ÑодеÑÐ¶Ð¸Ñ Ð²ÑÑажениÑ, коÑоÑÑе ÑоÑмиÑÑÑÑ Ð²ÑÑ
однÑе ÑÑÑоки опеÑаÑоÑа SELECT. ÐÑи вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ (и обÑÑно обÑаÑаÑÑÑÑ) к ÑÑолбÑам, вÑÑиÑленнÑм в пÑедложении FROM.
Так же, как в ÑаблиÑе, каждÑй вÑÑ
одной ÑÑÐ¾Ð»Ð±ÐµÑ SELECT Ð¸Ð¼ÐµÐµÑ Ð¸Ð¼Ñ. РпÑоÑÑом пÑедложении SELECT ÑÑо Ð¸Ð¼Ñ Ð¿ÑоÑÑо помеÑÐ°ÐµÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¿Ñи вÑводе, но когда SELECT пÑедÑÑавлÑÐµÑ Ñобой подзапÑÐ¾Ñ Ð±Ð¾Ð»ÑÑого запÑоÑа, ÑÑо Ð¸Ð¼Ñ Ð±Ð¾Ð»ÑÑой запÑÐ¾Ñ Ð²Ð¸Ð´Ð¸Ñ ÐºÐ°Ðº Ð¸Ð¼Ñ ÑÑолбÑа виÑÑÑалÑной ÑаблиÑÑ, Ñозданной подзапÑоÑом. ЧÑÐ¾Ð±Ñ Ð·Ð°Ð´Ð°ÑÑ Ð¸Ð¼Ñ Ð´Ð»Ñ Ð²ÑÑ
одного ÑÑолбÑа, нÑжно напиÑаÑÑ AS вÑÑ
одное_Ð¸Ð¼Ñ Ð¿Ð¾Ñле вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑолбÑа. (Слово AS можно опÑÑÑиÑÑ, но ÑолÑко еÑли желаемое вÑÑ
одное Ð¸Ð¼Ñ Ð½Ðµ ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ ÐºÐ°ÐºÐ¸Ð¼-либо клÑÑевÑм Ñловом Postgres Pro (Ñм. ÐÑиложение C). ЧÑÐ¾Ð±Ñ Ð½Ðµ завиÑеÑÑ Ð¾Ñ Ð¿Ð¾ÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
клÑÑевÑÑ
Ñлов в бÑдÑÑем, ÑекомендÑеÑÑÑ Ð²Ñегда пиÑаÑÑ AS, либо заклÑÑаÑÑ Ð¸Ð¼Ñ Ð² двойнÑе кавÑÑки.) ÐÑли Ð¸Ð¼Ñ ÑÑолбÑа не задаÑÑ, Postgres Pro вÑбеÑÐµÑ ÐµÐ³Ð¾ авÑомаÑиÑеÑки. ÐÑли вÑÑажение ÑÑолбÑа пÑедÑÑавлÑÐµÑ Ñобой пÑоÑÑо ÑÑÑÐ»ÐºÑ Ð½Ð° ÑÑолбеÑ, Ñо вÑбÑанное Ñаким обÑазом Ð¸Ð¼Ñ Ð±ÑÐ´ÐµÑ ÑовпадаÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑолбÑа. Рболее ÑложнÑÑ
ÑлÑÑаÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¸Ð¼Ñ ÑÑнкÑии или Ñипа, либо в оÑÑÑÑÑÑвие дÑÑгиÑ
ваÑианÑов ÑиÑÑема Ð¼Ð¾Ð¶ÐµÑ ÑгенеÑиÑоваÑÑ Ð¸Ð¼Ñ Ð²Ñоде ?column?.
Ðо имени вÑÑ
одного ÑÑолбÑа можно обÑаÑиÑÑÑÑ Ðº его знаÑÐµÐ½Ð¸Ñ Ð² пÑедложениÑÑ
ORDER BY и GROUP BY, но не в WHERE или HAVING; в ниÑ
вмеÑÑо имени надо запиÑÑваÑÑ Ð²ÑÑ Ð²ÑÑажение.
ÐмеÑÑо вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² вÑÑ
одном ÑпиÑке можно ÑказаÑÑ *, ÑÑо бÑÐ´ÐµÑ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑаÑÑ Ð²Ñе ÑÑолбÑÑ Ð²ÑбÑаннÑÑ
ÑÑÑок. ÐÑоме Ñого, можно запиÑаÑÑ ÐºÐ°Ðº кÑаÑкое обознаÑение вÑеÑ
ÑÑолбÑов, полÑÑаемÑÑ
из данной ÑаблиÑÑ. Ð ÑÑиÑ
ÑлÑÑаÑÑ
нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð½Ð¾Ð²Ñе имена ÑÑолбÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸Ð¼Ñ_ÑаблиÑÑ.*AS; именами вÑÑ
однÑÑ
ÑÑолбÑов бÑдÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑÑолбÑов в ÑаблиÑе.
СоглаÑно ÑÑандаÑÑÑ SQL, вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² вÑÑ
одном ÑпиÑке Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑÑиÑлÑÑÑÑÑ Ð´Ð¾ пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ DISTINCT, ORDER BY или LIMIT. ÐÑо, оÑевидно, необÑ
одимо Ð´Ð»Ñ DISTINCT, Ñак как инаÑе не бÑÐ´ÐµÑ ÑÑно, какие знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑдаваÑÑÑÑ ÐºÐ°Ðº ÑникалÑнÑе. Ðднако во многиÑ
ÑлÑÑаÑÑ
вÑÑ
однÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñдобнее вÑÑиÑлÑÑÑ Ð¿Ð¾Ñле ORDER BY и LIMIT; в ÑаÑÑноÑÑи, еÑли в вÑÑ
одном ÑпиÑке ÑодеÑжаÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑивÑе или доÑогоÑÑоÑÑие ÑÑнкÑии. Ð ÑÑом ÑлÑÑае поÑÑдок вÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑÑнкÑий оказÑваеÑÑÑ Ð±Ð¾Ð»ÐµÐµ инÑÑиÑивнÑм, а Ð´Ð»Ñ ÑÑÑок, коÑоÑÑе не попадÑÑ Ð² ÑезÑлÑÑаÑ, не бÑдÑÑ Ð¿ÑоизводиÑÑÑÑ Ð²ÑÑиÑлениÑ. Postgres Pro ÑакÑиÑеÑки бÑÐ´ÐµÑ Ð²ÑÑиÑлÑÑÑ Ð²ÑÑ
однÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле ÑоÑÑиÑовки и огÑаниÑÐµÐ½Ð¸Ñ Ð¸Ñ
колиÑеÑÑва, еÑли ÑÑи вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ ÑигÑÑиÑÑÑÑ Ð² DISTINCT, ORDER BY или GROUP BY. (ÐапÑимеÑ, в запÑоÑе SELECT f(x) FROM tab ORDER BY 1 ÑÑнкÑÐ¸Ñ f(x), неÑомненно, должна вÑÑиÑлÑÑÑÑÑ Ð¿ÐµÑед ÑоÑÑиÑовкой.) ÐÑÑ
однÑе вÑÑажениÑ, ÑодеÑжаÑие ÑÑнкÑии, возвÑаÑаÑÑие множеÑÑва, ÑакÑиÑеÑки вÑÑиÑлÑÑÑÑÑ Ð¿Ð¾Ñле ÑоÑÑиÑовки и до огÑаниÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок, Ñак ÑÑо LIMIT бÑÐ´ÐµÑ Ð¾ÑбÑаÑÑваÑÑ ÑÑÑоки, вÑдаваемÑе ÑÑнкÑией, возвÑаÑаÑÑей множеÑÑво.
ÐÑимеÑание
Ð Postgres Pro до веÑÑии 9.6 никакой поÑÑдок вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÑ Ð¾Ð´Ð½ÑÑ Ð²ÑÑажений по оÑноÑÐµÐ½Ð¸Ñ Ðº ÑоÑÑиÑовке или огÑаниÑениÑм колиÑеÑÑва не гаÑанÑиÑовалÑÑ; он завиÑел Ð¾Ñ ÑоÑÐ¼Ñ Ð²ÑбÑанного плана запÑоÑа.
ÐÑедложение DISTINCT
ÐÑли Ñказано SELECT DISTINCT, вÑе повÑоÑÑÑÑиеÑÑ ÑÑÑоки иÑклÑÑаÑÑÑÑ Ð¸Ð· ÑезÑлÑÑиÑÑÑÑего набоÑа (из каждой гÑÑÐ¿Ð¿Ñ Ð´ÑбликаÑов оÑÑаÑÑÑÑ Ð¾Ð´Ð½Ð° ÑÑÑока). SELECT ALL Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑоÑивоположное: ÑоÑ
ÑанÑÐµÑ Ð²Ñе ÑÑÑоки; ÑÑо поведение по ÑмолÑаниÑ.
SELECT DISTINCT ON ( ÑоÑ
ÑанÑÐµÑ ÑолÑко пеÑвÑÑ ÑÑÑÐ¾ÐºÑ Ð¸Ð· каждого набоÑа ÑÑÑок, Ð´Ð»Ñ ÐºÐ¾ÑоÑого данное вÑÑажение даÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе знаÑениÑ. ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²ÑÑажение [, ...] )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 NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð²Ð¼ÐµÑÑе Ñ DISTINCT.
ÐÑедложение UNION+
ÐÑедложение UNION Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑÑÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ:
опеÑаÑоÑ_SELECTUNION [ ALL | DISTINCT ]опеÑаÑоÑ_SELECT
ÐдеÑÑ Ð¾Ð¿ÐµÑаÑоÑ_SELECT â ÑÑо лÑбой подзапÑÐ¾Ñ SELECT без пÑедложений ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE. (ORDER BY и LIMIT можно добавиÑÑ Ðº Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð¼Ñ Ð²ÑÑажениÑ, еÑли оно заклÑÑено в Ñкобки. Ðез Ñкобок ÑÑи пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð²Ð¾ÑпÑинÑÑÑ ÐºÐ°Ðº пÑименÑемÑе к ÑезÑлÑÑаÑÑ UNION, а не к вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² его пÑавой ÑаÑÑи.)
ÐпеÑаÑÐ¾Ñ UNION вÑÑиÑлÑÐµÑ Ð¾Ð±Ñединение множеÑÑв вÑеÑ
ÑÑÑок, возвÑаÑÑннÑÑ
заданнÑми запÑоÑами SELECT. СÑÑока оказÑваеÑÑÑ Ð² обÑединении двÑÑ
набоÑов ÑезÑлÑÑаÑов, еÑли она пÑиÑÑÑÑÑвÑÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм в одном набоÑе. Ðва опеÑаÑоÑа SELECT, пÑедÑÑавлÑÑÑие пÑÑмÑе опеÑÐ°Ð½Ð´Ñ UNION, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑдаваÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ðµ ÑиÑло ÑÑолбÑов, а ÑÐ¸Ð¿Ñ ÑооÑвеÑÑÑвÑÑÑиÑ
ÑÑолбÑов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑовмеÑÑимÑми.
РезÑлÑÑÐ°Ñ UNION не бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиÑ
ÑÑ ÑÑÑок, еÑли не Ñказан паÑамеÑÑ ALL. ALL пÑедоÑвÑаÑÐ°ÐµÑ Ð¸ÑклÑÑение дÑбликаÑов. (Таким обÑазом, UNION ALL обÑÑно ÑабоÑÐ°ÐµÑ Ð·Ð½Ð°ÑиÑелÑно бÑÑÑÑее, Ñем UNION; поÑÑомÑ, везде, где возможно, ÑледÑÐµÑ ÑказÑваÑÑ ALL.) DISTINCT можно запиÑаÑÑ Ñвно, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑиÑÑ, ÑÑо дÑблиÑÑÑÑиеÑÑ ÑÑÑоки Ð´Ð¾Ð»Ð¶Ð½Ñ ÑдалÑÑÑÑÑ (ÑÑо поведение по ÑмолÑаниÑ).
ÐÑи иÑполÑзовании в одном запÑоÑе SELECT неÑколÑкиÑ
опеÑаÑоÑов UNION они вÑÑиÑлÑÑÑÑÑ Ñлева напÑаво, еÑли иной поÑÑдок не опÑеделÑеÑÑÑ Ñкобками.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð½Ð¸ Ð´Ð»Ñ ÑезÑлÑÑаÑа UNION, ни Ð´Ð»Ñ Ð»Ñбого из подзапÑоÑов UNION.
ÐÑедложение INTERSECT
ÐÑедложение INTERSECT Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑÑÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ:
опеÑаÑоÑ_SELECTINTERSECT [ ALL | DISTINCT ]опеÑаÑоÑ_SELECT
ÐдеÑÑ Ð¾Ð¿ÐµÑаÑоÑ_SELECT â ÑÑо лÑбой подзапÑÐ¾Ñ SELECT без пÑедложений ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE.
ÐпеÑаÑÐ¾Ñ INTERSECT вÑÑиÑлÑÐµÑ Ð¿ÐµÑеÑеÑение множеÑÑв вÑеÑ
ÑÑÑок, возвÑаÑÑннÑÑ
заданнÑми запÑоÑами SELECT. СÑÑока оказÑваеÑÑÑ Ð² пеÑеÑеÑении двÑÑ
набоÑов ÑезÑлÑÑаÑов, еÑли она пÑиÑÑÑÑÑвÑÐµÑ Ð² обоиÑ
набоÑаÑ
.
РезÑлÑÑÐ°Ñ INTERSECT не бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиÑ
ÑÑ ÑÑÑок, еÑли не Ñказан паÑамеÑÑ ALL. С паÑамеÑÑом ALL ÑÑÑока, повÑоÑÑÑÑаÑÑÑ m Ñаз в левой ÑаблиÑе и n Ñаз в пÑавой, бÑÐ´ÐµÑ Ð²Ñдана в ÑезÑлÑÑиÑÑÑÑем набоÑе min(m,n) Ñаз. DISTINCT можно запиÑаÑÑ Ñвно, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑиÑÑ, ÑÑо дÑблиÑÑÑÑиеÑÑ ÑÑÑоки Ð´Ð¾Ð»Ð¶Ð½Ñ ÑдалÑÑÑÑÑ (ÑÑо поведение по ÑмолÑаниÑ).
ÐÑи иÑполÑзовании в одном запÑоÑе SELECT неÑколÑкиÑ
опеÑаÑоÑов INTERSECT они вÑÑиÑлÑÑÑÑÑ Ñлева напÑаво, еÑли иной поÑÑдок не дикÑÑеÑÑÑ Ñкобками. INTERSECT ÑвÑзÑÐ²Ð°ÐµÑ Ñвои подзапÑоÑÑ ÑилÑнее, Ñем UNION. ÐÑÑгими Ñловами, A UNION B INTERSECT C бÑÐ´ÐµÑ Ð²Ð¾ÑпÑинимаÑÑÑÑ ÐºÐ°Ðº A UNION (B INTERSECT C).
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð½Ð¸ Ð´Ð»Ñ ÑезÑлÑÑаÑа INTERSECT, ни Ð´Ð»Ñ Ð»Ñбого из подзапÑоÑов INTERSECT.
ÐÑедложение EXCEPT
ÐÑедложение EXCEPT Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑÑÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ:
опеÑаÑоÑ_SELECTEXCEPT [ ALL | DISTINCT ]опеÑаÑоÑ_SELECT
ÐдеÑÑ Ð¾Ð¿ÐµÑаÑоÑ_SELECT â ÑÑо лÑбой подзапÑÐ¾Ñ SELECT без пÑедложений ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE.
ÐпеÑаÑÐ¾Ñ EXCEPT вÑÑиÑлÑÐµÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, коÑоÑÑе пÑиÑÑÑÑÑвÑÑÑ Ð² ÑезÑлÑÑаÑе левого запÑоÑа SELECT, но оÑÑÑÑÑÑвÑÑÑ Ð² ÑезÑлÑÑаÑе пÑавого.
РезÑлÑÑÐ°Ñ EXCEPT не бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиÑ
ÑÑ ÑÑÑок, еÑли не Ñказан паÑамеÑÑ ALL. С паÑамеÑÑом ALL ÑÑÑока, повÑоÑÑÑÑаÑÑÑ m Ñаз в левой ÑаблиÑе и n Ñаз в пÑавой, бÑÐ´ÐµÑ Ð²Ñдана в ÑезÑлÑÑиÑÑÑÑем набоÑе max(m-n,0) Ñаз. DISTINCT можно запиÑаÑÑ Ñвно, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑиÑÑ, ÑÑо дÑблиÑÑÑÑиеÑÑ ÑÑÑоки Ð´Ð¾Ð»Ð¶Ð½Ñ ÑдалÑÑÑÑÑ (ÑÑо поведение по ÑмолÑаниÑ).
ÐÑи иÑполÑзовании в одном запÑоÑе SELECT неÑколÑкиÑ
опеÑаÑоÑов EXCEPT они вÑÑиÑлÑÑÑÑÑ Ñлева напÑаво, еÑли иной поÑÑдок не дикÑÑеÑÑÑ Ñкобками. EXCEPT ÑвÑзÑÐ²Ð°ÐµÑ Ñвои подзапÑоÑÑ Ñак же ÑилÑно, как UNION.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð½Ð¸ Ð´Ð»Ñ ÑезÑлÑÑаÑа EXCEPT, ни Ð´Ð»Ñ Ð»Ñбого из подзапÑоÑов EXCEPT.
ÐÑедложение ORDER BY
ÐеобÑзаÑелÑное пÑедложение ORDER BY Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑÑÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ:
ORDER BYвÑÑажение[ ASC | DESC | USINGопеÑаÑоÑ] [ NULLS { FIRST | LAST } ] [, ...]
ÐÑедложение ORDER BY ÑказÑваеÑ, ÑÑо ÑÑÑоки ÑезÑлÑÑаÑа Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоÑÑиÑоваÑÑÑÑ ÑоглаÑно заданнÑм вÑÑажениÑм. ÐÑли две ÑÑÑоки даÑÑ ÑавнÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñамого левого вÑÑажениÑ, пÑовеÑÑеÑÑÑ ÑледÑÑÑее вÑÑажение и Ñ. д. ÐÑли иÑ
знаÑÐµÐ½Ð¸Ñ Ð¾ÐºÐ°Ð·ÑваÑÑÑÑ ÑавнÑми Ð´Ð»Ñ Ð²ÑеÑ
заданнÑÑ
вÑÑажений, ÑÑÑоки возвÑаÑаÑÑÑÑ Ð² поÑÑдке, опÑеделÑемом ÑеализаÑией.
РкаÑеÑÑве вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð¸Ð¼Ñ Ð¸Ð»Ð¸ поÑÑдковÑй Ð½Ð¾Ð¼ÐµÑ Ð²ÑÑ
одного ÑÑолбÑа (ÑлеменÑа ÑпиÑка SELECT), либо пÑоизволÑное вÑÑажение Ñо знаÑениÑми вÑ
однÑÑ
ÑÑолбÑов.
ÐоÑÑдковÑм номеÑом в данном ÑлÑÑае ÑÑиÑаеÑÑÑ Ð¿Ð¾ÑледоваÑелÑнÑй Ð½Ð¾Ð¼ÐµÑ (пÑи нÑмеÑаÑии Ñлева напÑаво) позиÑии вÑÑ
одного ÑÑолбÑа. ÐозможноÑÑÑ ÑказаÑÑ Ð¿Ð¾ÑÑдковÑй Ð½Ð¾Ð¼ÐµÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð²ÑполниÑÑ ÑоÑÑиÑÐ¾Ð²ÐºÑ Ð¿Ð¾ ÑÑолбÑÑ, не имеÑÑÐµÐ¼Ñ ÑникалÑного имени. РпÑинÑипе ÑÑо не абÑолÑÑно необÑ
одимо, Ñак как вÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ Ð²Ñегда можно пÑиÑвоиÑÑ Ð¸Ð¼Ñ, воÑполÑзовавÑиÑÑ Ð¿Ñедложением AS.
РпÑедложении ORDER BY Ñакже можно иÑполÑзоваÑÑ Ð¿ÑоизволÑнÑе вÑÑажениÑ, в Ñом ÑиÑле, и Ñо ÑÑолбÑами, оÑÑÑÑÑÑвÑÑÑими в ÑпиÑке ÑезÑлÑÑаÑов SELECT. Таким обÑазом, ÑледÑÑÑий опеÑаÑÐ¾Ñ Ð²Ð¿Ð¾Ð»Ð½Ðµ коÑÑекÑен:
SELECT name FROM distributors ORDER BY code;
Ðднако еÑли ORDER BY пÑименÑеÑÑÑ Ðº ÑезÑлÑÑаÑÑ UNION, INTERSECT или EXCEPT, в нÑм можно задаÑÑ ÑолÑко Ð¸Ð¼Ñ Ð¸Ð»Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð²ÑÑ
одного ÑÑолбÑа, но не вÑÑажение.
ÐÑли в каÑеÑÑве вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ORDER BY задано пÑоÑÑое имÑ, коÑоÑÐ¾Ð¼Ñ ÑооÑвеÑÑÑвÑÐµÑ Ð¸ вÑÑ
одной, и вÑ
одной ÑÑолбеÑ, Ñо ORDER BY бÑÐ´ÐµÑ Ð²Ð¾ÑпÑинимаÑÑ ÐµÐ³Ð¾ как Ð¸Ð¼Ñ Ð²ÑÑ
одного ÑÑолбÑа. ÐÑÐ¾Ñ Ð²ÑÐ±Ð¾Ñ Ð¿ÑоÑивоположен ÑомÑ, ÑÑо Ð´ÐµÐ»Ð°ÐµÑ GROUP BY в Ñакой же ÑиÑÑаÑии. Ð¢Ð°ÐºÐ°Ñ Ð½ÐµÑоглаÑованноÑÑÑ Ð´Ð¾Ð¿ÑÑена Ð´Ð»Ñ ÑооÑвеÑÑÑÐ²Ð¸Ñ ÑÑандаÑÑÑ SQL.
ÐополниÑелÑно поÑле лÑбого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² пÑедложении ORDER BY можно добавиÑÑ ÐºÐ»ÑÑевое Ñлово ASC (по возÑаÑÑаниÑ) или DESC (по ÑбÑваниÑ). Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ ASC. ÐÑоме Ñого, можно задаÑÑ Ð¸Ð¼Ñ ÑпеÑиÑиÑеÑкого опеÑаÑоÑа ÑоÑÑиÑовки в пÑедложении USING. ÐпеÑаÑÐ¾Ñ ÑоÑÑиÑовки должен бÑÑÑ Ñленом «менÑÑе» или «болÑÑе» некоÑоÑого ÑемейÑÑва опеÑаÑоÑов B-деÑева. ASC обÑÑно ÑавнознаÑно USING < и DESC обÑÑно ÑавнознаÑно USING >. (ХоÑÑ ÑоздаÑÐµÐ»Ñ Ð½ÐµÑÑандаÑÑного Ñипа даннÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð¿Ð¾-дÑÑÐ³Ð¾Ð¼Ñ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ поÑÑавиÑÑ ÐµÐ¼Ñ Ð² ÑооÑвеÑÑÑвие опеÑаÑоÑÑ Ñ Ð´ÑÑгими именами.)
ÐÑли Ñказано NULLS LAST, знаÑÐµÐ½Ð¸Ñ NULL пÑи ÑоÑÑиÑовке оказÑваÑÑÑÑ Ð¿Ð¾Ñле знаÑений не NULL; Ñ Ñказанием NULLS FIRST знаÑÐµÐ½Ð¸Ñ NULL оказÑваÑÑÑÑ Ð¿ÐµÑед знаÑениÑми не NULL. ÐÑли не Ñказано ни Ñо, ни дÑÑгое, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ NULLS LAST пÑи Ñвно или неÑвно вÑбÑанном поÑÑдке ASC, либо NULLS FIRST пÑи поÑÑдке DESC (Ñо еÑÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑÑиÑаеÑÑÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NULL болÑÑе знаÑений не NULL). С пÑедложением USING поÑÑдок NULL по ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ Ñого, ÑвлÑеÑÑÑ Ð»Ð¸ ÑказаннÑй опеÑаÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑоÑом «менÑÑе» или «болÑÑе».
ÐамеÑÑÑе, ÑÑо паÑамеÑÑÑ ÑоÑÑиÑовки пÑименÑÑÑÑÑ ÑолÑко к ÑÐ¾Ð¼Ñ Ð²ÑÑажениÑ, за коÑоÑÑм они ÑледÑÑÑ; в ÑаÑÑноÑÑи, ORDER BY x, y DESC ознаÑÐ°ÐµÑ Ð½Ðµ Ñо же Ñамое, ÑÑо ORDER BY x DESC, y DESC.
ÐаннÑе ÑимволÑнÑÑ
ÑÑÑок ÑоÑÑиÑÑÑÑÑÑ ÑоглаÑно пÑÐ°Ð²Ð¸Ð»Ñ ÑоÑÑиÑовки, ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ Ð´Ð»Ñ ÑоÑÑиÑÑемого ÑÑолбÑа. ÐÑи необÑ
одимоÑÑи ÑÑо пÑавило можно пеÑеопÑеделиÑÑ, добавив пÑедложение COLLATE в вÑÑажение, напÑÐ¸Ð¼ÐµÑ Ñак: ORDER BY mycolumn COLLATE "en_US". Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 4.2.10 и РазделÑ 22.2.
ÐÑедложение LIMIT
ÐÑедложение LIMIT ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· двÑÑ
незавиÑимÑÑ
вложеннÑÑ
пÑедложений:
LIMIT { ÑиÑло | ALL }
OFFSET наÑало
ÐаÑамеÑÑ ÑиÑло опÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑное колиÑеÑÑво ÑÑÑок, коÑоÑое должно бÑÑÑ Ð²Ñдано, Ñогда как наÑало опÑеделÑеÑ, ÑколÑко ÑÑÑок нÑжно пÑопÑÑÑиÑÑ, пÑежде Ñем наÑаÑÑ Ð²ÑдаваÑÑ ÑÑÑоки. Ðогда ÑÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð±Ð° знаÑениÑ, ÑнаÑала ÑÑÑоки пÑопÑÑкаÑÑÑÑ Ð² колиÑеÑÑве, заданном знаÑением наÑало, а заÑем ÑледÑÑÑие ÑÑÑоки вÑдаÑÑÑÑ Ð² колиÑеÑÑве, не пÑевÑÑаÑÑем знаÑÐµÐ½Ð¸Ñ ÑиÑло.
ÐÑли ÑезÑлÑÑаÑом вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑиÑло оказÑваеÑÑÑ NULL, пÑедложение воÑпÑинимаеÑÑÑ ÐºÐ°Ðº LIMIT ALL, Ñ. е. ÑиÑло ÑÑÑок не огÑаниÑиваеÑÑÑ. ÐÑли наÑало пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение NULL, пÑедложение воÑпÑинимаеÑÑÑ ÐºÐ°Ðº OFFSET 0.
SQL:2008 Ð²Ð²Ð¾Ð´Ð¸Ñ Ð´ÑÑгой ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ñого же ÑезÑлÑÑаÑа, и его Ñак же поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Postgres Pro. Ðн вÑглÑÐ´Ð¸Ñ Ñак:
OFFSETнаÑало{ ROW | ROWS } FETCH { FIRST | NEXT } [ÑиÑло] { ROW | ROWS } { ONLY | WITH TIES }
Ð ÑÑом ÑинÑакÑиÑе знаÑение наÑало или ÑиÑло в ÑооÑвеÑÑÑвии Ñо ÑÑандаÑÑом должно бÑÑÑ Ð±ÑквалÑной конÑÑанÑой, паÑамеÑÑом или именем пеÑеменной; Postgres Pro позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¸ дÑÑгие вÑÑажениÑ, но иÑ
обÑÑно нÑжно заклÑÑаÑÑ Ð² Ñкобки во избежание неоднознаÑноÑÑи. ÐÑли ÑиÑло опÑÑкаеÑÑÑ Ð² пÑедложении FETCH, оно пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение 1. С Ñказанием WITH TIES бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑÑоки, Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ORDER BY ÑовпадаÑÑие Ñ Ð¿Ð¾Ñледней ÑÑÑокой набоÑа ÑезÑлÑÑаÑов; в ÑÑом ÑлÑÑае пÑедложение ORDER BY обÑзаÑелÑно, а SKIP LOCKED â недопÑÑÑимо. Слова ROW и ROWS, а Ñакже FIRST и NEXT ÑвлÑÑÑÑÑ Ð½ÐµÐ·Ð½Ð°ÑаÑими и не влиÑÑÑ Ð½Ð° поведение ÑÑиÑ
пÑедложений. СоглаÑно ÑÑандаÑÑÑ Ð¿Ñедложение OFFSET должно идÑи пеÑед FETCH, еÑли они пÑиÑÑÑÑÑвÑÑÑ Ð²Ð¼ÐµÑÑе; но Postgres Pro менее ÑÑÑог и допÑÑÐºÐ°ÐµÑ Ð»Ñбой поÑÑдок.
ÐÑименÑÑ LIMIT, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл иÑполÑзоваÑÑ Ñакже пÑедложение ORDER BY, ÑÑÐ¾Ð±Ñ ÑÑÑоки ÑезÑлÑÑаÑа вÑдавалиÑÑ Ð² опÑеделÑнном поÑÑдке. ÐнаÑе бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ Ð½ÐµÐ¿ÑедÑказÑемÑе подмножеÑÑва ÑÑÑок запÑоÑа â Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе запÑоÑиÑÑ ÑÑÑоки Ñ Ð´ÐµÑÑÑой по двадÑаÑÑÑ, но какой поÑÑдок Ð²Ñ Ð¸Ð¼ÐµÐµÑе в видÑ? ÐоÑÑдок бÑÐ´ÐµÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑен, еÑли не добавиÑÑ ORDER BY.
ÐланиÑовÑик запÑоÑа ÑÑиÑÑÐ²Ð°ÐµÑ Ð¾Ð³ÑаниÑение LIMIT, ÑÑÑÐ¾Ñ Ð¿Ð»Ð°Ð½ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа, поÑÑомÑ, веÑоÑÑнее вÑего, Ð¿Ð»Ð°Ð½Ñ (а знаÑÐ¸Ñ Ð¸ поÑÑдок ÑÑÑок) бÑдÑÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ñи ÑазнÑÑ
LIMIT и OFFSET. Таким обÑазом, ÑазлиÑнÑе знаÑÐµÐ½Ð¸Ñ LIMIT/OFFSET, вÑбиÑаÑÑие ÑазнÑе подмножеÑÑва ÑезÑлÑÑаÑов запÑоÑа, пÑиведÑÑ Ðº неÑоглаÑованноÑÑи ÑезÑлÑÑаÑов, еÑли не ÑÑÑановиÑÑ Ð¿ÑедÑказÑемÑÑ ÑоÑÑиÑÐ¾Ð²ÐºÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ORDER BY. ÐÑо не оÑибка, а неизбежное ÑледÑÑвие Ñого, ÑÑо SQL не гаÑанÑиÑÑÐµÑ Ð²Ñвод ÑезÑлÑÑаÑов запÑоÑа в некоÑоÑом поÑÑдке, еÑли поÑÑдок не опÑеделÑн Ñвно пÑедложением ORDER BY.
Ðозможно даже, ÑÑо пÑи повÑоÑном вÑполнении одного и Ñого же запÑоÑа Ñ LIMIT бÑдÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ ÑазнÑе подмножеÑÑва ÑÑÑок ÑаблиÑÑ, еÑли пÑедложение ORDER BY не дикÑÑÐµÑ Ð²ÑÐ±Ð¾Ñ Ð¾Ð¿ÑеделÑнного подмножеÑÑва. ÐпÑÑÑ Ð¶Ðµ, ÑÑо не оÑибка; в данном ÑлÑÑае деÑеÑминиÑованноÑÑÑ ÑезÑлÑÑаÑа пÑоÑÑо не гаÑанÑиÑÑеÑÑÑ.
ÐÑедложение блокиÑовки
ÐÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE и FOR KEY SHARE; они влиÑÑÑ Ð½Ð° Ñо, как SELECT блокиÑÑÐµÑ ÑÑÑоки, полÑÑаемÑе из ÑаблиÑÑ.
ÐÑедложение блокиÑовки Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑÑÑ Ð¾Ð±ÑÑÑ ÑоÑмÑ:
FORваÑианÑ_блокиÑовки[ OFимÑ_ÑаблиÑÑ[, ...] ] [ NOWAIT | SKIP LOCKED ]
ÐдеÑÑ Ð²Ð°ÑианÑ_блокиÑовки Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑледÑÑÑим:
UPDATE NO KEY UPDATE SHARE KEY SHARE
ÐодÑобнее о каждом Ñежиме блокиÑовки на ÑÑовне ÑÑÑок можно ÑзнаÑÑ Ð² ÐодÑазделе 13.3.2.
ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð½Ðµ ждала завеÑÑÐµÐ½Ð¸Ñ Ð´ÑÑгиÑ
ÑÑанзакÑий, к блокиÑовке можно добавиÑÑ Ñказание NOWAIT или SKIP LOCKED. С NOWAIT опеÑаÑÐ¾Ñ Ð²ÑдаÑÑ Ð¾ÑибкÑ, а не ждÑÑ, еÑли вÑбÑаннÑÑ ÑÑÑÐ¾ÐºÑ Ð½ÐµÐ»ÑÐ·Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾. С Ñказанием SKIP LOCKED вÑбÑаннÑе ÑÑÑоки, коÑоÑÑе нелÑÐ·Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾, пÑопÑÑкаÑÑÑÑ. ÐÑи ÑÑом ÑоÑмиÑÑеÑÑÑ Ð½ÐµÑоглаÑованное пÑедÑÑавление даннÑÑ
, Ñак ÑÑо ÑÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð½Ðµ подÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð¾Ð±Ñего пÑименениÑ, но Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок пÑи обÑаÑении множеÑÑва поÑÑебиÑелей к ÑаблиÑе Ñипа оÑеÑеди. ÐамеÑÑÑе, ÑÑо ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ NOWAIT и SKIP LOCKED пÑименÑÑÑÑÑ ÑолÑко к блокиÑовкам на ÑÑовне ÑÑÑок â необÑ
Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка ROW SHARE ÑÑÐ¾Ð²Ð½Ñ ÑаблиÑÑ Ð·Ð°Ð¿ÑаÑиваеÑÑÑ Ð¾Ð±ÑÑнÑм ÑпоÑобом (Ñм. ÐлавÑ 13). ÐÑли ÑÑебÑеÑÑÑ Ð·Ð°Ð¿ÑоÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑÑÐ¾Ð²Ð½Ñ ÑаблиÑÑ Ð±ÐµÐ· ожиданиÑ, можно ÑнаÑала вÑполниÑÑ LOCK Ñ Ñказанием NOWAIT.
ÐÑли в пÑедложении блокиÑовки ÑÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð¿ÑеделÑннÑе ÑаблиÑÑ, блокиÑоваÑÑÑÑ Ð±ÑдÑÑ ÑолÑко ÑÑÑоки, полÑÑаемÑе из ÑÑиÑ
ÑаблиÑ; дÑÑгие ÑаблиÑÑ, задейÑÑвованнÑе в SELECT, бÑдÑÑ Ð¿ÑоÑиÑÐ°Ð½Ñ ÐºÐ°Ðº обÑÑно. ÐÑедложение блокиÑовки без ÑпиÑка ÑÐ°Ð±Ð»Ð¸Ñ Ð·Ð°ÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð²Ñе ÑаблиÑÑ, задейÑÑвованнÑе в ÑÑом опеÑаÑоÑе. ÐÑли пÑедложение блокиÑовки пÑименÑеÑÑÑ Ðº пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ подзапÑоÑÑ, оно заÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð²Ñе ÑаблиÑÑ, коÑоÑÑе иÑполÑзÑÑÑÑÑ Ð² пÑедÑÑавлении или подзапÑоÑе. Ðднако ÑÑи пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ пÑименÑÑÑÑÑ Ðº запÑоÑам WITH, к коÑоÑÑм обÑаÑаеÑÑÑ Ð¾Ñновной запÑоÑ. ÐÑли ÑÑебÑеÑÑÑ ÑÑÑановиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑÑÑок в запÑоÑе WITH, пÑедложение блокиÑовки нÑжно ÑказаÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в ÑÑом запÑоÑе WITH.
Ð ÑлÑÑае необÑ
одимоÑÑи задаÑÑ Ð´Ð»Ñ ÑазнÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ñазное поведение блокиÑовки, в запÑÐ¾Ñ Ð¼Ð¾Ð¶Ð½Ð¾ добавиÑÑ Ð½ÐµÑколÑко пÑедложений. ÐÑли пÑи ÑÑом одна и Ñа же ÑаблиÑа ÑпоминаеÑÑÑ (или неÑвно заÑÑагиваеÑÑÑ) в неÑколÑкиÑ
пÑедложениÑÑ
блокиÑовки, блокиÑовка ÑÑÑанавливаеÑÑÑ Ñак, как еÑли Ð±Ñ Ð±Ñло Ñказано ÑолÑко одно, Ñамое ÑилÑное из ниÑ
. ÐодобнÑм обÑазом, еÑли в одном из пÑедложений Ñказано NOWAIT, Ð´Ð»Ñ ÑÑой ÑаблиÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовка бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑаÑиваÑÑÑÑ Ð±ÐµÐ· ожиданиÑ. РпÑоÑивном ÑлÑÑае она бÑÐ´ÐµÑ Ð¾Ð±ÑабоÑана в Ñежиме SKIP LOCKED, еÑли он вÑбÑан в лÑбом из заÑÑагиваÑÑиÑ
ÐµÑ Ð¿Ñедложений.
ÐÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки не могÑÑ Ð¿ÑименÑÑÑÑÑ Ð² конÑекÑÑÐ°Ñ , где возвÑаÑаемÑе ÑÑÑоки нелÑÐ·Ñ ÑÑÑко ÑвÑзаÑÑ Ñ Ð¾ÑделÑнÑми ÑÑÑоками ÑаблиÑÑ; напÑимеÑ, блокиÑовка непÑименима пÑи агÑегиÑовании.
Ðогда пÑедложение блокиÑовки наÑ
одиÑÑÑ Ð½Ð° веÑÑ
нем ÑÑовне запÑоÑа SELECT, блокиÑÑÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ Ñе ÑÑÑоки, коÑоÑÑе возвÑаÑаÑÑÑÑ Ð·Ð°Ð¿ÑоÑом; в ÑлÑÑае Ñ Ð·Ð°Ð¿ÑоÑом обÑединениÑ, блокиÑовке Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð°Ñ ÑÑÑоки, из коÑоÑÑÑ
ÑоÑÑавлÑÑÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑе ÑÑÑоки обÑединениÑ. Рдополнение к ÑÑомÑ, заблокиÑÐ¾Ð²Ð°Ð½Ñ Ð±ÑдÑÑ ÑÑÑоки, ÑдовлеÑвоÑÑÑÑие ÑÑловиÑм запÑоÑа на Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñнимка запÑоÑа, Ñ
оÑÑ Ð¾Ð½Ð¸ не бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑенÑ, еÑли Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа Ñнимка они изменÑÑÑÑ Ð¸ пеÑеÑÑанÑÑ ÑдовлеÑвоÑÑÑÑ ÑÑловиÑм. ÐÑли пÑименÑеÑÑÑ LIMIT, блокиÑовка пÑекÑаÑаеÑÑÑ, как ÑолÑко бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено доÑÑаÑоÑное колиÑеÑÑво ÑÑÑок Ð´Ð»Ñ ÑдовлеÑвоÑÐµÐ½Ð¸Ñ Ð»Ð¸Ð¼Ð¸Ñа (но замеÑÑÑе, ÑÑо ÑÑÑоки, пÑопÑÑкаемÑе Ñказанием OFFSET, бÑдÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑÑÑ). ÐодобнÑм обÑазом, еÑли пÑедложение блокиÑовки пÑименÑеÑÑÑ Ð² запÑоÑе кÑÑÑоÑа, блокиÑоваÑÑÑÑ Ð±ÑдÑÑ ÑолÑко ÑÑÑоки, ÑакÑиÑеÑки полÑÑеннÑе или пÑойденнÑе кÑÑÑоÑом.
Ðогда пÑедложение блокиÑовки наÑ
одиÑÑÑ Ð² подзапÑоÑе SELECT, блокиÑовке Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð°Ñ Ñе ÑÑÑоки, коÑоÑÑе бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð²Ð½ÐµÑним запÑоÑом Ð¾Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑа. ТакиÑ
ÑÑÑок Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð¼ÐµÐ½ÑÑе, Ñем можно бÑло Ð±Ñ Ð¿ÑедположиÑÑ, пÑоанализиÑовав ÑолÑко Ñам подзапÑоÑ, Ñак как ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸Ð· внеÑнего запÑоÑа могÑÑ ÑпоÑобÑÑвоваÑÑ Ð¾Ð¿ÑимизаÑии вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑа. ÐапÑимеÑ, запÑоÑ
SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;
заблокиÑÑÐµÑ ÑолÑко ÑÑÑоки, в коÑоÑÑÑ
col1 = 5, пÑи Ñом, ÑÑо в Ñакой запиÑи ÑÑловие не оÑноÑиÑÑÑ Ðº подзапÑоÑÑ.
ÐÑедÑдÑÑие веÑÑии не могли ÑÐ¾Ñ ÑаниÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ, коÑоÑÐ°Ñ Ð±Ñла повÑÑена поÑледÑÑÑей ÑоÑкой ÑÐ¾Ñ ÑанениÑ. ÐапÑимеÑ, ÑÑÐ¾Ñ ÐºÐ¾Ð´:
BEGIN; SELECT * FROM mytable WHERE key = 1 FOR UPDATE; SAVEPOINT s; UPDATE mytable SET ... WHERE key = 1; ROLLBACK TO s;
не мог ÑоÑ
ÑаниÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ FOR UPDATE поÑле ROLLBACK TO. ÐÑо бÑло иÑпÑавлено в веÑÑии 9.3.
Ðнимание
Ðозможно, ÑÑо команда SELECT, ÑабоÑаÑÑÐ°Ñ Ð½Ð° ÑÑовне изолÑÑии READ COMMITTED и пÑименÑÑÑÐ°Ñ Ð¿Ñедложение ORDER BY вмеÑÑе Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовкой, бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑÑÑоки не по поÑÑдкÑ. ÐÑо ÑвÑзано Ñ Ñем, ÑÑо ORDER BY вÑполнÑеÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑедÑ. ÐÑа команда оÑÑоÑÑиÑÑÐµÑ ÑезÑлÑÑаÑ, но заÑем Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñована, пÑÑаÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¾Ð´Ð½Ð¾Ð¹ или неÑколÑкиÑ
ÑÑÑок. РмоменÑÑ, когда блокиÑовка SELECT бÑÐ´ÐµÑ ÑнÑÑа, некоÑоÑÑе из ÑоÑÑиÑÑемÑÑ
ÑÑолбÑов могÑÑ Ñже измениÑÑÑÑ, в ÑезÑлÑÑаÑе Ñего иÑ
поÑÑдок Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°ÑÑÑен (Ñ
оÑÑ Ð¾Ð½Ð¸ бÑли ÑпоÑÑдоÑÐµÐ½Ñ Ð´Ð»Ñ Ð¸ÑÑ
однÑÑ
знаÑений). ÐÑи необÑ
одимоÑÑи обойÑи ÑÑÑ Ð¿ÑоблемÑ, можно помеÑÑиÑÑ FOR UPDATE/SHARE в подзапÑоÑ, напÑÐ¸Ð¼ÐµÑ Ñак:
SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1;
ÐамеÑÑÑе, ÑÑо в ÑезÑлÑÑаÑе ÑÑо пÑиведÑÑ Ðº блокиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑеÑ
ÑÑÑок в mytable, Ñогда как Ñказание FOR UPDATE на веÑÑ
нем ÑÑовне могло Ð±Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ ÑолÑко ÑакÑиÑеÑки возвÑаÑаемÑе ÑÑÑоки. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно повлиÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ, оÑобенно в ÑоÑеÑании ORDER BY Ñ LIMIT или дÑÑгими огÑаниÑениÑми. Таким обÑазом, ÑÑÐ¾Ñ Ð¿ÑиÑм ÑекомендÑеÑÑÑ, ÑолÑко еÑли ожидаеÑÑÑ Ð¿Ð°ÑаллелÑное изменение ÑоÑÑиÑÑемÑÑ
ÑÑолбÑов, а ÑезÑлÑÑÐ°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ ÑÑÑого оÑÑоÑÑиÑован.
Ðа ÑÑовнÑÑ
изолÑÑии REPEATABLE READ и SERIALIZABLE ÑÑо пÑиведÑÑ Ðº оÑибке ÑеÑиализаÑии (Ñ SQLSTATE '40001'), Ñак ÑÑо на ÑÑиÑ
ÑÑовнÑÑ
полÑÑиÑÑ ÑÑÑоки не по поÑÑÐ´ÐºÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾.
Ðоманда TABLE
Ðоманда
TABLE имÑÑавнознаÑна
SELECT * FROM Ð¸Ð¼Ñ ÐÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑименÑÑÑ Ð² каÑеÑÑве ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð²ÐµÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ как более кÑаÑкÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð²Ð½ÑÑÑи ÑложнÑÑ
запÑоÑов. С командой TABLE могÑÑ Ð¸ÑполÑзоваÑÑÑÑ ÑолÑко пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WITH, UNION, INTERSECT, EXCEPT, ORDER BY, LIMIT, OFFSET, FETCH и пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки FOR; пÑедложение WHERE и какие-либо ÑоÑÐ¼Ñ Ð°Ð³ÑегиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ поддеÑживаÑÑÑÑ.
ÐÑимеÑÑ
Соединение ÑаблиÑÑ films Ñ ÑаблиÑей distributors:
SELECT f.title, f.did, d.name, f.date_prod, f.kind
FROM distributors d JOIN films f USING (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
...СÑммиÑование знаÑений ÑÑолбÑа len (пÑодолжиÑелÑноÑÑÑ) Ð´Ð»Ñ Ð²ÑеÑ
ÑилÑмов и гÑÑппиÑование ÑезÑлÑÑаÑов по ÑÑолбÑÑ kind (ÑÐ¸Ð¿Ñ ÑилÑма):
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
СÑммиÑование знаÑений ÑÑолбÑа 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ÐÑÐ¸Ð¼ÐµÑ ÑÑнкÑии Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñм ÑÑолбÑом нÑмеÑаÑии:
SELECT * FROM unnest(ARRAY['a','b','c','d','e','f']) WITH ORDINALITY; unnest | ordinality --------+---------- a | 1 b | 2 c | 3 d | 4 e | 5 f | 6 (6 rows)
ÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑ, как иÑполÑзоваÑÑ Ð¿ÑоÑÑое пÑедложение WITH:
WITH t AS (
SELECT random() as x FROM generate_series(1, 3)
)
SELECT * FROM t
UNION ALL
SELECT * FROM t;
x
--------------------
0.534150459803641
0.520092216785997
0.0735620250925422
0.534150459803641
0.520092216785997
0.0735620250925422 ÐамеÑÑÑе, ÑÑо запÑÐ¾Ñ WITH вÑполнÑеÑÑÑ Ð²Ñего один Ñаз, поÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем два одинаковÑÑ
набоÑа по ÑÑи ÑлÑÑайнÑÑ
знаÑениÑ.
Ð ÑÑом пÑимеÑе WITH RECURSIVE пÑименÑеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка вÑеÑ
подÑинÑннÑÑ
ÐеÑи (непоÑÑедÑÑвеннÑÑ
или коÑвеннÑÑ
) и вÑвода иÑ
ÑÑÐ¾Ð²Ð½Ñ ÐºÐ¾ÑвенноÑÑи в ÑаблиÑе Ñ Ð¸Ð½ÑоÑмаÑией ÑолÑко о непоÑÑедÑÑвеннÑÑ
подÑинÑннÑÑ
:
WITH RECURSIVE employee_recursive(distance, employee_name, manager_name) AS (
SELECT 1, employee_name, manager_name
FROM employee
WHERE manager_name = 'Mary'
UNION ALL
SELECT er.distance + 1, e.employee_name, e.manager_name
FROM employee_recursive er, employee e
WHERE er.employee_name = e.manager_name
)
SELECT distance, employee_name FROM employee_recursive; ÐамеÑÑÑе, ÑÑо ÑÑо ÑипиÑÐ½Ð°Ñ ÑоÑма ÑекÑÑÑивнÑÑ
запÑоÑов: наÑалÑное ÑÑловие, поÑледÑÑÑий UNION, а заÑем ÑекÑÑÑÐ¸Ð²Ð½Ð°Ñ ÑаÑÑÑ Ð·Ð°Ð¿ÑоÑа. УбедиÑеÑÑ Ð² Ñом, ÑÑо ÑекÑÑÑÐ¸Ð²Ð½Ð°Ñ ÑаÑÑÑ Ð·Ð°Ð¿ÑоÑа в конÑе конÑов пеÑеÑÑÐ°Ð½ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑÑÑоки, инаÑе запÑÐ¾Ñ Ð¾ÐºÐ°Ð¶ÐµÑÑÑ Ð² беÑконеÑном Ñикле. (Ðа дÑÑгими пÑимеÑами обÑаÑиÑеÑÑ Ðº РазделÑ 7.8.)
Ð ÑÑом пÑимеÑе иÑполÑзÑеÑÑÑ LATERAL Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑнкÑии get_product_names(), возвÑаÑаÑÑей множеÑÑво, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки ÑаблиÑÑ manufacturers:
SELECT m.name AS mname, pname FROM manufacturers m, LATERAL get_product_names(m.id) pname;
ÐÑоизводиÑели, Ñ ÐºÐ¾ÑоÑÑми в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ðµ ÑвÑÐ·Ð°Ð½Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ пÑодÑкÑÑ, не попадÑÑ Ð² ÑезÑлÑÑаÑ, Ñак как ÑÑо внÑÑÑеннее Ñоединение. ÐÑли Ð±Ñ Ð¼Ñ Ð·Ð°Ñ Ð¾Ñели вклÑÑиÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑÑÐ¸Ñ Ð¿ÑоизводиÑелей, Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑделаÑÑ Ñак:
SELECT m.name AS mname, pname FROM manufacturers m LEFT JOIN LATERAL get_product_names(m.id) pname ON true;
СовмеÑÑимоÑÑÑ
РазÑмееÑÑÑ, опеÑаÑÐ¾Ñ SELECT ÑовмеÑÑим Ñо ÑÑандаÑÑом SQL. Ðднако не вÑе опиÑаннÑе в ÑÑандаÑÑе возможноÑÑи ÑеализованÑ, а некоÑоÑÑе, наобоÑоÑ, ÑвлÑÑÑÑÑ ÑаÑÑиÑениÑми.
ÐеобÑзаÑелÑное пÑедложение FROM
Postgres Pro ÑазÑеÑÐ°ÐµÑ Ð¾Ð¿ÑÑÑиÑÑ Ð¿Ñедложение FROM. ÐÑо позволÑÐµÑ Ð¾ÑÐµÐ½Ñ Ð»ÐµÐ³ÐºÐ¾ вÑÑиÑлÑÑÑ ÑезÑлÑÑаÑÑ Ð¿ÑоÑÑÑÑ
вÑÑажений:
SELECT 2+2;
?column?
----------
4 ÐекоÑоÑÑе дÑÑгие Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
SQL не допÑÑкаÑÑ ÑÑого, ÑÑебÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð² SELECT ÑикÑивнÑÑ ÑаблиÑÑ Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑокой.
ÐÑÑÑÑе ÑпиÑки SELECT
СпиÑок вÑÑ
однÑÑ
вÑÑажений поÑле SELECT Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм, ÑÑо в ÑезÑлÑÑаÑе даÑÑ ÑаблиÑÑ Ð±ÐµÐ· ÑÑолбÑов. СÑандаÑÑ SQL не ÑÑиÑÐ°ÐµÑ Ñакой ÑинÑакÑÐ¸Ñ Ð´Ð¾Ð¿ÑÑÑимÑм, но Postgres Pro допÑÑÐºÐ°ÐµÑ ÐµÐ³Ð¾, Ñак как ÑÑо ÑоглаÑÑеÑÑÑ Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð¸Ð¼ÐµÑÑ ÑаблиÑÑ Ñ Ð½ÑлÑм ÑÑолбÑов. Ðднако когда иÑполÑзÑеÑÑÑ DISTINCT, пÑÑÑой ÑпиÑок не допÑÑкаеÑÑÑ.
ÐеобÑзаÑелÑное клÑÑевое Ñлово AS
Ð ÑÑандаÑÑе SQL необÑзаÑелÑное клÑÑевое Ñлово AS можно опÑÑÑиÑÑ Ð¿ÐµÑед именем вÑÑ
одного ÑÑолбÑа, еÑли ÑÑо Ð¸Ð¼Ñ ÑвлÑеÑÑÑ Ð´Ð¾Ð¿ÑÑÑимÑм именем ÑÑолбÑа (Ñо еÑÑÑ Ð½Ðµ ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ ÐºÐ°ÐºÐ¸Ð¼-либо заÑезеÑвиÑованнÑм клÑÑевÑм Ñловом). Postgres Pro неÑколÑко более ÑÑÑог: AS ÑÑебÑеÑÑÑ, еÑли Ð¸Ð¼Ñ ÑÑолбÑа ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð»ÑбÑм клÑÑевÑм Ñловом, заÑезеÑвиÑованнÑм или неÑ. Тем не менее ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ AS или заклÑÑаÑÑ Ð¸Ð¼ÐµÐ½Ð° вÑÑ
однÑÑ
ÑÑолбÑов в кавÑÑки, во избежание конÑликÑов, возможнÑÑ
пÑи поÑвлении в бÑдÑÑем новÑÑ
клÑÑевÑÑ
Ñлов.
Ð ÑпиÑке FROM и ÑÑандаÑÑ, и Postgres Pro позволÑÑÑ Ð¾Ð¿ÑÑкаÑÑ AS пеÑед пÑевдонимом, коÑоÑÑй ÑвлÑеÑÑÑ Ð½ÐµÐ·Ð°ÑезеÑвиÑованнÑм клÑÑевÑм Ñловом. Ðо Ð´Ð»Ñ Ð¸Ð¼Ñн вÑÑ
однÑÑ
ÑÑолбÑов ÑÑо не подÑ
Ð¾Ð´Ð¸Ñ Ð¸Ð·-за ÑинÑакÑиÑеÑкой неоднознаÑноÑÑи.
ONLY и наÑледование
СÑандаÑÑ SQL ÑÑебÑÐµÑ Ð·Ð°ÐºÐ»ÑÑаÑÑ Ð² Ñкобки Ð¸Ð¼Ñ ÑаблиÑÑ Ð¿Ð¾Ñле ONLY, напÑÐ¸Ð¼ÐµÑ SELECT * FROM ONLY (tab1), ONLY (tab2) WHERE .... Postgres Pro ÑÑиÑÐ°ÐµÑ ÑÑи Ñкобки необÑзаÑелÑнÑми.
Postgres Pro позволÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð² конÑе *, ÑÑÐ¾Ð±Ñ Ñвно обознаÑиÑÑ, ÑÑо доÑеÑние ÑаблиÑÑ Ð²ÐºÐ»ÑÑаÑÑÑÑ Ð² ÑаÑÑмоÑÑение, в оÑлиÑие Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ ONLY. СÑандаÑÑ Ð½Ðµ позволÑÐµÑ ÑÑого.
(ÐÑи ÑообÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² Ñавной ÑÑепени каÑаÑÑÑÑ Ð²ÑеÑ
SQL-команд, поддеÑживаÑÑиÑ
паÑамеÑÑ ONLY.)
ÐгÑаниÑÐµÐ½Ð¸Ñ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ TABLESAMPLE
ÐÑедложение TABLESAMPLE в наÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÑинимаеÑÑÑ ÑолÑко Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ маÑеÑиализованнÑÑ
пÑедÑÑавлений. Ðднако ÑоглаÑно ÑÑандаÑÑÑ SQL оно должно пÑименÑÑÑÑÑ Ðº лÑбÑм ÑлеменÑам ÑпиÑка FROM.
ÐÑÐ·Ð¾Ð²Ñ ÑÑнкÑий в пÑедложении FROM
Postgres Pro позволÑÐµÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð²Ñзов ÑÑнкÑии непоÑÑедÑÑвенно в виде ÑлеменÑа ÑпиÑка FROM. Ð ÑÑандаÑÑе SQL Ñакой вÑзов ÑÑнкÑии ÑÑебÑеÑÑÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ Ð²Ð¾ вложеннÑй SELECT; Ñо еÑÑÑ, запиÑÑ FROM пÑимеÑно ÑавнознаÑна запиÑи ÑÑнкÑиÑ(...) пÑевдонимFROM LATERAL (SELECT . ÐамеÑÑÑе, ÑÑо Ñказание ÑÑнкÑиÑ(...)) пÑевдонимLATERAL ÑÑиÑаеÑÑÑ Ð½ÐµÑвнÑм; ÑÑо ÑвÑзано Ñ Ñем, ÑÑо ÑÑандаÑÑ ÑÑебÑÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ LATERAL Ð´Ð»Ñ ÑлеменÑа UNNEST() в пÑедложении FROM. Postgres Pro обÑабаÑÑÐ²Ð°ÐµÑ UNNEST() Ñак же, как и дÑÑгие ÑÑнкÑии, возвÑаÑаÑÑие множеÑÑва.
ÐÑоÑÑÑанÑÑва имÑн в GROUP BY и ORDER BY
Ð ÑÑандаÑÑе SQL-92 пÑедложение ORDER BY Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑÑÑлки ÑолÑко на вÑÑ
однÑе ÑÑолбÑÑ Ð¿Ð¾ именам или номеÑам, Ñогда как GROUP BY Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ ÑолÑко вÑ
однÑÑ
ÑÑолбÑов. Postgres Pro ÑаÑÑиÑÑÐµÑ Ð¾Ð±Ð° ÑÑи пÑедложениÑ, позволÑÑ Ñакже пÑименÑÑÑ Ð´ÑÑгие ваÑианÑÑ (но еÑли Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑÑ, он ÑазÑеÑÐ°ÐµÑ ÐµÑ ÑоглаÑно ÑÑандаÑÑÑ). Postgres Pro Ñакже позволÑÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ Ð¿ÑоизволÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² обоиÑ
пÑедложениÑÑ
. ÐамеÑÑÑе, ÑÑо имена, ÑигÑÑиÑÑÑÑие в вÑÑажениÑÑ
, вÑегда бÑдÑÑ Ð²Ð¾ÑпÑинимаÑÑÑÑ ÐºÐ°Ðº имена вÑ
однÑÑ
, а не вÑÑ
однÑÑ
ÑÑолбÑов.
Ð SQL:1999 и более поздниÑ
ÑÑандаÑÑаÑ
введено неÑколÑко дÑÑгое опÑеделение, коÑоÑое не полноÑÑÑÑ ÑовмеÑÑимо Ñ SQL-92. Ðднако в болÑÑинÑÑве ÑлÑÑаев Postgres Pro бÑÐ´ÐµÑ Ð¸Ð½ÑеÑпÑеÑиÑоваÑÑ Ð²ÑÑажение ORDER BY или GROUP BY Ñак, как ÑÑебÑÐµÑ SQL:1999.
ФÑнкÑионалÑнÑе завиÑимоÑÑи
Postgres Pro ÑаÑпознаÑÑ ÑÑнкÑионалÑнÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑÑ (ÑÑо позволÑÐµÑ Ð¾Ð¿ÑÑкаÑÑ ÑÑолбÑÑ Ð² GROUP BY), ÑолÑко когда пеÑвиÑнÑй клÑÑ ÑаблиÑÑ Ð¿ÑиÑÑÑÑÑвÑÐµÑ Ð² ÑпиÑке GROUP BY. Ð ÑÑандаÑÑе SQL оговаÑиваÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑловиÑ, коÑоÑÑе ÑледÑÐµÑ ÑÑиÑÑваÑÑ.
LIMIT и OFFSET
ÐÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ LIMIT и OFFSET оÑноÑÑÑÑÑ Ðº ÑпеÑиÑиÑеÑким оÑобенноÑÑÑм Postgres Pro и поддеÑживаÑÑÑÑ Ñакже в MySQL. Ð ÑÑандаÑÑе SQL:2008 Ð´Ð»Ñ Ñой же Ñели вводÑÑÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OFFSET ... FETCH {FIRST|NEXT} ..., ÑаÑÑмоÑÑеннÑе Ñанее в ÐÑедложение LIMIT. ÐÑÐ¾Ñ ÑинÑакÑÐ¸Ñ Ñакже иÑполÑзÑеÑÑÑ Ð² IBM DB2. (ÐÑиложениÑ, напиÑаннÑе Ð´Ð»Ñ Oracle, ÑаÑÑо пÑименÑÑÑ Ð¾Ð±Ñ
одной ÑпоÑоб и полÑÑаÑÑ ÑÑÑÐµÐºÑ ÑÑиÑ
пÑедложений, задейÑÑвÑÑ Ð°Ð²ÑомаÑиÑеÑки генеÑиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ rownum, коÑоÑÑй оÑÑÑÑÑÑвÑÐµÑ Ð² Postgres Pro.)
FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE, FOR KEY SHARE
ХоÑÑ Ñказание FOR UPDATE еÑÑÑ Ð² ÑÑандаÑÑе SQL, ÑÑандаÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¸ÑполÑзоваÑÑ ÐµÐ³Ð¾ ÑолÑко в пÑедложении DECLARE CURSOR. Postgres Pro допÑÑÐºÐ°ÐµÑ ÐµÐ³Ð¾ иÑполÑзование в лÑбом запÑоÑе SELECT, а Ñакже в подзапÑоÑаÑ
SELECT, но ÑÑо ÑвлÑеÑÑÑ ÑаÑÑиÑением. ÐаÑианÑÑ FOR NO KEY UPDATE, FOR SHARE и FOR KEY SHARE, а Ñакже ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ NOWAIT и SKIP LOCKED в ÑÑандаÑÑе оÑÑÑÑÑÑвÑÑÑ.
Ðзменение даннÑÑ
в WITH
Postgres Pro ÑазÑеÑÐ°ÐµÑ Ð¸ÑполÑзоваÑÑ INSERT, UPDATE и DELETE в каÑеÑÑве запÑоÑов WITH. СÑандаÑÑ SQL ÑÑого не пÑедÑÑмаÑÑиваеÑ.
ÐеÑÑандаÑÑнÑе пÑедложениÑ
DISTINCT ON ( ... ) â ÑаÑÑиÑение ÑÑандаÑÑа SQL.
ROWS FROM( ... ) â ÑаÑÑиÑение ÑÑандаÑÑа SQL.
Ð£ÐºÐ°Ð·Ð°Ð½Ð¸Ñ MATERIALIZED и NOT MATERIALIZED пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WITH оÑноÑÑÑÑÑ Ðº ÑаÑÑиÑениÑм ÑÑандаÑÑа SQL.