SQL subquery — so'rov ichidagi so'rov
Ba’zan bitta so’rov yetmaydi: avval bir narsani hisoblab, keyin o’sha natija asosida filtrlash kerak bo’ladi. Masalan “o’rtacha narxdan qimmat mahsulotlar”. O’rtacha narxni oldindan bilmaymiz — uni ham so’rov chiqaradi. Shu yerda subquery (ichki so’rov) ish beradi: bitta so’rov ichiga ikkinchisini joylaymiz.
Muammo: ikki qadamli savol
“Narxi o’rtachadan yuqori mahsulotlarni ko’rsat” degan savolda ikki qadam bor:
- O’rtacha narxni hisoblash.
- Har mahsulotni shu qiymat bilan solishtirish.
Buni ikki so’rovga bo’lib qilsa bo’ladi, lekin subquery ikkalasini bitta so’rovga jamlaydi.
Subquery WHERE ichida
Ichki so’rov qavs ichida yoziladi va avval u hisoblanadi, keyin natijasi tashqi so’rovga beriladi:
SELECT nom, narx
FROM mahsulotlar
WHERE narx > (SELECT AVG(narx) FROM mahsulotlar);
O’zingiz ishga tushirib ko’ring — so’rovni tahrirlashingiz ham mumkin:
Bu yerda (SELECT AVG(narx) FROM mahsulotlar) avval ishlaydi va 10375 ni
qaytaradi. So’ng tashqi so’rov narx > 10375 shartini tekshiradi:
| nom | narx |
|---|---|
| Sut | 12000 |
| Choy | 15000 |
| Banan | 14000 |
| Guruch | 18000 |
Diqqat: AVG natijasini qo’lda yozib qo’ymadik. Ertaga narxlar o’zgarsa,
so’rov o’zi qayta hisoblaydi — mana shu subquery’ning qulayligi.
Subquery IN bilan
Ichki so’rov bitta qiymat emas, ro’yxat qaytarganda
IN bilan ishlatiladi. Masalan, kamida bitta buyurtma
bergan mijozlarni topamiz:
SELECT ism
FROM mijozlar
WHERE id IN (SELECT mijoz_id FROM buyurtmalar);
Ichki so’rov buyurtma bergan mijozlar ro’yxatini (1, 2, 3) qaytaradi,
tashqi so’rov esa shu id li mijozlarni ko’rsatadi:
| ism |
|---|
| Aziz |
| Dilnoza |
| Bobur |
Malika ro’yxatda yo’q, chunki uning buyurtmasi yo’q.
Amaliy mashq
Ichki so’rov yozing:
- O’rtacha narxni
AVG(narx)bilan toping; - shu qiymatni ichki so’rov qilib, undan qimmat mahsulotlarni chiqaring;
INbilan ichki so’rov yozing: buyurtma qilingan mahsulotlar;NOT INbilan hech kim buyurtma qilmagan mahsulotlarni toping;- ichki so’rovni alohida ishga tushirib, nima qaytarishini ko’ring.
5-qadam ichki so’rovni tushunishning eng oson yo’li.
Qisqacha xulosa
- Subquery — qavs ichidagi
SELECT; avval u, keyin tashqi so’rov ishlaydi. - Bitta qiymat qaytarsa —
>,<,=bilan solishtiriladi (masalanAVG). - Ro’yxat qaytarsa —
INyokiNOT INbilan ishlatiladi. - Subquery hisoblangan qiymatni qo’lda yozib qo’yishdan qutqaradi — so’rov o’zi qayta hisoblaydi.
Keyingi darsda primary key va foreign key — jadvallarni ishonchli bog’lab turadigan kalitlarni ko’ramiz.