Oldingi darslarda biz natijani ORDER BY bilan tartiblashni o'rgandik. Lekin ko'pincha bizga barcha qatorlar emas, faqat bir nechtasi kerak bo'ladi. Masalan: "eng qimmat 3 ta mahsulot", "eng yangi 5 ta buyurtma" yoki "ro'yxatning birinchi sahifasi". Aynan shu holatlar uchun SQL bizga LIMIT va OFFSET vositalarini beradi.
Quyidagi misollarda mahsulotlar jadvali bilan ishlaymiz:
| id | nomi | kategoriya | narx | ombor |
|---|---|---|---|---|
| 1 | Telefon | Elektronika | 5000000 | 10 |
| 2 | Noutbuk | Elektronika | 12000000 | 5 |
| 3 | Quloqchin | Elektronika | 300000 | 50 |
| 4 | Kitob | Kitoblar | 50000 | 100 |
| 5 | Daftar | Kanstovar | 8000 | 200 |
| 6 | Ruchka | Kanstovar | 3000 | 500 |
| 7 | Stol | Mebel | 800000 | 15 |
| 8 | Stul | Mebel | 250000 | 40 |
LIMIT so'rov natijasida chiqadigan qatorlar sonini cheklaydi. So'rovning oxiriga LIMIT va undan keyin nechta qator kerakligini yozamiz.
Masalan, jadvaldan faqat birinchi 3 ta mahsulot nomini olaylik:
SELECT nomi FROM mahsulotlar LIMIT 3;Natija:
Telefon
Noutbuk
QuloqchinSo'rov 8 ta qator topsa ham, LIMIT 3 faqat birinchi 3 tasini qaytaradi.
Muhim:
LIMITo'zicha qaysi qatorlar "birinchi" ekanini kafolatlamaydi. Yuqoridagi misolda tasodifanidtartibida chiqdi, lekin ma'lumotlar bazasi boshqa tartibda ham qaytarishi mumkin. Shuning uchunLIMITni deyarli har doimORDER BYbilan birga ishlatish kerak.
LIMIT ning asl kuchi ORDER BY bilan birga ochiladi. Avval qatorlarni biror ustun bo'yicha tartiblaymiz, keyin LIMIT bilan boshidan kerakli sonini olamiz. Shunday qilib eng katta yoki eng kichik N ta qatorni topish mumkin.
Masalan, eng arzon 3 ta mahsulotning nomi va narxini olaylik. Buning uchun narx bo'yicha o'sish tartibida tartiblaymiz (ORDER BY narx) va birinchi 3 tasini olamiz:
SELECT nomi, narx FROM mahsulotlar ORDER BY narx LIMIT 3;Natija:
Ruchka|3000
Daftar|8000
Kitob|50000Endi aksincha — eng qimmat mahsulotlarni topamiz. Buning uchun narx bo'yicha kamayish tartibida tartiblaymiz (ORDER BY narx DESC):
SELECT nomi, narx FROM mahsulotlar ORDER BY narx DESC LIMIT 3;Natija:
Noutbuk|12000000
Telefon|5000000
Stol|800000Demak qoida sodda: eng kattalarni topish uchun DESC, eng kichiklarni topish uchun oddiy (o'sish) tartibni qo'llang, so'ng LIMIT N bilan kerakli sonini kesib oling.
Ba'zan birinchi qatorlarni o'tkazib yuborib, keyingilarini olish kerak bo'ladi. Masalan, "eng qimmat mahsulotni emas, undan keyingi 2 tasini ko'rsat". Buning uchun OFFSET ishlatiladi — u boshidan nechta qatorni o'tkazib yuborishni bildiradi.
OFFSET har doim LIMIT bilan birga, undan keyin yoziladi:
SELECT nomi, narx FROM mahsulotlar ORDER BY narx DESC LIMIT 2 OFFSET 1;Bu so'rov narx bo'yicha kamayish tartibida tartiblaydi, boshidagi 1 ta qatorni (eng qimmat — Noutbuk) o'tkazib yuboradi, so'ng keyingi 2 ta qatorni qaytaradi:
Telefon|5000000
Stol|800000OFFSET ni sahifalashda (pagination) qo'llash juda qulay. Masalan, har sahifada 3 tadan mahsulot ko'rsatsak:
LIMIT 3 OFFSET 0 (yoki shunchaki LIMIT 3)LIMIT 3 OFFSET 3LIMIT 3 OFFSET 6Har safar OFFSET ni sahifa kattaligiga ko'paytirib boramiz.
Eslatma:
OFFSETniLIMITsiz yozib bo'lmaydi — u doimoLIMITdan keyin keladi. Sanoq esa noldan boshlanadi:OFFSET 0hech narsani o'tkazmaydi,OFFSET 1birinchi qatorni o'tkazib yuboradi.
mahsulotlar jadvalidan eng qimmat 3 ta mahsulotning nomi va narxini narx bo'yicha kamayish tartibida chiqaring. Buning uchun ORDER BY narx DESC va LIMIT 3 dan foydalaning.