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 EXISTSoperatorunun ə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 ANY və ALL operatorlarının istifadəsi olacaq. Bizim SQL-im imkanlarından istifadəmiz yavaş-yavaş sona yaxınlaşır.