Bu gün relasional verilənlər bazası ilə işləməyin ən maraqlı mövzularından birinə keçirik — bir neçə cədvəldən məlumatların JOIN ilə birləşdirilməsi. Bu, mürəkkəb əlaqələr və analitika yaratmaq üçün çox güclü bir alətdir.
Təsəvvür elə ki, sənin verilənlər bazan böyük bir komiksdir, hər ayrı cədvəl isə bir kadrdır. Tam bir hekayə qurmaq üçün bu kadrları birləşdirməlisən. Bunu sənin üçün JOIN edir. Məlumatların birləşdirilməsi — sorğunun bir neçə cədvəldən məlumat çıxarıb onları müəyyən şərtlərlə əlaqələndirməsi prosesidir.
Relasional verilənlər bazası cədvəllər arasındakı əlaqə konsepsiyası üzərində qurulub. Hər cədvəl konkret bir obyekt haqqında məlumat saxlayır və tam mənzərə üçün tez-tez müxtəlif cədvəllərdən məlumatları birləşdirmək istəyirik. Məsələn:
studentscədvəli tələbələrin siyahısını saxlayır.coursescədvəli kursların siyahısını saxlayır.enrollmentscədvəli kim hansı kursa gedir onu göstərir.
Hansı tələbənin hansı kursda oxuduğunu bilmək üçün bu cədvəlləri birləşdirməliyik. Müsahibədə JOIN ilə işləməyi bacaran developer çox ciddi görünür, çünki bu, data ilə işləməkdə ən çox tələb olunan skill-lərdən biridir.
Əsas JOIN növləri
PostgreSQL-də bir neçə JOIN növü var və hər biri konkret tapşırıqlar üçün nəzərdə tutulub. Gəlin onları ümumi şəkildə nəzərdən keçirək, başımızı dərhal çətin nümunələrlə doldurmadan:
JOIN növü |
Təsvir |
|---|---|
INNER JOIN |
Hər iki cədvəldə uyğun gələn sətrləri qaytarır. |
LEFT JOIN |
Sol cədvəldəki bütün sətrləri, sağdan isə yalnız uyğun gələnləri qaytarır. |
RIGHT JOIN |
Sağ cədvəldəki bütün sətrləri, soldan isə yalnız uyğun gələnləri qaytarır. |
FULL OUTER JOIN |
Hər iki cədvəldəki bütün sətrləri qaytarır, uyğun gəlməyən yerlərdə NULL qoyur. |
Hansı JOIN-u seçmək tapşırığından asılıdır:
- Əgər sənə yalnız hər iki cədvəldə uyğun gələn məlumatlar lazımdırsa,
INNER JOINistifadə elə. - Bir cədvəldəki bütün məlumatları, digərindən isə yalnız uyğun gələnləri saxlamaq istəyirsənsə,
LEFT JOINvə yaRIGHT JOINuyğun gəlir. - Hər iki cədvəldəki bütün məlumatlar lazımdırsa, hətta uyğun gəlməsə belə,
FULL OUTER JOINistifadə elə.
Gəlin bütün bu birləşmələri birbaşa praktikada araşdıraq.
Nümunə tapşırıq — "Kim hansı kursdadır?"
Tutaq ki, bizdə üç cədvəl var:
students cədvəli
| id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
courses cədvəli
| id | title |
|---|---|
| 101 | Riyaziyyat |
| 102 | İngilis dili |
enrollments cədvəli
| student_id | course_id |
|---|---|
| 1 | 101 |
| 2 | 102 |
Bu cədvəllər belə əlaqəlidir:
studentscədvəlindəidsütunu — tələbənin unikal identifikatorudur.coursescədvəlindəidsütunu — kursun unikal identifikatorudur.enrollmentscədvəlindəstudent_idvəcourse_idsütunları tələbə ilə kurs arasında əlaqə yaradır.
Tutaq ki, belə bir sualımız var: hansı tələbə hansı kursa yazılıb?
Cavabı JOIN ilə tapmaq olar. Cədvəlləri əlaqələrinə görə birləşdirəcəyik:
studentsvəenrollmentscədvəlləriniid = student_idilə birləşdiririk.enrollmentsvəcoursescədvəllərinicourse_id = idilə birləşdiririk.
SQL sorğusu belə olacaq:
SELECT students.name, courses.title
FROM enrollments
JOIN students ON enrollments.student_id = students.id
JOIN courses ON enrollments.course_id = courses.id;
Bu sorğu nə edir:
FROM enrollments— tələbə və kursları birləşdirən cədvəldən başlayırıq.JOIN students ON enrollments.student_id = students.id— tələbələri qoşuruq ki, adlarını alaq.JOIN courses ON enrollments.course_id = courses.id— kursları qoşuruq ki, adlarını alaq.
Nəticə belə olacaq:
| name | title |
|---|---|
| Otto | Riyaziyyat |
| Anna | İngilis dili |
Nəzərə al: əgər tələbənin heç bir kursu yoxdursa, nəticədə görünməyəcək — çünki JOIN default olaraq sərtdir (INNER JOIN). Sonra öyrənəcəyik ki, belə tələbələri də LEFT JOIN ilə necə əlavə etmək olar.
Əgər bu sorğuda nəsə aydın deyil, narahat olma! Bunu başa düşmək üçün növbəti leksiyalarımız var!
Bu real həyatda niyə lazımdır?
İndi cədvəlləri necə birləşdirməyi başa düşdün, gəlin real həyatı danışaq. Heç düşünmüsən, internet mağaza necə işləyir? Məsələn, telefon seçirsən və başqalarının rəylərini görürsən.
productscədvəli məhsullar haqqında məlumat saxlayır.reviewscədvəli alıcıların rəylərini saxlayır.customerscədvəli isə alıcıların özləri haqqında məlumat saxlayır
Saytda rəyləri göstərmək üçün products, reviews və customers cədvəllərini birləşdirmək lazımdır. Bax, bu JOIN-un işidir.
Nəyə diqqət etmək lazımdır?
Gələcək leksiyalarda JOIN-a daha dərindən baxmamışdan əvvəl, bir neçə məqamı yadında saxla:
JOIN-da sıra vacibdir. Məsələn,LEFT JOINsol cədvəldəki sətrləri qaytarır, yəni cədvəllərin yerini dəyişsən, nəticə də dəyişir.- Kiçik cədvəllərlə işləməyə başla. Əvvəldə milyonlarla sətr olan sorğulardan qaç. Hətta ən sadə sorğu belə başa düşülən olmalıdır.
- Əlaqələr barədə düşünməyə öyrəş. Cədvəlləri bir böyük strukturun hissəsi kimi görməyə başlasan,
JOINilə işləmək sənin üçün təbii olacaq.
Bu gündən SQL-pro olmağa başlayırıq. Növbəti leksiyada iki cədvəldən məlumat çıxarmaq üçün INNER JOIN istifadə etməyi öyrənəcəksən. Bu, PostgreSQL öyrənməyində böyük bir addım olacaq.
GO TO FULL VERSION