7.3. СпиÑки вÑбоÑки
Ðак говоÑилоÑÑ Ð² пÑедÑдÑÑем Ñазделе, ÑаблиÑное вÑÑажение в SELECT ÑоздаÑÑ Ð¿ÑомежÑÑоÑнÑÑ Ð²Ð¸ÑÑÑалÑнÑÑ ÑаблиÑÑ, возможно обÑединÑÑ ÑаблиÑÑ, пÑедÑÑавлениÑ, гÑÑппиÑÑÑ Ð¸ иÑклÑÑÐ°Ñ Ð»Ð¸Ñние ÑÑÑоки и Ñ. д. ÐолÑÑÐµÐ½Ð½Ð°Ñ ÑаблиÑа пеÑедаÑÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки в ÑпиÑок вÑбоÑки. ÐÑÐ¾Ñ ÑпиÑок вÑбиÑаеÑ, какие ÑÑолбÑÑ Ð¿ÑомежÑÑоÑной ÑаблиÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑводиÑÑÑÑ Ð² ÑезÑлÑÑаÑе и как именно.
7.3.1. ÐлеменÑÑ ÑпиÑка вÑбоÑки
ÐÑоÑÑейÑий ÑпиÑок вÑбоÑки обÑазÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ *, коÑоÑÑй вÑбиÑÐ°ÐµÑ Ð²Ñе ÑÑолбÑÑ Ð¸Ð· полÑÑенного ÑаблиÑного вÑÑажениÑ. СпиÑок вÑбоÑки Ñакже Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑпиÑок вÑÑажений знаÑÐµÐ½Ð¸Ñ ÑеÑез запÑÑÑÑ (как опÑеделено в Разделе 4.2). ÐапÑимеÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑпиÑок имÑн ÑÑолбÑов:
SELECT a, b, c FROM ...
Ðмена ÑÑолбÑов a, b и c пÑедÑÑавлÑÑÑ Ð»Ð¸Ð±Ð¾ ÑакÑиÑеÑкие имена ÑÑолбÑов ÑаблиÑ, пеÑеÑиÑленнÑÑ
в пÑедложении FROM, либо иÑ
пÑевдонимÑ, опÑеделÑннÑе как опиÑано в ÐодÑазделе 7.2.1.2. ÐÑоÑÑÑанÑÑво имÑн в ÑпиÑке вÑбоÑки Ñо же, ÑÑо и в пÑедложении WHERE, еÑли не иÑполÑзÑеÑÑÑ Ð³ÑÑппиÑовка. РпÑоÑивном ÑлÑÑае оно ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¿ÑоÑÑÑанÑÑвом имÑн пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ HAVING.
ÐÑли ÑÑÐ¾Ð»Ð±ÐµÑ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм именем еÑÑÑ Ð² неÑколÑÐºÐ¸Ñ ÑаблиÑÐ°Ñ , Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ñакже ÑказаÑÑ Ð¸Ð¼Ñ ÑаблиÑÑ, напÑÐ¸Ð¼ÐµÑ Ñак:
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...
ÐбÑаÑаÑÑÑ Ðº неÑколÑким ÑаблиÑам, бÑÐ²Ð°ÐµÑ Ñдобно полÑÑиÑÑ ÑÑÐ°Ð·Ñ Ð²Ñе ÑÑолбÑÑ Ð¾Ð´Ð½Ð¾Ð¹ из ÑаблиÑ:
SELECT tbl1.*, tbl2.a FROM ...
ÐодÑобнее запиÑÑ Ð¸Ð¼Ñ_ÑаблиÑÑ.* опиÑÑваеÑÑÑ Ð² ÐодÑазделе 8.16.5.
ÐÑли в ÑпиÑке вÑбоÑки иÑполÑзÑеÑÑÑ Ð¾Ð±ÑÑное вÑÑажение знаÑениÑ, по ÑÑÑи пÑи ÑÑом в возвÑаÑаемÑÑ ÑаблиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑеÑÑÑ Ð½Ð¾Ð²Ñй виÑÑÑалÑнÑй ÑÑолбеÑ. ÐÑÑажение знаÑÐµÐ½Ð¸Ñ Ð²ÑÑиÑлÑеÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки ÑезÑлÑÑаÑа Ñо знаÑениÑми ÑÑолбÑов в данной ÑÑÑоке. ХоÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² ÑпиÑке вÑбоÑки не обÑзаÑелÑно Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑÑолбÑам ÑаблиÑного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FROM; они могÑÑ ÑодеÑжаÑÑ, напÑÐ¸Ð¼ÐµÑ Ð¸ пÑоÑÑÑе аÑиÑмеÑиÑеÑкие вÑÑажениÑ.
7.3.2. ÐеÑки ÑÑолбÑов
ÐлеменÑам в ÑпиÑке вÑбоÑки можно назнаÑиÑÑ Ð¸Ð¼ÐµÐ½Ð° Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑей обÑабоÑки, напÑимеÑ, Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð² пÑедложении ORDER BY или Ð´Ð»Ñ Ð²Ñвода в клиенÑÑком пÑиложении. ÐапÑимеÑ:
SELECT a AS value, b + c AS sum FROM ...
ÐÑли вÑÑ
одное Ð¸Ð¼Ñ ÑÑолбÑа не опÑеделено (Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ AS), ÑиÑÑема назнаÑÐ°ÐµÑ Ð¸Ð¼Ñ Ñама. ÐÐ»Ñ Ð¿ÑоÑÑÑÑ
ÑÑÑлок на ÑÑолбÑÑ ÑÑим именем ÑÑановиÑÑÑ Ð¸Ð¼Ñ Ñелевого ÑÑолбÑа, а Ð´Ð»Ñ Ð²Ñзовов ÑÑнкÑий ÑÑо Ð¸Ð¼Ñ ÑÑнкÑии. ÐÐ»Ñ ÑложнÑÑ
вÑÑажений ÑиÑÑема генеÑиÑÑÐµÑ Ð½ÐµÐºÐ¾ÑоÑое подÑ
одÑÑее имÑ.
Слово AS можно опÑÑÑиÑÑ, но ÑолÑко еÑли Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑÑолбÑа не ÑвлÑеÑÑÑ ÐºÐ»ÑÑевÑм Ñловом Postgres Pro (Ñм. ÐÑиложение C). Ðо избежание ÑлÑÑайного ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ñ ÐºÐ»ÑÑевÑм Ñловом ÑÑо Ð¸Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ заклÑÑиÑÑ Ð² кавÑÑки. ÐапÑимеÑ, VALUE â клÑÑевое Ñлово, поÑÑÐ¾Ð¼Ñ Ñакой ваÑÐ¸Ð°Ð½Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑабоÑаÑÑ:
SELECT a value, b + c AS sum FROM ...
а Ñакой бÑдеÑ:
SELECT a "value", b + c AS sum FROM ...
ÐÐ»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑликÑа Ñ ÐºÐ»ÑÑевÑми Ñловами, коÑоÑÑе могÑÑ Ð¿Ð¾ÑвиÑÑÑÑ Ð² бÑдÑÑем, ÑекомендÑеÑÑÑ Ð²Ñегда пиÑаÑÑ AS или заклÑÑаÑÑ Ð¼ÐµÑки вÑÑ
однÑÑ
ÑÑолбÑов в кавÑÑки.
ÐÑимеÑание
Ðменование вÑÑ
однÑÑ
ÑÑолбÑов оÑлиÑаеÑÑÑ Ð¾Ñ Ñого, ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² пÑедложении FROM (Ñм. ÐодÑаздел 7.2.1.2). Ðдин ÑÑÐ¾Ð»Ð±ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑеименоваÑÑ Ð´Ð²Ð°Ð¶Ð´Ñ, но на вÑÑ
оде окажеÑÑÑ Ð¸Ð¼Ñ, назнаÑенное в ÑпиÑке вÑбоÑки.
7.3.3. DISTINCT
ÐоÑле обÑабоÑки ÑпиÑка вÑбоÑки в ÑезÑлÑÑиÑÑÑÑей ÑаблиÑе можно дополниÑелÑно иÑклÑÑиÑÑ Ð´ÑблиÑÑÑÑиеÑÑ ÑÑÑоки. ÐÐ»Ñ ÑÑого ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле SELECT добавлÑеÑÑÑ ÐºÐ»ÑÑевое Ñлово DISTINCT:
SELECT DISTINCT ÑпиÑок_вÑбоÑки ...
(ЧÑÐ¾Ð±Ñ Ñвно вклÑÑиÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ по ÑмолÑаниÑ, когда возвÑаÑаÑÑÑÑ Ð²Ñе ÑÑÑоки, вмеÑÑо DISTINCT можно ÑказаÑÑ ÐºÐ»ÑÑевое Ñлово ALL.)
Ðве ÑÑÑоки ÑÑиÑаÑÑÑÑ ÑазнÑми, еÑли они ÑодеÑÐ¶Ð°Ñ ÑазлиÑнÑе знаÑÐµÐ½Ð¸Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ñм в одном ÑÑолбÑе. ÐÑи ÑÑом знаÑÐµÐ½Ð¸Ñ NULL полагаÑÑÑÑ ÑавнÑми.
ÐÑоме Ñого, можно Ñвно опÑеделиÑÑ, какие ÑÑÑоки бÑдÑÑ ÑÑиÑаÑÑÑÑ ÑазлиÑнÑми, ÑледÑÑÑим обÑазом:
SELECT DISTINCT ON (вÑÑажение[,вÑÑажение...])ÑпиÑок_вÑбоÑки...
ÐдеÑÑ Ð²ÑÑажение â обÑÑное вÑÑажение знаÑениÑ, вÑÑиÑлÑемое Ð´Ð»Ñ Ð²ÑеÑ
ÑÑÑок. СÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
пеÑеÑиÑленнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°ÑÑ Ð¾Ð´Ð¸Ð½ ÑезÑлÑÑаÑ, ÑÑиÑаÑÑÑÑ Ð´ÑблиÑÑÑÑимиÑÑ Ð¸ возвÑаÑаеÑÑÑ ÑолÑко пеÑÐ²Ð°Ñ ÑÑÑока из Ñакого набоÑа. ÐамеÑÑÑе, ÑÑо «пеÑÐ²Ð°Ñ ÑÑÑока» набоÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой, еÑли ÑолÑко запÑÐ¾Ñ Ð½Ðµ вклÑÑÐ°ÐµÑ ÑоÑÑиÑовкÑ, гаÑанÑиÑÑÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑнÑй поÑÑдок ÑÑÑок, поÑÑÑпаÑÑиÑ
в ÑилÑÑÑ DISTINCT. (ÐбÑабоÑка DISTINCT ON пÑоизводиÑÑÑ Ð¿Ð¾Ñле ÑоÑÑиÑовки ORDER BY.)
ÐÑедложение DISTINCT ON не опиÑано в ÑÑандаÑÑе SQL и иногда его пÑименение ÑÑиÑаеÑÑÑ Ð¿Ð»Ð¾Ñ
им ÑÑилем из-за возможной неопÑеделÑнноÑÑи в ÑезÑлÑÑаÑаÑ
. ÐÑи ÑазÑмном иÑполÑзовании GROUP BY и подзапÑоÑов во FROM можно обойÑиÑÑ Ð±ÐµÐ· ÑÑой конÑÑÑÑкÑии, но ÑаÑÑо она бÑÐ²Ð°ÐµÑ Ñдобнее.