SQL Server

Bir sualın digər sual daxilində yerləşdirilməsi

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.