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

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

Salam Dostlar.

Bu gün 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 birinci hissəsində verilənlər bazasında olan cədvəllər arasında münasibətlər qurduq və iki cədvəlin kəsişməsi əməliyyatını etdik, riyaziyyatın verilənlər bazası üçün əhəmiyyəti və istifadəsi barədə danışdıq. Ü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 fərqi barədə danışacağıq.

Məqaləmizin birinci hissəsində qeyd etdik ki, biz bazada olan məlumat yığımını, məcmusunu onu təşkil edən çoxluqlara bölsək; məsələn: personal çoxluğu, şöbələr çoxluğu, telefon nömrələri çoxluğu, və s. istədiyimiz məlumatı verilənlər bazasından rahatlıqla ala bilərik. Çoxluq de­dikdə hər han­sı əla­­mət­lə­rinə, xüsusiyyətlərinə görə seçilmiş obyektlər top­lusu, yığımı ba­­şa düşülür. Şirkət əməkdaşlarının verilənlər bazasını yaratdıq və onu təşkil edən cədvəlləri coxluqlar şəklində təsvir etdik.

SQL – də biz adətən elementləri cədvəl sətirlərindən ibarət olan mürəkkəb çoxluqlarla işləyirik. İ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. 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ərsimizdən bizə tanış olan təsvirimizə bir daha baxaq:

 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, biz onları təkcə bir cədvəldən ala bilmirik. Bəzən iki və ya bir neçə cədvəllə işləməliyik ki, istədiyimiz cavabı alaq. 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. Burada bir məqama diqqət etmək lazımdır: biz istədiyimiz cədvəlləri bir-biriylə əlaqələndirə bilmərik, çünki seçimimiz məntiqli olmalıdır. Məsələn: “Department” çoxluğu (cədvəli) və “Phone” çoxluğu (cədvəli) arasında nə münasibət ola bilər? Verilənlər bazasını yaradanda nəzərdə tutmuşduq ki, “Phone” çoxluğunda əməkdaşların telefon nömrələri saxlanılacaq. Deyə bilərsiniz ki, departamentlərin də telefon nömrələri ola bilər. Bəli ola bilər, amma “Phone” cədvəlindən fərqli olan başqa bir cədvəldə. Beləliklə, “Phone” çoxluğu daha çox “Personal” çoxluğuna aiddir və yalnız bu iki çoxluq arasında münasibət ola bilər. “Department” çoxluğu və “Phone” çoxluğu arasında münasibət isə məntiqsizdir, çünki “Phone” çoxluğunda “Department” çoxluğuna aid heç bir şey yoxdur, eyni zamanda “Department” çoxluğunda “Phone” çoxluğuna aid bir şey yoxdur.

Çoxluqlar üzərində bizi maraqlandıran ikinci əməl çoxluqların fərqi əməlidir.

Çoxluqların fərqi.

Tərif. A və B çoxluqlarının fərqi A çoxluğunun B-yə daxil olmayan elementləri çoxluğuna deyilir və A \ B kimi işarə olunur. Başqa sözlə, B çoxluğuna daxil olmayan  A çoxluğunun bütün elementlərindən ibarət olan çoxluğa A və B çoxluqlarının fərqi deyilir.

Çoxluqların fərqini 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 rəqəmlərindən ibarətdir. Bu iki çoxluğun fərqi A çoxluğuna daxil olan 1 və 2 rəqəmlərindən ibarət yeni çoxluq olacaq, çünki 3 və 4 rəqəmləri B çoxluğunda da var, 1 və 2 rəqəmlər isə B-yə daxil deyildir.

Əgər А={1,2,3,4}, B={3,4,5}, onda А \ В = {1,2}

 sql_join_Reqem_Left

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: Heç bir departamentdə çalışmayan əməkdaşları tapın. İkinci variant: departamenti olmayan əməkdaşları tapın.

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: “Personal” çoxluğuna daxil olan və eyni zamanda “Department” çoxluğuna daxil olmayan məlumatı tapın, yəni elə bir məlumatı ki, “Personal” cədvəlində olsun, “Department” cədvəlində isə olmasın. Başqa sözlə, biz “Personal”  və “Department” cədvəllərinin fərqi əməliyyatını etməliyik.

Bu iki çoxluğun fərqi bizə nə verir. Gəlin, ilk öncə həllini tapaq:

A \ B = {a, b, c, d}

Deməli, “Personal” çoxluğuna daxil olan və eyni zamanda “Department” çoxluğuna daxil olmayan dörd fərqli atributu (sütunu) olan  elementlər vardır. Dep_İD atributu isə 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 bir cədvələ daxil olan və digər cədvələ daxil olmayan 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. “Personal” çoxluğunda cəmi altı əməkdaşımız var və onlardan beşinin də belə bir atributu və ya parametri vardır, yalnız Tale Abbasov adında əməkdaşımızın belə bir parametri yoxdur. Dep_İD atributu, həmçinin “Department” çoxluğunda da var və beş departamentimizin hər birinin bir atributudur. “Per_İD, FirstName, LastName, Address” atributları (sütunları) isə “Personal” çoxluğuna daxil olan Tale Abbasov elementinin atributlarıdır, “Department” çoxluğunda isə Tale Abbasov elementinə aid atribut  yoxdur.  “Personal” çoxluğunun bütün digər elementlərinin “Department” çoxluğundaki 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ər iki çoxluğa daxil olunmuş hesab olunur.

Yuxarıda dedik ki, biz bir çoxluğa (cədvələ) daxil olan və digər çoxluğa (cədvələ) daxil olmayan 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ə, “Personal” və “Department” çoxluqlarının fərqi nəticəsində yeni bir çoxluq alırıq:

 Ferq_Netice1

Vizual göstərmək üçün burada Dep_İD sütunu iki dəfə verilib, lakin əsl riyaziyyat çoxluğlarında təkrarlanan sütunlar və ya atributlar olmur, yəni formal olaraq biz burada cəmi bir Dep_İD sütunu da göstərə bilərik.

Lakin sualımıza diqqət yetirsək görərik ki, bizdən tələb olunan yalnız əməkdaşlarımızın və çalışdıqları departamentin adlarıdır, yəni cədvəllərdə olan ünvan və digər parametrlər tələb olunmur. Sorğu belə idi: Heç bir departamentdə çalışmayan əməkdaşları tapın. Yəni əməkdaşların adı, soyadı və heç bir departamentdə çalışmadığı barədə məlumatı ekranda göstərin.  Nəticədə alırıq:

 LeftJoin_NeticeSon

Nəticəmizdə cəmi bir sətir və ya element var: Taleh Abbasov adında əməkdaş. Bəs digər elementlər necə oldu? Səbəbi isə çox sadədir: heç bir departamenti (heç bir departamentdə çalışmayan) cəmi bir əməkdaşımız var – Taleh Abbasov. Çoxluqlar terminlərində isə: “Personal” çoxluğunun ”Taleh Abbasov” elementinin Dep_İD atributu yoxdur və buna görə də həmin element “Department” çoxluğuna daxil deyildir və yalnız “Personal” çoxluğuna daxildir. Yuxarıda qeyd etdik ki, iki çoxluq arasında münasibət yaradılanda bu çoxluqların elementlərinin atributları müqayisə edilir. Tərifə birdə qayıdaq: B çoxluğuna daxil olmayan  A çoxluğunun bütün elementlərindən ibarət olan çoxluğa A və B çoxluqlarının fərqi deyilir. “Department” çoxluğuna daxil olmayan “Personal” çoxluğunun bütün elementlərindən ibarət olan çoxluğunda cəmi bir elementimiz var – Tale Abbasov:

 sql_join_5

Ə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ə OUTER JOİN adlandırlır. Sualımızı SQL dilinə çevirək: əməkdaşların adını, soyadını və heç bir departamentdə çalışmadığı barədə məlumatı “Personal” və “Department” cədvəllərindən alın. Sorğunun “heç bir departamentdə çalışmadığı” 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ışmadığı ə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.

İngilis dilinə çevirsək:

SELECT FirstName, LastName, Department

FROM Personal

LEFT OUTER JOIN Department ON Personal.Dep_ID = Department.Dep_ID

WHERE Department.Dep_ID IS NULL

SQL dilinin operatorları 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 LEFT OUTER JOİN əməliyyatı ilə tanış olduq. Lakin yuxarıda göstərdiyimiz nümunədə şərt vardır: “Department” cədvəlində Dep_İD atributu olmayan (NULL olan) sətirlər “Personal” cədvəlindən seçilməlidir. Həmin şərt SQL dilində WHERE B.Key İS NULL operatoru ilə yazılır və “Left Excluding JOIN” (Sol istisna birləşməsi) adlandırılır.  Həmin əməliyyat çoxluqlar nəzəriyyəsində olan çoxluqların fərqi əməli ilə eynidir.

 İstisnasız (adi) LEFT OUTER JOİN əməliyyatı göstərmək üçün yeni sorğu formalaşdıraq:

Bütün əməkdaşların və işlədikləri departamentlərin siyahısını 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: “Personal” cədvəlinə daxil olan və “Department” cədvəlinə uyğun olan bütün məlumatı tapın, yəni elə bir məlumatı ki, “Personal” cədvəlində tam şəkildə olsun, eyni zamanda “Department” cədvəlinə də uyğun gəlsin.

Verilmiş sorğunun izahını 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 rəqəmlərindən ibarətdir. A çoxluğuna daxil olan bütün rəqəmlər 1, 2, 3 və 4 rəqəmləridir, həmçinin burada olan 3 və 4 rəqəmləri B çoxluğuna da daxildir. Deməli, A çoxluğuna daxil olan bütün rəqəmlərin və B çoxluğunda daxil olan A çoxluğuna uyğun olan rəqəmlərin çoxluğu 1, 2, 3 və 4 rəqəmlərindən ibarət çoxluqdur:

 sql_join_reqemler

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. Bu sütun həm “Department”, həm də “Personal” çoxluğundakı elementlərin bir atributudur. “Personal” cədvəlində cəmi altı əməkdaşımız var və onlardan beşinin də belə bir atributu və ya parametri vardır, yalnız Tale Abbasov adında əməkdaşımızın belə bir parametri yoxdur. Dep_İD atributu, həmçinin “Department” çoxluğunda da var və beş departamentimizin hər birinin bir atributudur. Yuxarıda dedik ki, “Personal” çoxluğuna (cədvəlinə) daxil olan bütün elementlərindən (sətirlərindən) və “Department” çoxluğuna (cədvəlinə) daxil olan “Personal” çoxluğuna (cədvəlinə) uyğun olan elementlərdən (sətirlərdən) ibarət olan çoxluğu (cədvəli) bizim sorğunun nəticəsi olacaq:

 left_join_Son1

Beləliklə, yeni bir çoxluq alırıq:

 LeftJoin_ALL

Vizual göstərmək üçün burada Dep_İD sütunu iki dəfə verilib, lakin əsl riyaziyyat çoxluğlarında təkrarlanan sütunlar və ya atributlar olmur, yəni formal olaraq biz burada cəmi bir Dep_İD sütunu da göstərə bilərik.

Lakin sualımıza diqqət yetirsək görərik ki, bizdən tələb olunan yalnız əməkdaşlarımızın və çalışdıqları departamentin 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ın və işlədikləri departamentlərin siyahısını verin. Yəni bütün əməkdaşların adı, soyadı və işlədikləri departamenti barədə məlumatı ekranda göstərin.  Nəticədə alırıq:

 Left_Join_son7

Nəticəmizdə altı sətir və ya element var. Tale Abbasov əməkdaşın qarşısında NULL qiyməti var və görmədiyimiz bir element – “Finance” departamentidir. Səbəbi isə çox sadədir: Tale Abbasovun heç bir departamentdə çalışmır və “Finance” departementində heç bir əməkdaş çalışmır.

Məqalənin 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ə LEFT OUTER JOİN adlandırlır. Sualımızı SQL dilinə çevirək: bütün əməkdaşların adı, soyadı və işlədikləri departamenti barədə məlumatı “Personal” və “Department” cədvəllərindən alın. İngilis dilinə çevirsək:

SELECT FirstName, LastName, Department

FROM Personal

LEFT OUTER JOIN Department ON Personal.Dep_ID = Department.Dep_ID

SQL dilinin operatorları 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 LEFT OUTER JOİN əməliyyatı ilə tanış olduq. Ümumiyyətlə, qeyd etmək lazımdır ki, OUTER JOİN əməliyyatının üç növü vardır: LEFT OUTER JOİN, RİGHT OUTER JOİN və FULL OUTER JOİN.

Məqaləmizin ikinci hissəsinin sonuna gəlib çatdıq. Bu hissədə riyaziyyatın çoxluqlar nəzəriyyəsində olan çoxluqların fərqi, verilənlər bazasında ayrı-ayrı cədvəllər arasında münasibətlərin yaradılması və LEFT OUTER JOİN əməliyyatı barədə bəhs etdik.

Ümid edirəm ki, faydalı olacaq.

Məqalənin növbəti hissəsində çoxluqların fərqi mövzusunun davamı və SQL dilinin RİGHT OUTER JOİN əməliyyatı barədə ətraflı məlumat verməyə çalışacağam.

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

Müəllif: Rauf Khalafov

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

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

Şərh yazın