7.5. СоÑÑиÑовка ÑÑÑок (ORDER BY)
ÐоÑле Ñого как запÑÐ¾Ñ Ð²Ñдал ÑаблиÑÑ ÑезÑлÑÑаÑов (поÑле обÑабоÑки ÑпиÑка вÑбоÑки), ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ оÑÑоÑÑиÑоваÑÑ. ÐÑли ÑоÑÑиÑовка не задана, ÑÑÑоки возвÑаÑаÑÑÑÑ Ð² неопÑеделÑнном поÑÑдке. ФакÑиÑеÑкий поÑÑдок ÑÑÑок в ÑÑом ÑлÑÑае бÑÐ´ÐµÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ Ð¿Ð»Ð°Ð½Ð° ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ ÑканиÑованиÑ, а Ñакже Ð¾Ñ Ð¿Ð¾ÑÑдка даннÑÑ Ð½Ð° диÑке, поÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑÑÑ Ð½Ð° него нелÑзÑ. ÐпÑеделÑннÑй поÑÑдок вÑводимÑÑ ÑÑÑок гаÑанÑиÑÑеÑÑÑ, ÑолÑко еÑли ÑÑап ÑоÑÑиÑовки задан Ñвно.
ÐоÑÑдок ÑоÑÑиÑовки опÑеделÑÐµÑ Ð¿Ñедложение ORDER BY:
SELECTÑпиÑок_вÑбоÑкиFROMÑаблиÑное_вÑÑажениеORDER BYвÑÑажение_ÑоÑÑиÑовки1[ASC | DESC] [NULLS { FIRST | LAST }] [,вÑÑажение_ÑоÑÑиÑовки2[ASC | DESC] [NULLS { FIRST | LAST }] ...]
ÐÑÑажениÑми ÑоÑÑиÑовки могÑÑ Ð±ÑÑÑ Ð»ÑбÑе вÑÑажениÑ, допÑÑÑимÑе в ÑпиÑке вÑбоÑки запÑоÑа. ÐапÑимеÑ:
SELECT a, b FROM table1 ORDER BY a + b, c;
Ðогда ÑказÑваеÑÑÑ Ð½ÐµÑколÑко вÑÑажений, поÑледÑÑÑие знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð¾ÑÑоÑÑиÑоваÑÑ ÑÑÑоки, в коÑоÑÑÑ
Ñовпали вÑе пÑедÑдÑÑие знаÑениÑ. Ðаждое вÑÑажение можно дополниÑÑ ÐºÐ»ÑÑевÑми Ñловами ASC или DESC, коÑоÑÑе вÑбиÑаÑÑ ÑоÑÑиÑÐ¾Ð²ÐºÑ ÑооÑвеÑÑÑвенно по возÑаÑÑÐ°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ÑбÑваниÑ. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑинÑÑ Ð¿Ð¾ÑÑдок по возÑаÑÑÐ°Ð½Ð¸Ñ (ASC). ÐÑи ÑоÑÑиÑовке по возÑаÑÑÐ°Ð½Ð¸Ñ ÑнаÑала идÑÑ Ð¼ÐµÐ½ÑÑие знаÑениÑ, где понÑÑие «менÑÑе» опÑеделÑеÑÑÑ Ð¾Ð¿ÐµÑаÑоÑом <. ÐодобнÑм обÑазом, ÑоÑÑиÑовка по возÑаÑÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÑеделÑеÑÑÑ Ð¾Ð¿ÐµÑаÑоÑом >. [6]
ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÐµÑÑа знаÑений NULL можно иÑполÑзоваÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ NULLS FIRST и NULLS LAST, коÑоÑÑе помеÑаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL ÑооÑвеÑÑÑвенно до или поÑле знаÑений не NULL. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL ÑÑиÑаÑÑÑÑ Ð±Ð¾Ð»ÑÑе лÑбÑÑ
дÑÑгиÑ
, Ñо еÑÑÑ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ NULLS FIRST Ð´Ð»Ñ Ð¿Ð¾ÑÑдка DESC и NULLS LAST в пÑоÑивном ÑлÑÑае.
ÐамеÑÑÑе, ÑÑо поÑÑдки ÑоÑÑиÑовки опÑеделÑÑÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа. ÐапÑимеÑ, ORDER BY x, y DESC ознаÑÐ°ÐµÑ ORDER BY x ASC, y DESC, и ÑÑо не Ñо же Ñамое, ÑÑо ORDER BY x DESC, y DESC.
ÐдеÑÑ Ð²ÑÑажение_ÑоÑÑиÑовки Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÑкой ÑÑолбÑа или номеÑом вÑводимого ÑÑолбÑа, как в данном пÑимеÑе:
SELECT a + b AS sum, c FROM table1 ORDER BY sum; SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;
Ðба ÑÑи запÑоÑа ÑоÑÑиÑÑÑÑ ÑезÑлÑÑÐ°Ñ Ð¿Ð¾ пеÑÐ²Ð¾Ð¼Ñ ÑÑолбÑÑ. ÐамеÑÑÑе, ÑÑо Ð¸Ð¼Ñ Ð²Ñводимого ÑÑолбÑа должно оÑÑаваÑÑÑÑ Ñамо по Ñебе, его нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð² вÑÑажении. ÐапÑимеÑ, ÑÑо оÑибка:
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- непÑавилÑно
ÐÑо огÑаниÑение позволÑÐµÑ ÑменÑÑиÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑÑ. Тем не менее неоднознаÑноÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°, когда в ORDER BY Ñказано пÑоÑÑое имÑ, но оно ÑооÑвеÑÑÑвÑÐµÑ Ð¸ имени вÑÑ
одного ÑÑолбÑа, и ÑÑолбÑÑ Ð¸Ð· ÑаблиÑного вÑÑажениÑ. Ð ÑÑом ÑлÑÑае иÑполÑзÑеÑÑÑ Ð²ÑÑ
одной ÑÑолбеÑ. ÐÑа ÑиÑÑаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ, ÑолÑко когда Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ AS вÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ Ð½Ð°Ð·Ð½Ð°ÑаеÑÑÑ Ñо же имÑ, ÑÑо Ð¸Ð¼ÐµÐµÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ð² дÑÑгой ÑаблиÑе.
ORDER BY можно пÑимениÑÑ Ðº ÑезÑлÑÑаÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñии UNION, INTERSECT и EXCEPT, но в ÑÑом ÑлÑÑае возможна ÑоÑÑиÑовка ÑолÑко по номеÑам или именам ÑÑолбÑов, но не по вÑÑажениÑм.
[6] Ðа деле Postgres Pro опÑеделÑÐµÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки Ð´Ð»Ñ ASC и DESC по клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа B-деÑева по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñипа даннÑÑ
вÑÑажениÑ. ÐбÑÑно ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑоздаÑÑÑÑ Ñак, ÑÑо ÑÑÐ¾Ð¼Ñ Ð¿Ð¾ÑÑÐ´ÐºÑ ÑооÑвеÑÑÑвÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ < и >, но возможно ÑазÑабоÑаÑÑ ÑобÑÑвеннÑй Ñип даннÑÑ
, коÑоÑÑй бÑÐ´ÐµÑ Ð²ÐµÑÑи ÑÐµÐ±Ñ Ð¿Ð¾-дÑÑгомÑ.