Gəlin tərifdən başlayaq. RIGHT JOIN — bu elə bir join növüdür ki, sağ cədvəldəki bütün sətrləri qaytarır (ona görə də "sağ" adlanır), soldan isə yalnız uyğun gələn sətrləri verir. Əgər sol cədvəldə sağ cədvəlin sətrinə uyğun data yoxdursa — sol cədvəlin sütunları üçün NULL dəyərlər qaytarılacaq.
Artıq LEFT JOIN ilə tanışsan, bu demək olar ki, eynidir, sadəcə "güzgü kimi"dir. Əsas fərq odur ki, hansı cədvəl əsas sayılır: sol, yoxsa sağ.
RIGHT JOIN sintaksisi
RIGHT JOIN sintaksisi demək olar ki, LEFT JOIN ilə eynidir. Strukturu belədir:
SELECT
sütunlar
FROM
cedvel_sol RIGHT JOIN cedvel_sag
ON
birlesme_serheti;
Cədvəllərin sırasına fikir ver:
- sol cədvəl
RIGHT JOIN-dan əvvəl yazılır; - sağ cədvəl
RIGHT JOINsözündən sonra gəlir.
Təsəvvür elə ki, iki cədvəlimiz var:
students — tələbələrin siyahısı:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Maria |
| 3 | Alex |
enrollments — tələbələrin kurslara yazılması barədə qeydlər:
| enrollment_id | course_name | student_id |
|---|---|---|
| 101 | Riyaziyyat | 1 |
| 102 | İnformatika | 2 |
| 103 | Biologiya | NULL |
İndi istəyirik ki, bütün yazılma qeydlərini və varsa, tələbə haqqında məlumatı da alaq. Əgər tələbə tapılmasa, tələbə məlumatı yerinə NULL görəcəyik.
RIGHT JOIN istifadə olunan sorğu belə olacaq:
SELECT
enrollments.enrollment_id,
enrollments.course_name,
students.name AS student_name
FROM
students RIGHT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Nəticə:
| enrollment_id | course_name | student_name |
|---|---|---|
| 101 | Riyaziyyat | Otto |
| 102 | İnformatika | Maria |
| 103 | Biologiya | NULL |
Burada görürük ki, enrollments (sağ cədvəl) cədvəlinin bütün sətrləri nəticəyə düşüb, hətta students (sol cədvəl) cədvəlində uyğun gələn tələbə olmasa belə.
RIGHT JOIN və LEFT JOIN müqayisəsi
Əgər artıq LEFT JOIN necə işləyir bilirsənsə, belə düşünə bilərsən: "Bəs ümumiyyətlə RIGHT JOIN nəyə lazımdır? Niyə LEFT JOIN istifadə etməyək?" Yaxşı sualdır! Gəlin fərqləri və nə vaxt RIGHT JOIN seçmək lazım olduğunu aydınlaşdıraq.
Məlumatın istiqaməti
LEFT JOIN: sol cədvəldəki bütün sətrləri qaytarır, sağda uyğun gələn olsa da, olmasa da.RIGHT JOIN: sağ cədvəldəki bütün sətrləri qaytarır, solda uyğun gələn olmasa belə.
Əsas cədvəlin seçimi Adətən
LEFTvə yaRIGHTseçirsən, hansı cədvəl (sol, yoxsa sağ) sənin üçün əsasdırsa və sorğunu hansı sırada yazmaq rahatdırsa.Ekvivalentlik İstənilən
RIGHT JOIN-iLEFT JOINkimi, sadəcə cədvəllərin sırasını dəyişməklə yaza bilərsən. Məsələn:-- RIGHT JOIN SELECT * FROM students RIGHT JOIN enrollments ON students.student_id = enrollments.student_id; -- Ekvivalent LEFT JOIN SELECT * FROM enrollments LEFT JOIN students ON students.student_id = enrollments.student_id;
Yəni, əgər RIGHT JOIN sözünü sevmirsənsə, həmişə ondan qaça bilərsən!
RIGHT JOIN nə vaxt istifadə olunur?
Praktikada RIGHT JOIN LEFT JOIN-dən daha az istifadə olunur. Amma bəzi hallarda faydalı ola bilər:
- Əgər sağ cədvəl daha vacibdirsə (məsələn, əsas cədvəlin odursa);
- Sorğunu elə qurmaq istəyirsənsə ki, sağ cədvəl məntiqi olaraq soldan sonra gəlsin;
- Artıq yazılmış kodda
RIGHT JOINstandart olaraq istifadə olunubsa.
RIGHT JOIN-in vizual təsviri
RIGHT JOIN-i daha yaxşı başa düşmək üçün gəlin sxemə baxaq:
Sol cədvəl Sağ cədvəl
[ A ] --------> [ 1 ]
[ B ] --------> [ 2 ]
[ C ] --------> [ 3 ]
[ D ] [ 4 ]
RIGHT JOIN istifadə edəndə sağ cədvəldəki bütün dəyərləri və uyğun gələn sol cədvəldəki məlumatları alırıq. Sol cədvəldə olmayanlar NULL ilə doldurulacaq.
Praktiki tapşırıq
Gəlin biliklərini praktikada yoxlayaq. Tapşırıq belədir:
Səndə departments (şöbələr) və employees (işçilər) cədvəlləri var: departments:
| department_id | department_name |
|---|---|
| 1 | IT |
| 2 | Satış |
| 3 | Mühasibatlıq |
employees:
| employee_id | name | department_id |
|---|---|---|
| 101 | Peter | 1 |
| 102 | Eva | 2 |
| 103 | Ron | NULL |
RIGHT JOIN istifadə edərək elə bir sorğu yaz ki, bütün şöbələri, həmçinin şöbədə işçi varsa onu da, yoxdursa NULL qaytarsın.
Əvvəlcə özün həll etməyə çalış, sonra cavaba bax.
Tapşırığın cavabı
Sorğu belə olacaq:
SELECT
departments.department_name,
employees.name AS employee_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
Nəticə belə olacaq:
| department_name | employee_name |
|---|---|
| IT | Peter |
| Satış | Eva |
| Mühasibatlıq | NULL |
RIGHT JOIN istifadə edərkən tipik səhvlər
RIGHT JOIN ilə işləyərkən yeni başlayanlar tez-tez belə problemlərlə rastlaşır:
ONbirləşmə şərtini yaddan çıxarırlar. Şərt yazmasan, cədvəllərin dekart hasilini alacaqsan və xaos yaranacaq.RIGHT JOINvəLEFT JOIN-i qarışdırırlar. Cədvəlləri səhv sırada yazsan, nəticə səhv olacaq.NULLdəyərləri düzgün işləmirlər.RIGHT JOINilə sorğularda tez-tezNULLçıxır, onları düzgün başa düşmək və yaCOALESCE()ilə əvəzləmək lazımdır.
Bu qədər! Artıq bilirsən ki, RIGHT JOIN necə işləyir, RIGHT JOIN və LEFT JOIN arasındakı fərqi başa düşürsən və öz tapşırıqların üçün düzgün join növünü seçə bilərsən. Növbəti leksiyada FULL OUTER JOIN barədə daha ətraflı danışacağıq, burada hər iki cədvəldə olan hər şeyi birləşdirəcəyik. Sorğularında uğurlar!
GO TO FULL VERSION