ORDER BY — SQL natijasidagi satrlarni bir yoki bir nechta ifoda bo‘yicha belgilangan ketma-ketlikda qaytaradigan band. U bo‘lmasa relational database natija tartibini kafolatlamaydi, hatto avvalgi bajarilishlarda satrlar doim bir xil ko‘ringan bo‘lsa ham.
Saralash kalitlari
ASC o‘sish, DESC kamayish tartibini bildiradi; ko‘rsatilmasa odatda ASC qabul qilinadi:
SELECT id, title, created_at
FROM articles
ORDER BY created_at DESC, id DESC;
Birinchi kaliti teng satrlar ikkinchi kalit bilan tartiblanadi. Misoldagi id deterministic tartib yaratadi. Faqat created_at ishlatilsa, ayni vaqtda yaratilgan ikki qatorning o‘zaro joyi noma’lum qolishi mumkin. Barqaror pagination uchun yakuniy kalit odatda noyob bo‘lishi kerak.
Ustun nomi, alias, expression yoki ayrim tizimlarda select ro‘yxatidagi ordinal raqam ishlatilishi mumkin. ORDER BY 2 qisqa, ammo ustunlar tartibi o‘zgarsa ma’nosi sezilmasdan almashadi; aniq nom ishlatish xavfsizroq.
NULL qiymatlar va collation
NULLning birinchi yoki oxirgi kelishi database mahsuloti va sort yo‘nalishiga bog‘liq. Ba’zi tizimlar NULLS FIRST va NULLS LAST sintaksisini beradi. Portativ so‘rovda kerakli xulq CASE ifodasi bilan aniq yozilishi mumkin.
Matn tartibini collation belgilaydi. U katta-kichik harf, aksent, til alifbosi va raqamli belgilarni qanday solishtirishni nazorat qiladi. Binary tartib foydalanuvchi kutgan lug‘aviy tartibdan farq qilishi mumkin. Bir ustunga boshqa collation qo‘llash indexdan foydalanishga ham ta’sir etadi.
Pagination
LIMIT va OFFSET bilan ORDER BY sahifalarni takrorlanadigan qiladi. Lekin katta offset databasega oldingi minglab satrlarni topib tashlab yuborishni talab qiladi. Parallel yozuvlar orasida yangi satr qo‘shilsa, offset pagination qatorni takrorlashi yoki o‘tkazib yuborishi mumkin.
Keyset pagination oxirgi ko‘rilgan sort kalitidan davom etadi:
SELECT id, created_at, title
FROM articles
WHERE (created_at, id) < (:last_time, :last_id)
ORDER BY created_at DESC, id DESC
LIMIT 25;
Bu yondashuv katta jadvalda samaraliroq va o‘zgarayotgan ma’lumotda barqarorroq, ammo istalgan sahifa raqamiga bevosita sakrashni qiyinlashtiradi.
Query planga ta’siri
Mos B-tree index so‘ralgan tartibda satrlarni o‘qib, alohida sort operatsiyasini bekor qilishi mumkin. Composite indexdagi ustun tartibi, filter va sort yo‘nalishi muhim. Index barcha holatda foydali emas: ko‘p satr qaytarilsa optimizer sequential scan va sortni arzonroq deb topishi mumkin.
Saralash xotiraga sig‘masa vaqtinchalik diskdan foydalaniladi. Katta matn yoki murakkab expression bo‘yicha sort CPU va IO xarajatini oshiradi. EXPLAIN query planida sort turi, taxminiy satrlar va spill holati tekshiriladi.
Natija ma’nosi
Ichki subquerydagi ORDER BY tashqi query natijasining tartibini har doim kafolatlamaydi; yakuniy natija uchun eng tashqi queryda sort ko‘rsatiladi. GROUP BY ham saralash o‘rnini bosmaydi. Ranking va moving average kabi hisoblarda window funksiyaning ichki ORDER BYi hisob tartibini belgilaydi, yakuniy ko‘rsatish tartibini esa alohida tashqi ORDER BY boshqaradi.
Tasodifiy qator tanlash uchun ORDER BY RANDOM() butun katta jadvalga random qiymat hisoblab, uni saralashi mumkin. Kichik to‘plamda bu sodda, katta bazada esa qimmat. Sampling imkoniyati, oldindan tanlangan random kalit yoki biznesga mos boshqa usul baholanadi. “Eng so‘nggi” qatorni olishda esa vaqt kaliti bilan birga noyob tie-breaker ishlatiladi.
Bog‘liq tushunchalar
SQL, Result set, Collation, NULL, Pagination, Composite index, Query optimizer, Window function