EXISTS operatorunun istifadə olunması

Alt sorğularla işi bitirdikdən sonra indi yalnız alt sorğuların arqumentlər kimi istifadə etdiyi operatorların öyrənilməsinə keçmək vaxtıdır və EXISTS operatorundan başlayaq.

EXISTS operatoru alt sorğunu arqument kimi götürür və əgər alt sorğu hanısa bir sətiri qaytarırsa - doğru, əks halda yanlış qiymət alır. Məs, biz heç olmazsa bir cədvəldən sifarişçisi Moskvadan olan məlumatları seçə bilərik.

	SELECT cnum, cname, city
	FROM Customers
	WHERE EXISTS (
	   SELECT *
	   FROM Customers
	   WHERE city = 'Москва'
	)

Nəticə:

	cnum  cname                             city
	----- --------------------------------- ---------
	2001  ТОО Рога и копыта                 Москва
	2002  AО Бендер и К                     Одесса
	2003  Фирма ХХХ                         Рязань
	2004  Концерн "Дети лейтенанта Шмидта"  Бобруйск
	2006  Clemens                           Лондон
	2007  ОАО "ООО"                         ТОМСК
	2008  ОАО "Валют-транзит"               Караганда

Daxili sorğu Moskvadan olan sifarişçilərin bütün məlumatlarını seçir. EXISTS operatoru yoxlayır ki daxili sorğu heç ilmasa bir nəticə verdi və şərt doğrudur. Alt sorğu xarici sorğu üçün yalnız bir dəfə realizə olunuz və bütün hallarda eyni qiymət alır Ona görə də EXISTS bu cür istifadə edilərkən eyni vaxtda şərti sətirlər üçün doğru və ya yalnış edir.

Bağlanmış alt sorğularda EXISTS təklifi xarici sorğuda adları qeyd olunmuş cədvəlin hər bir sətiri ümün qiymətləndirilir. Bu EXISTS-ə əsas sorğuda qeyd olunmuş nəticələri cədvəlin hər bir sətiri üçün müxtəlif cavablar kimi istifadə etmək imkanı verir. Məs, biz bir necə sifarişçisi olan ticarət agentlərini çıxara bilərik.

	SELECT DISTINCT snum
	FROM Customers couter
	WHERE EXISTS (
	   SELECT *
	   FROM Customers cinner
	   WHERE cinner.snum = couter.snum
	      AND cinner.cnum <> couter.cnum
	)

Nəticə:

	snum
	-----------
	1001
	1002

Xarici sorğunun hər bir namizəd satiri üçün (Cari vaxtda sifarişçi göstərməni yoxlayan), daxili sorğu snum (agentin malik olduğu) sətiri ilə üst-üstə düşən, lakin cnum (digər sifarişçiyə aid olan) ilə düçməyən sətirlər tapır. Əgər belə sətirlər daxili sorğu vastəsi ilə tapılıbsa, onda bu o deməkdir ki, bir satıcı tərəfindən xidmət edilən iki sifarişçi var. Elə buna görə EXISTS cari sətir və satıcı (snum) üçün doğru cavab verəcək. Əgər DISTINCT istifadə olunmasaydı, onda bu satıcılardan hər biri onların sifarişçilərinin sayı qədər seçiləcək.

Bu agentlər haqqında yalnız onların adları yox, həmçinin hər tərəfli məlumat verilsə idi yaxşı olardı. Bunu sifarişçilər cədvəlini agentlər cədvəli ilə birləşdirməklə etmək olar:

SELECT DISTINCT first.snum, first.sname, first.city
FROM Salespeople first, Customers second
WHERE EXISTS (
   SELECT *
   FROM Customers third
   WHERE second.snum = third.snum
      AND second.cnum <> third.cnum)
   AND first.snum = second.snum

Nəticə:

snum  sname   city
----- ------- ----------
1001  Иванов  Москва
1002  Петров  Хабаровск

Daxili sorğu əvvəlki üsuldakı kimidir - xarici sorğu agentlər cədvəli ilə sifarişçilər cədvəlinin birləşməsidir.
Əvvəlki nümunə göstərdi ki, EXISTS operatorunu məntiqi operatorlar ilə də istifadə etmək olar. Bu cür istifadələrdən ən sadəsi NOT operatorunun istifadəsidir - görünür EXISTS operatorunun ən qalın üsuludur. Bir sifarişçi ilə olan satıcıların tapılmasının bir üsulu da əvvəlki sorğunun invertisiyasından ibarətdir:

	SELECT DISTINCT snum
	FROM Customers couter
	WHERE NOT EXISTS (
	   SELECT *
	   FROM Customers cinner
	   WHERE cinner.snum = couter.snum
	      AND cinner.cnum <> couter.cnum
	)

Nəticə:

	snum
	-----------
	1003
	1004
	1007

EXISTS SQL-in sadə operatorudur, lakin adətən istifadə olunur. Növbəti addım ANYALL operatorlarının istifadəsi olacaq. Bizim SQL-im imkanlarından istifadəmiz yavaş-yavaş sona yaxınlaşır.

«« Bağlanmış altsuallar    EXISTS operatorunun istifadə olunması    ANY, ALL operatorlarının istifadə olunması »»
Share


Tərcümə edən: Rəşad Əliyev


YER Hostinq

Pulsuz elanlar saytı

Internet Jobs Database