SQL so‘rovlari bilan ishlashni davom ettiramiz, agar sezayotgan bo‘lsangiz, borgan sari so‘rovlar qiyinlashib bormoqda. Bu maqolamiz so‘rov ichida so‘rov(podzapros) yozishga bag‘ishlanadi, ya’ni bir so‘rov ichida yana bir qism so‘rov ishtirok etadi. Bu maqola uchun bizga quyidagi «test» nomli jadval kerak bo‘ladi. Barcha kodlar Oracle 10g MBBTda sinab ko‘rilgan. Maqolada, asosiy so‘rovga faqat bir qiymatni qaytaradigan qism so‘rov haqida gaplashamiz.

5_1

Keling, avval bu so‘rovlar nima ekanligini bilib olaylik. Misol uchun siz, jadvaldan o‘yinchilarni ismini chiqarmoqchisiz, lekin hammasini emas, qaysiki tug‘ilgan yili biror o‘yinchini yilidan kichik bo‘lsin. Siz hamma o‘yinchilarni yilini bilmaysiz, faqat bittasini ko‘rinishidan kattaligini bilasiz, shu o‘yinchidan kichiklari kerak. Buning uchun biz ikkita so‘rov amalga oshirishimiz kerak, dastlab siz yoshi kattaroq deb o‘ylayotgan o‘yinchini yilini bilish kerak va undan kichkinalarini topib, ekranga chiqarish kerak. Yoshi kichik bo‘lish uchun, tug‘ilgan yili katta bo‘lish kerak.

Select year from test where name='Jonny';

Bu so‘rov natijasini eslab qolib(keling keyingi so‘rov uchun eslab qolgan yilni «aa» deylik),

select name from test where year>aa;

Ko‘rib turganingizdek, 2 ta alohida so‘rov. Qism so‘rovlar shunaqangi ikkita so‘rovlarni birlashtirish uchun ishlatiladi. Qism so‘rovlar, asosiy so‘rovlarga natija yetkazib berish uchun foydalaniladi.

select name, year from test where year>(select year from test where name='Jonny');

5_2

«Jonny»ni yili aniqlanmoqda(1988), undan keyin shu yildan kattalar(yoshi bo‘yicha kichiklar) chiqarilmoqda.

Qism so‘rovga ega so‘rovlar tuzishda barcha solishtirish amallarni(amallar haqida) ishlatish mumkin: teng(=), katta(>), katta yoki teng(>=), kichik(<), kichik yoki teng(<=), teng emas(<>).

Agar jadvaldagi axborotlar murakkab ko‘rinishga ega bo‘lsa, qism so‘rovlarni bir necha bor ishlatish mumkin. Bunda bir necha ustundagi axborotlarga qism so‘rovlar orqali shartlar qo‘yiladi.

select id, name, year from test where id>(select id from test where name='Antonio') and year>(select year from test where name='Jonny');

5_3

So‘rovda, ham «id», ham «year» bo‘yicha qism so‘rov orqali shart qo‘yilmoqda. Bundan ko‘rinib turibdiki, qism so‘rovlarni «like», «and», «or», «not»(operatorlar haqida) singari operatorlar bilan ajratish mumkin ekan.

Endi qism so‘rovlarda guruhlash funksiyalarni(jamlash funksiyalari) ishlatamiz, ya’ni ular: min, max, count, avg, sum. Bu maqolada, faqat «max»ni misol qilib ko‘rsataman.

select ID, name, year from test where year=(select max(year)-1 from test);

5_4

Qism so‘rovdan eng kichik yoshdagi o‘yinchidan bir yosh kattasi aniqlashtirib olinmoqda va asosiy so‘rovda shu o‘yinchi haqida ma’lumot chiqarilmoqda. Guruhli funksiyalarni, shart qo‘yishda ishlatganda «having» kalit so‘zidan foydalaniladi, chunki «where» kalit so‘zi guruhli funksiyalar bilan ishlay olmaydi, ya’ni

select id, min(id), name from test group by name, id having min(id)>3;

5_5

Agar, «having» o‘rniga «where» ishlatsangiz, xatolik beradi. Bu operatorni qism so‘rovlar tuzishda ham ishlatish mumkin.

select name, max(year) from test group by name having max(year)<(select max(year) from test where year<>1990)3;

5_5

Agar, «having» o‘rniga «where» ishlatsangiz, xatolik beradi. Bu operatorni qism so‘rovlar tuzishda ham ishlatish mumkin.

select name, max(year) from test group by name having max(year);

5_6

Eng katta yil(yoshi bo‘yicha eng kichik)da tug‘ilgan o‘yinchi qidirilmoqda, faqat uning tug‘ilgan yili «1990» yilga teng bo‘lishi kerak emas. Bu yerda guruhli funksiya bo‘lgani uchun, bir nechta natijalar chiqmoqda. Biz ko‘rayotgan jadval, bu misol uchun unchalik mos tushmadi, chunki bir hil axborotlardan bir nechtasi jadvalda mavjud bo‘lsa, so‘rov chiroyliroq chiqadi, lekin so‘rov tuzilishini shu jadval asosida ham tushunib olish mumkin.

Agar, qism so‘rovdan hech narsa qaytmasa, asosiy so‘rovda xatolik bermaydi, lekin hech qanday axborot ham chiqmaydi. Agar, qism so‘rovdan boshqa tipdagi qiymat chiqsa, unda xatolik haqida ma’lumot beriladi.

select name, id from test where year=(select year from test where name='Akmal');

Xatolik mavjud emas, faqat «no rows selected» yozuv.

select name, id from test where year=(select name from test where name='Jonny');

Xatolik, «error: invalid number«.