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:

  1. O’rtacha narxni hisoblash.
  2. 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:

SQL · namuna baza

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:

  1. O’rtacha narxni AVG(narx) bilan toping;
  2. shu qiymatni ichki so’rov qilib, undan qimmat mahsulotlarni chiqaring;
  3. IN bilan ichki so’rov yozing: buyurtma qilingan mahsulotlar;
  4. NOT IN bilan hech kim buyurtma qilmagan mahsulotlarni toping;
  5. 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 (masalan AVG).
  • Ro’yxat qaytarsa — IN yoki NOT IN bilan 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.

Bu dars foydali bo'ldimi?

marta ko'rildi