Çoxluqlar üzərində əməllər – 1-ci hissə (İNNER JOİN)
Çoxluqlar üzərində əməllər – 1-ci hissə (İNNER JOİN)
Salam Dostlar.
Bugünkü məqalədə riyaziyyatın verilənlər bazası üçün əhəmiyyəti və istifadəsi barədə bəhs olunacaq. Mövzu olduqca geniş və maraqlı olduğu üçün məqaləni bir neçə hissəyə bölmüşəm.
Hər hansı bir məlumatı cədvəl şəklində görmək daha rahatdır. Həmçinin, cədvəldə istədiyimiz məlumatı bir yerdə, yəni cəm halında görmək istəyirik. Burada bir sual yaranır: Biz bütün məlumatlarımızı böyük bir Excel cədvəlində yerləşdirə biləriksə, cədvəllər və siyahılar olan yerdə verilənlər bazası nəyə lazımdır? Bildiyimiz kimi, cədvəl axtarışın, seçimin, sorğunun nəticəsidir, yəni ekranda biz yalnız bizə lazım olan məlumatları cədvəl formasında görürük. Əslində biz digər bir sualla rastlaşırıq: məlumatları cədvəl və siyahı şəklində saxlamaq doğrudan da rahatdırmı? Keçən dərsimizdə cədvəlin bir çatışmazlığından bəhs etdik. Şirkətin əməkdaşları barədə məlumatları cədvəl şəklində saxlanılması zamanı yeni əməkdaşlar və ya onlar barədə hər hansı bir məlumatı əlavə etmək üçün cədvəldə yeni sütun və ya yeni sətir əlavə etməliydik. Əməkdaşların və əlavə edəcəyimiz məlumatların sayı yüzlərcə və ya minlərcə olduqda işimizin çətinləşməsi ilə rastlaşdıq. Bu cədvəlin yalnız bizə məlum olan bir catışmazlığıdır. Əslində məlumatların cədvəl və siyahı şəklində saxlanılmasının digər catışmazlıqları da var; məsələn: eyni məlumatlar bir neçə şəxs və ya şöbə tərəfindən emal edildikdə çətinliklər yaranır. Bir cədvəldə mühasibat şöbəsi əməkdaşların əmək haqları və digər ödənişləri barədə hesabat aparır və başqa şöbələrin həmin məlumatları görməsini istəmir. Həmçinin həmin cədvəldə satış departamenti əməkdaşların əlaqələri və müqavilələri barədə digər şöbələrin məlumatlı olmasını istəmir və s. Bu misallar onu göstərir ki, cədvəl və siyahı şəklində məlumatları saxlamaq və onlarla birgə işləmək o qədər də rahat deyil.
Məlumatların bir yerdə cəm halında saxlanılması və emalı üçün digər bir vasitə – verilənlər bazası mövcuddur. Bizə lazım olan məlumatları verilənlərə, yəni kompüter tərəfindən emal edilməsi və saxlanılması rahat olan formaya salırıq və onları müəyyən bir yerə, yəni bazaya yığırıq. Keçən dərslərimizin birində dedik ki, verilənləri bazada nizamsız və qaydasız bir yığım kimi saxlasaq, onun bizə heç bir faydası olmayacaq. Əslində bazaya yığdığımız ayrı-ayrı məlumatlar hər hansı bir sahəyə, mövzuya, başqa sözlə desək, tiplərə aiddir. Məsələn: əməkdaşın adı və soyadı insanlara aid olduğu üçün və adətən hərflərlə yazıldığı və saxlanıldığı üçün mətn tipində saxlanılması daha məqsədəuyğundur, əməkdaşların əmək haqları barədə danışıldıqda söhbət puldan gedir, buna görə də əmək haqqı barədə məlumat verilənlər bazasında pul tipində saxlanılır, əməkdaşların telefon nömrələri rəqəmlərdən ibarət olduğu üçün verilənlər bazasında telefon nömrələri barədə məlumat rəqəmlər tipində saxlanılacaq və s. Əslində biz bazada olan məlumat yığımını, məcmusunu onu təşkil edən çoxluqlara böldük: personal çoxluğu, şöbələr çoxluğu, telefon nömrələri çoxluğu, və s. Çoxluq dedikdə hər hansı əlamətlərinə, xüsusiyyətlərinə görə seçilmiş obyektlər toplusu, yığımı başa düşülür. Şirkət əməkdaşlarının verilənlər bazasını aşağıdakı şəkildə təsvir edə bilərik:
Bu çoxluqlarla işləmək (sorğu vermək, emal etmək və s.) üçün biz onları bazada “cədvəllər” şəklində saxlayırıq. Həmin “cədvəllər” münasibətli verilənlər bazasında “münasibətlər” adlandırılır. Eyni zamanda çoxluqları təşkil edən elementlər mütləq şəkildə təkcə bir qiymətdən ibarət deyildir; məsələn: sadəcə rəqəmlər və ya sadəcə mətnlər və s. SQL – də biz adətən sətirlərdən (cədvəl sətirlərindən) ibarət mürəkkəb çoxluqlarla işləyirik. Ç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. Bildiyimiz kimi, münasibətli verilənlər modelində formal olaraq sütunlar “atributlar”, sətirlər isə “kortejlər” adlandırılır. Deməli, yuxarıda yaratdığımız şirkət əməkdaşlarının verilənlər bazasında biz əməkdaşın adı, soyadı, yaşadığı ünvanı və əsas açar (Per_İD) adlı atributları (sütunları) olan “Personal” çoxluğu (cədvəli) ilə işləyirik. Bu çoxluqda (cədvəldə) hər bir əməkdaş çoxluğun ayrı-ayrı elementidir və hər bir əməkdaşın (elementin) xüsusiyyətlərini izah edən bir neçə atributu (cədvəl sütunu): adı, soyadı, yaşadığı ünvanı və əsas açarı vardır. Həmçinin “Department” çoxluğunda Dep_İD (əsas açar), Department adlı atrıbutları (cədvəl sütunları) olan elementlərlə işləyirik. Beləliklə, bizim 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:
Biz yuxarıda ayrı-ayrı münasibətlərdən ibarət olan və həmin münasibətlərin cədvəllər şəklində təsvir olunan verilənlər bazasını yaratdıq. 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 əməkdaşlar cədvəlindən əməkdaşların ünvanları barədə məlumat əldə etmək olar və s. Bazamızdan digər bir məlumat alaq: Əməkdaşlarımız hansı departamentlərdə çalışırlar? Təkcə əməkdaşlar cədvəlindən bu məlumatı almaq mümkün deyil, çünki şirkətin departamentləri barədə məlumat digər bir cədvəldə – “Department” cədvəlində yerləşir. Təbii ki, bizə lazım olan məlumatı əldə etmək üçün cədvəllərimiz arasında münasibətlər yaratmalıyıq. Hər bir cədvəldə ayrı-ayrı çoxluq barədə məlumat saxlanıldığı üçün bizim köməyimizə riyaziyyatın bir sahəsi olan çoxluqlar nəzəriyyəsi gələcək. Riyazıyyatda olan çoxluqlar üzərində əməlləri bizim bazamızda tətbiq etsək bizə lazım olan məlumatı çox asanlıqla əldə edə bilərik. Çoxluqlar üzərində hansı əməllər mövcuddur?
Çoxluqlar üzərində bizi maraqlandıran üç əsas əməllər təyin olunmuşdur: çoxluqların kəsişməsi, çoxluqların birləşməsi və çoxluqların fərqi.
- Çoxluqların kəsişməsi.
Tərif: A və B çoxluqlarının hər ikisinə eyni zamanda daxil olan bütün elementlərdən ibarət olan C çoxluğuna bu çoxluqların kəsişməsi deyilir:
Çoxluqların kəsişməsini rəqəmlər çoxluqları üzərində göstərək: Fərz edək ki, A çoxluğu 1,2,4 rəqəmlərindən ibarətdir, B çoxluğu isə 3,4,5,2 rəqəmlərindən ibarətdir. Bu iki çoxluğun kəsişməsi hər iki çoxluqda olan rəqəmlərdən ibarət olan C çoxluğu olacaq – 2 və 4.
Əgər А={1,2,4}, B={3,4,5,2}, onda А ∩ В = C = {2,4}
Yuxarıdakı “Əməkdaşlar” bazasında olan “Personal” mürəkkəb çoxluğunu aşağıdakı şəkildə təsvir edə bilərik:
A = {Per_İD, FirstName, LastName, Address, Dep_İD}
Burada “Per_İD, FirtName, LastName, Address, Dep_İD” – “Personal” çoxluğunun atributlarıdır, verilənlər bazası terminində isə “Personal” cədvəlinin sütunlarıdır, və hər bir əməkdaşın xüsusi parametrlərini özündə əks etdirir.
“Department” çoxluğunu aşağıdakı şəkildə təsvir edə bilərik:
B= {Dep_İD, Department}
Burada “Dep_İD, Department” – “Department” çoxluğunun atributlarıdır, verilənlər bazası terminində isə “Depertment” cədvəlinin sütunlarıdır, və hər bir departamentin xüsusi parametrlərini özündə əks etdirir.
Sual formalaşdıraq: Əməkdaşlarımız hansı departamentlərdə çalışırlar?
Sualı ç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, sual belə olacaq: iki çoxluğa (cədvələ) eyni zamanda daxil olan məlumatı tapın, yəni elə bir məlumatı ki, həm “Personal” cədvəlində olsun, həmdə eyni zamanda “Department” cədvəlində olsun. Başqa sözlə, biz iki çoxluğun kəsişməsi əməliyyatını etməliyik.
Bu iki çoxluğun kəsişməsi bizə nə verir. Gəlin, ilk öncə həllini tapaq:
{Per_İD, FirtName, LastName, Address, Dep_İD} ∩ {Dep_İD, Department} = {Dep_İD}
Deməli, hər iki çoxluğa eyni zamanda daxil olan bir atribut (sütun) vardır – Dep_İD. Yuxarıda qeyd etdik ki, Dep_İD mürəkkəb “Departament” çoxluğunun elementlərini izah edən bir atributdur, verilənlər bazası terminlərində isə “Departament” cədvəlinin bir sütunudur. Həmçinin belə bir atribut (sütun) “Personal” cədvəlimizdə də var və işçilərin bir parametrini izah edir. Deməli, biz hər iki cədvəldə olan Dep_İD sütunları eyni olan sətirləri tapdıq və birləşdirdik.
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:
“Dapartment” cədvəli:
“Phone” cədvəli:
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; məsələn: “Personal” çoxluğundakı Məmməd Əliyev adında əməkdaşın bir atributu və ya parametridir, eyni zamanda “Department” çoxluğundakı Accounting departamentinin bir parametridir. “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. Həmçinin “Department” çoxluğunda cəmi beş departamentimiz var hər bir departamentin də Dep_İD atributu vardır. Yuxarıda dedik ki, biz hər iki cədvəldə olan Dep_İD sütunları (atributları) eyni olan sətirləri tapdıq və birləşdirdik. Beləliklə, iki çoxluğun kəsişməsi nəticəsində yeni bir çoxluq alırıq:
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. Sual belə idi: əməkdaşlarımız hansı departamentlərdə çalışırlar? Yəni əməkdaşların adını, soyadını və çalışdıqları departamenti ekranda göstərin. Nəticədə alırıq:
Nəticəmizdə Taleh Abbasov adında əməkdaş və Finance departamenti yoxdur. Səbəbi isə çox sadədir: Taleh Abbasovun heç bir departamenti yoxdur (heç bir departamentdə çalışmır) və Finance departamentində heç bir əməkdaş yoxdur (çalışmır). Çoxluq terminlərində isə: “Personal çoxluğunun ”Taleh Abbasov” elementinin Dep_İD atributu “Department” çoxluğuna daxil deyildir və eyni zamanda “Department” çoxluğunun “Finance” elementinin Dep_İD atributu “Personal çoxluğuna daxil deyildir. 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: A və B çoxluqlarının hər ikisinə eyni zamanda daxil olan bütün elementlərdən ibarət olan C çoxluğuna bu çoxluqların kəsişməsi deyilir. Bizim hər iki çoxluğumuza eyni zamanda daxil olmayan cəmi iki elementimiz var “Taleh Abbasov” və “Finance”, qalan bütün elementlər isə hər ikisinə eyni zamanda daxildir:
Əslində biz məqaləmizin bu hissəsində verilənlər bazasının sorğu dilinin (SQL) 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ə İNNER JOİN adlandırlır. Sualımızı SQL dilinə çevirək: əməkdaşların adını, soyadını və çalışdıqları 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
INNER JOIN Department ON Personal.Dep_ID = Department.Dep_ID
SQL dilinin operatorları barədə ətraflı məlumat növbəti məqalələrdə verməyə çalışacağam. Burada biz verilənlər bazasında cədvəllərin arasında münasibətlərin yaradılması prosesini nümayiş etmək üçün SQL operatorlarından istifadə etdik.
Məqaləmizin birinci hissəsinin sonuna gəlib çatdıq. Bu hissədə riyaziyyatın çoxluqlar nəzəriyyəsində olan çoxluqların kəsişməsi və verilənlər bazasında ayrı-ayrı cədvəllər arasında münasibətlərin yaradılması və İNNER 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 birləşməsi və fərqi barədə və SQL dilinin OUTER JOİN əməliyyatı barədə ətraflı məlumat verməyə çalışacağam.
Şərhlər ( 5 )
Təşəkkürlər, Rauf bəy. Doğma dilimizdə bu tip mövzuların bu qədər sadə formada izah edilməsi çox böyük zəhmətdir. Allah zehninizə qüvvət versin.
Dəyərli məlumatlara görə təşəkkürlər!
Təşəkkürlər, Rauf bəy.
Qısa və konkret Ləzzət elədi 🙂
Çox sağ olun ! İnşaAllah davamı var.