Ba'zan bitta so'rovni yozish uchun avval boshqa bir savolga javob olishimiz kerak bo'ladi. Masalan: "narxi o'rtacha narxdan yuqori bo'lgan mahsulotlarni top". Buning uchun avval o'rtacha narx qancha ekanini bilishimiz lozim — bu esa alohida bir hisob.
Mana shu yerda quyi so'rov (subquery) yordam beradi. Quyi so'rov — bu so'rov ichidagi so'rov. Uni qavs ( ) ichiga yozamiz, va u avval ishlab, o'z natijasini chiqaradi. Keyin tashqi so'rov shu natijadan foydalanadi.
Misollar uchun mahsulotlar jadvalidan foydalanamiz:
| 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 |
Aytaylik, biz narxi o'rtachadan qimmat mahsulotlarni topmoqchimiz. Birinchi fikr shunday bo'lishi mumkin:
SELECT nomi, narx FROM mahsulotlar WHERE narx > AVG(narx);Lekin bu ishlamaydi. Sababi — WHERE har bir qatorni alohida tekshiradi, AVG(narx) esa butun jadval bo'yicha hisoblanadigan agregat. Ularni shu tarzda to'g'ridan-to'g'ri aralashtirib bo'lmaydi.
Bizga avval o'rtacha narxni alohida hisoblab, keyin uni WHERE da ishlatish kerak.
O'rtacha narxni biz allaqachon hisoblay olamiz:
SELECT AVG(narx) FROM mahsulotlar;Natija — bitta qator, bitta ustun, ya'ni yagona qiymat:
2301375.0Bitta qiymat qaytaradigan quyi so'rov skalyar quyi so'rov (scalar subquery) deb ataladi. Aynan shunday quyi so'rovni WHERE ichida son o'rnida ishlatish mumkin.
Endi yuqoridagi SELECT AVG(narx) FROM mahsulotlar so'rovini qavs ichiga olib, WHERE dagi son o'rniga qo'yamiz:
SELECT nomi, narx
FROM mahsulotlar
WHERE narx > (SELECT AVG(narx) FROM mahsulotlar);Bu so'rov ikki bosqichda ishlaydi:
(SELECT AVG(narx) FROM mahsulotlar) → 2301375.0.WHERE narx > 2301375.0.Ya'ni ma'lumotlar bazasi so'rovni xuddi shunday "o'qiydi":
SELECT nomi, narx FROM mahsulotlar WHERE narx > 2301375.0;Bu shartga faqat ikkita mahsulot mos keladi — narxi 5 000 000 va 12 000 000 bo'lganlari. Natijani tartibga solish uchun ORDER BY narx qo'shamiz:
SELECT nomi, narx
FROM mahsulotlar
WHERE narx > (SELECT AVG(narx) FROM mahsulotlar)
ORDER BY narx;Natija:
Telefon|5000000
Noutbuk|12000000Muhim: Quyi so'rov skalyar (bitta qiymat) qaytargandagina uni
>,<,=kabi taqqoslashlar bilan ishlatish mumkin.(SELECT AVG(narx) ...)doim bitta son qaytargani uchun bu yerda mukammal mos keladi.
E'tibor bering: biz hech qayerga 2301375.0 sonini qo'lda yozmadik. Agar ertaga jadvalga yangi mahsulot qo'shilsa yoki narxlar o'zgarsa, o'rtacha narx ham o'zgaradi — va bizning so'rovimiz avtomatik yangi o'rtachaga moslashadi. Biz hech narsani qayta hisoblab o'tirmaymiz.
Eslatma: So'rov bir nechta qator qaytarsa, tartibi kafolatlanmaydi. Shuning uchun natijani aniq ko'rsatmoqchi bo'lsangiz, doim
ORDER BYdan foydalaning.
Pastdagi kod oynasida mahsulotlar jadvali allaqachon yaratilgan va to'ldirilgan. Sizning vazifangiz — narxi barcha mahsulotlarning o'rtacha narxidan yuqori bo'lgan mahsulotlarning nomi va narxini chiqarish. O'rtacha narxni WHERE ichidagi quyi so'rovda hisoblang va natijani narx bo'yicha o'sish tartibida tartiblang.