Çoxluqlar üzərində əməllər 4-cü hissə (FULL OUTER JOİN)

Çoxluqlar üzərində əməllər 4-cü hissə (FULL OUTER JOİN)

Salam Dostlar.

Məqalənin sonuncu hissəsində mövzunun davamı olaraq çoxluqlar üzərində əməllər və onların verilənlər bazasında istifadəsi barədə bəhs olunacaq. Məqalənin əvvəlki hissələrində verilənlər bazasında olan cədvəllər arasında münasibətlər qurduq, iki çoxluğun kəsişməsi və fərqi əməliyyatlarını etdik, İNNER JOİN və OUTER JOİN əməliyyatı ilə tanış olduq. Ümumilikdə, çoxluqlar üzərində mövcud olan üç əsas əməllər bizim maraq dairəmizdədir: çoxluqların kəsişməsi, çoxluqların fərqi və çoxluqların birləşməsi. Bu gün çoxluqların birləşməsi barədə danışacağıq.

Bildiyimiz kimi, SQL adətən elementləri cədvəl sətirlərindən ibarət olan mürəkkəb çoxluqlarla işləyir. İki çoxluq arasında münasibət yaradılanda bu çoxluqların elementlərinin atributları müqayisə edilir. Başqa sözlə desək, cədvəlin sətirlərini izah edən sütunlar müqayisə edilir. Riyaziyyatın çoxluqlar nəzəriyyəsini verilənlər bazasında istifadə etmək üçün bir daha təkrar etməliyik: bazada ayrı-ayrı cədvəllər (daha doğrusu münasibətlər) – çoxluqlar, cədvəllərin sətirləri çoxluğun elementləri və cədvəlin sütunları elementlərin atributları adlandırılır. Keçən dərslərimizdən bizə tanış olan təsvirimizə bir daha baxaq (eyni təsvirin məqalənin hər hissəsində təkrar göstərməyimizin məqsədi cədvəlləri çoxluqlar şəklində göstərmək və oxucuda buna vərdiş yaratmaqdır, çünki gələcəkdə SQL-də sorğular qurulan zaman bu olduqca faydalı olacaqdır):

 Staff

Həmin bazada olan cədvəllərin hər biri ilə ayrı-ayrılıqda işləmək olar; məsələn: “Personal” cədvəlindən əməkdaşın ünvanları, adı, soyadı barədə məlumat əldə etmək olar. Lakin elə məlumatlar var ki, iki və ya bir neçə cədvəldən alınır. Məsələn: əməkdaşın çalışdığı departament barədə məlumatı əldə etmək üçün “Personal” və “Department” cədvəlləri arasında münasibət yaratmalıyıq. Həmin cədvəlləri çoxluqlar şəklində təsvir etsək riyaziyyatda olan çoxluqların birləşməsi, kəsişməsi və fərqi əməliyyatlarını həyata keçirə bilərik.

Çoxluqlar üzərində bizi maraqlandıran üçüncü əməl çoxluqların birləşməsi əməlidir.

Çoxluqların birləşməsi.

Tərif. A və B çoxluqlarından heç olmasa birinə daxil olan bü­tün elementlərdən ibarət olan C çoxluğuna bu çoxluqların bir­ləşməsi de­­yi­lir və simvolik olaraq А U В kimi işarə olunur. Başqa sözlə, A və B çoxluqlarından birləşməsi nəticəsində alınan yeni C çoxluğunda hər iki çoxluğun bütünü elementləri daxildir.

Çoxluqların birləşməsini rəqəmlər çoxluqları üzərində göstərək:

Fərz edək ki, A çoxluğu 1,2,3,4 rəqəmlərindən ibarətdir, B çoxluğu isə 3,4,5,6 rəqəmlərindən ibarətdir. Bu iki çoxluğun birləşməsi 1,2,3,4,5,6 rəqəmindən ibarət yeni çoxluq olacaq, çünki 3 və 4 rəqəmləri A çoxluğunda da, B çoxluğunda da var və tam olaraq həm A, həmdə B çoxluğu nəticədə alınan çoxluğa daxildir.

Əgər А={1,2,3,4}, B={3,4,5,6}, onda A U B = {1,2,3,4,5,6}:

 FULL_JOIN1

Yuxarıdakı “Əməkdaşlar” bazasında olan “Personal” mürəkkəb çoxluğunu aşağıdakı şəkildə təsvir edə bilərik:

Fərz edək ki, a, b, c, d, e – “Per_İD, FirstName, LastName, Address, Dep_İD” atributlarıdır  və A çoxluğu həmin atributları olan elementlərdən ibarətdir:

A = {a, b, c, d, e}

 “Department” çoxluğunu aşağıdakı şəkildə təsvir edə bilərik:

Fərz edək ki, e, f – “Dep_İD, Department” atributlarıdır və B çoxluğu həmin atributları olan elementlərdən ibarətdir:

B= {e, f}

Sorğu formalaşdıraq: Bütün əməkdaşları və bütün departamentləri bir siyahıda  verin.

Sorğunu çoxluqlar nəzəriyyəsinə uyğun dəqiqləşdirək: cavabı cəmi bir cədvəldən: “Personal” cədvəlindən ala bilmərik, çünki şirkətin departamentləri barədə məlumat başqa cədvəldə yerləşir. Deməli, sorğu belə olacaq: “Department” və “Personal” çoxluqlarına daxil olan bütün məlumatı tapın. Başqa sözlə, biz “Department”  və “Personal” çoxluqlarının birləşməsi əməliyyatını etməliyik.

Bu iki çoxluğun birləşməsi bizə nə verir. Gəlin, ilk öncə həllini tapaq:

A U B = { a, b, c, d, e, f}

Deməli, “Personal” və “Department” çoxluğuna daxil olan bütün elementləri tapdıq. Dep_İD atributu həm “Personal” və həm də “Department” çoxluğuna daxildir. Yuxarıda qeyd etdik ki, atributlar mürəkkəb çoxluğun elementlərini izah edən parametrlərdir, verilənlər bazası terminlərində isə cədvəlin sütunlarıdır. Deməli, biz hər iki cədvələ daxil olan atributları (sütunları) olan bütün sətirlərdən ibarət yeni bir cədvəl əldə etdik.

Daha aydın olması üçün yaratdığımız cədvəllər üzərində göstərək:

Fərz edək ki, bazamız üç cədvəldən ibarətdir: “Personal”, “Departament” və “Phone”

“Personal” cədvəli:

 Personal

“Dapartment” cədvəli

 DEpartment

“Phone” cədvəli

 Phones

Qoyulmuş sualın cavabını tapmaq üçün biz iki cədvəllə işləməliyik – “Personal” və “Department” cədvəlləriylə. Gördüyümüz kimi, hər iki cədvəldə eyni sütun var – “Dep_İD” sütunu. Bu sütun həm “Department”, həm də “Personal” çoxluğundakı elementlərin bir atributudur. “Department” çoxluğunda cəmi beş elementimiz var və hər birinin “Dep_İD” atributu vardir. Yalnız “Finance” elementinin “Dep_İD” atributu “Personal” çoxluğundakı “Dep_İD” atributu ilə üst-üstə gəlmir, həmçinin “Personal” çoxluğundakı Tale Abbasov elementinin Dep_İD atributu yoxdur. “Department” çoxluğunun bütün digər elementləri “Personal” çoxluğunun elementləri ilə eyni bir atributu (Dep_İD) olduğu üçün çoxluqlar nəzəriyyəsinə əsasən həmin elementlər hər iki çoxluğa daxildir. Çoxluqlar nəzəriyyəsinə əsasən çoxluğun elementi sadə rəqəmdən və ya başqa sadə qiymətdən daha böyükdürsə, çoxluğun hər elementinin xüsusiyyətlərinin təsvir edən  bir neçə atributu (və ya verilən bitləri) vardır. İki çoxluq arasında münasibət yaradılanda bu çoxluqların elementlərinin atributları müqayisə edilir və atributlardan heç olmasa biri hər iki çoxluqda eynidirsə  həmin elementlər həmin çoxluğa daxil olunmuş qəbul olunur.

Yuxarıda dedik ki, biz hər iki çoxluğa (cədvələ) daxil olan atributları (sütunları) olan bütün elementlərdən (sətirlərdən) ibarət olan yeni bir çoxluq (cədvəl) əldə etdik.

Beləliklə, “Department” və “Personal” çoxluqlarının birləşməsi nəticəsində yeni bir çoxluq alırıq:

 FullJoinTable

Lakin sualımıza diqqət yetirsək görərik ki, bizdən tələb olunan yalnız departamentlərin və orada çalışan əməkdaşların adlarıdır, yəni cədvəllərdə olan ünvan və digər parametrlər tələb olunmur. Sorğu belə idi: Bütün əməkdaşları və bütün departamentləri bir siyahıda  verin. Yəni bütün əməkdaşların adını, soyadını və bütün departamentlərin adını ekranda göstərin.  Nəticədə alırıq:

 FullJoinLite

Nəticəmizdə yeddi sətir və ya element var. Bu zaman artıq biz cədvəldə “Finance” departamentini və Tale Abbasov adında əməkdaşı da görürük. Səbəbi isə çox sadədir: “Finance” departamentində heç bir əməkdaş çalışmır, Tale Abbasov isə heç bir departamentdə çalışmır. Lakin biz bütün əməkdaşların və bütün departamentlərın siyahısını görmək istədiyimiz üçün bu iki elementi də nəticədə görürük.

Çoxluqlar terminlərində isə: “Personal” və “Department” çoxluqlarına daxil olan  bütün elementlərdən ibarət olan çoxluqda cəmi yeddi element daxildir:

 FULLTabel

Əslində biz məqaləmizin bu hissəsində verilənlər bazasının sorğu dilinin (SQL) daha bir əməliyyatı (daha doğrusu sorğusu) ilə tanış olduq. Bu əməliyyat SQL – də JOİN adlandırılır. Bizim etdiyimiz əməliyyat isə FULL OUTER JOİN adlandırlır. Sualımızı SQL dilinə çevirək: bütün əməkdaşların adını, soyadını və bütün departamentlərin adını “Personal” və “Department” cədvəllərindən alın.

İngilis dilinə çevirsək:

SELECT FirstName, LastName, Department

FROM Personal

FULL OUTER JOIN Department

ON Personal.Dep_ID = Department.Dep_ID

SQL dilinin operatorları və sintaksisi barədə ətraflı məlumat növbəti məqalələrdə veriləcək. Burada biz verilənlər bazasında cədvəllərin arasında münasibətlərin yaradılması prosesini nümayiş etmək və verilənlərin münasibətli modelini izah etmək üçün SQL operatorlarından istifadə etdik. Yuxarıdakı nümunəmizdə biz OUTER JOİN əməliyyatının bir növü olan FULL OUTER JOİN əməliyyatı ilə tanış olduq. Həmin əməliyyat çoxluqlar nəzəriyyəsində olan çoxluqların birləşməsi əməli ilə eynidir.

İndi isə yeni bir sorğu formalaşdıraq:

Heç bir departamentdə çalışmayan bütün əməkdaşları və heç bir əməkdaşı (işçisi) olmayan bütün departamentləri tapın.   

Sualımızı SQL dilinə çevirək: heç bir departamentdə çalışmayan əməkdaşların adını, soyadını və heç bir əməkdaşı olmayan departamentin adını “Personal” və “Department” cədvəllərindən alın. Sorğunun “heç bir departamentdə çalışmayan” və “heç bir əməkdaşı olmayan” hissəsi xüsusi maraq doğurur. Yəni bizə bütün əməkdaşlar lazım deyil, yalnız heç bir departamentdə çalışmayan əməkdaşlar lazımdır. Başqa sözlə “Department” cədvəlinə aidiyyəti olmayan əməkdaşları tapın. Həmin şərtə əsasən yalnız Tale Abbasov əməkdaşımızın Dep_İD atributu NULL qiyməti alıb, yəni “Department” cədvəlində heç bir qiyməti yoxdur. Həmçinin, bizə bütün departamentlər lazım deyil, yalnız heç bir əməkdaşın çalışmadığı departamentlər lazımdır. Başqa sözlə “Personal” cədvəlinə aidiyyəti olmayan departamentləri tapın. Həmin şərtə əsasən yalnız “Personal” cədvəlində “Finance” departamentinin “Dep_İD” atributu NULL qiyməti alıb, yəni “Personal” cədvəlində heç bir qiyməti yoxdur.

İngilis dilinə çevirsək: 

SELECT FirstName, LastName, Department

FROM Personal

FULL OUTER JOIN Department

ON Personal.Dep_ID = Department.Dep_ID

WHERE Personal.Dep_ID IS NULL

OR Department.Dep_ID IS NULL 

Sorğunu çoxluqlar nəzəriyyəsinə uyğun dəqiqləşdirək: cavabı cəmi bir cədvəldən: “Department” cədvəlindən ala bilmərik, çünki şirkətin əməkdaşları barədə məlumat başqa cədvəldə yerləşir. Deməli, sorğu belə olacaq: Yalnız “Personal” çoxluğuna daxil olan və yalnız “Department” çoxluğuna daxil olan bütün elementləri tapın:

 FullJoinFiltr2

Verilmiş sorğunun cavabını cədvəllərimiz üzərindən tapmaq üçün biz iki cədvəllə işləməliyik – “Personal” və “Department” cədvəlləriylə. Gördüyümüz kimi, hər iki cədvəldə eyni sütun var – “Dep_İD” sütunu. Lakin “Department” cədvəlində olan “Dep_İD”  sütunun bir qiyməti “Personal” cədvəlindəki “Dep_İD” sütununda olan qiymətlərdən fərqlidir, “Department” cədvəlinin isə “Dep_İD” sütunun bir qiyməti “Personal” cədvəlindəki “Dep_İD” sütununda olan qiymətlərdən fərqlidir,  bütün digər qiymətlər isə üst-üstə gəlir.

Yuxarıda dedik ki, heç bir departamentdə çalışmayan əməkdaşların adı və soyadı – Tale Abbasovdur, həmçinin heç bir əməkdaşı olmayan departamentin adı – “Finance”dir. Bunlardan ibarət olan çoxluq sorğumuzun nəticəsi olacaq:

 FullJoinFiltr

Məqalənin dördüncü hissəsinin sonuna gəlib çatdıq. Bu hissədə riyaziyyatın çoxluqlar nəzəriyyəsində olan çoxluqların birləşməsi, verilənlər bazasında ayrı-ayrı cədvəllər arasında münasibətlərin yaradılması və FULL OUTER JOİN əməliyyatı barədə bəhs etdik. Bu çoxluqlar üzərində əməllər barədə məqalənin sonuncu hissəsidir.

Ümid edirəm ki, faydalı olacaq.

Məqalənin əvvəlki hissələrini aşağıdakı keçidlərdən tapa bilərsiniz:

Çoxluqlar üzərində əməllər – 1-ci hissə (İNNER JOİN)

Çoxluqlar üzərində əməllər 2-ci hissə (LEFT OUTER JOİN)

Çoxluqlar üzərində əməllər 3-cü hissə (RİGHT OUTER JOİN)

 

Diqqətinizə görə təşəkkür edirəm. Növbəti məqalələrdə görüşənədək.

Səs: +40. Bəyənilsin Zəifdir

Müəllif: Rauf Khalafov

Şərhlər ( 1 )

  1. Təşəkkürlər Rauf müəllim.

Şərh yazın