Bir sualın digər sual daxilində yerləşdirilməsi
Sualları digər sualların köməkliyi ilə idarə etmək olar. Bu biz sorğunun şərti yerinə digər sorğunun yerləşdirilməsinə və doğru və ya yalnış şərtlər vastəsi ilə olunur.
Adətən daxili sualın qiyməti, xarici sorğunun doğru olub-olmadığını yoxlayıb realizə edir. Məs: biz ticarət agentinin adını - 'Сидоров' bilirik, lakin onun kodunu bilmirik (snum), və onun Sifarişçilər (Orders) cədvəlindən olan bütün sifarişlərinin almaq istəyiri.
SELECT * FROM Orders WHERE snum = ( SELECT snum FROM Salespeople WHERE sname = 'Сидоров' )
Xarici sorğunu (əsas) realizə etmək üçüç, əvvəlcə WHERE təklifinin daxilində olan daxili (alt sorğu) sorğu realizə olunur. Alt sual realizə olunarkən sname sətiri 'Сидоров' alan Salespeople cədvəlinə baxılır və sonra snum -in qiyməti hesablanır. Yeganə sətir snum = 1004 olacaq. Sonra alınmış nəticə əsas sorğunun şərtində yerləşdirilir, belə ki çərtdə belə olacaq.
WHERE snum = 1004
Sonra əsas sorğunun nəticəsi açağıdakı kimi olacaq:
ONUM ODATE AMT CNUM SNUM ----- ------------------------ ---------- ------ ----- 3002 1999-10-03 00:00:00.000 1900.1000 2007 1004
Alt sorğularda müqayisə əməliyyatlarını (kiçik, böyük, bərabər, fərqli və s.) apararkən siz əmin olmalısınız ki nəticə bir də yalnız bir cavab qaytaracaq. Əgər sizin alt sual heç bir nəticə verməzsə, onda əsas sorğuda heç bir nəticə verməyəcək.
Əgər siz bir neçə cavab qaytaran alt suallardan istifadə etmək istəyirsinizsə onda IN operatorunu istifadə etmək lazımdır. Yadınızdadırsa bu operator mümkün qiymətlər çoxluğunu təyin edir, o alt sorğularda istifadə edilərkən alt sorğunu qaytaran qiymət realizə olunur. Moskvadan olan agentin bütün sifarişçilərini tapaq.
SELECT * FROM Orders WHERE snum IN ( SELECT snum FROM Salespeople WHERE city = 'Москва' )
Nəticə:
ONUM ODATE AMT CNUM SNUM ----- ------------------------ ---------- ----- ----- 3003 1999-10-03 00:00:00.000 767.1900 2001 1001 3008 1999-10-05 00:00:00.000 4723.0000 2006 1001 3011 1999-10-06 00:00:00.000 9891.8800 2006 1001
Verilmiş halda alt sualın istifadə olunması, uyğunlaşma ilə müqayisədə oxunma və realizənin asanlaşdırır:
SELECT Orders.* FROM Orders, Salespeople WHERE Orders.snum = Salespeople.snum AND Salespeople.city = 'Москва'
Bu sorğunun əvvəlkinə ekvivalent olmasına baxmayaraq, SQL Server hər bir iki cədvəldək ibarət olan sətirlərin mümkün kombinasiyasına baxacaq və onlardan uyğunlarını yoxlayacaq. Ən sadəsi cədvəldən ticarət agentləri və onların kodlarını çıxartmalı və onların sifarişçilər cədvəlində axtarmalı. Əslində icrada uduş yoxdur, belə ki qurulmuş SQL Server-də sualların optimizatoru son sorğunu alt sorğu ilə olan formaya ötürəcək.
Bütün yuxarıda qeyd olunmuş alt sorğuları onların bir sütunu seşmələri birləşdirir. Bu vacibdir, belə ki onların nəticəsi eyni qiymətlə müqayisə edilir. SELECT * tipli əmrlərin alt sorğularda istifadəsi qadağandır.
Alt sorğuları həmçinin HAVING təkliflərində də isdifadə etmək olar. Bu alt sorğular özlərinin xüsusi təklifləri olan GROUP BY və HAVING təkliflərini istifadə edə bilərlər. Növbəti sorğu buna nümunədir:
SELECT rating, COUNT( DISTINCT cnum ) FROM Customers GROUP BY rating HAVING rating > ( SELECT AVG( rating ) FROM Customers WHERE city = 'Москва' )
Bu əmr Moskvada olan və orta reytinqdən yüksək olan sifarişçiləri sayır. Nəticə:
rating ------- -- 200 2 300 2
İndi siz düzəlmiş alt sorğulardan bilirsiniz. Bu mexanizm verilənlərin seçilməsi imkanını artırır.