CodeGym /Kurslar /SQL SELF /`RIGHT JOIN` və onun tətbiqi

`RIGHT JOIN` və onun tətbiqi

SQL SELF
Səviyyə , Dərs
Mövcuddur

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:

  1. sol cədvəl RIGHT JOIN-dan əvvəl yazılır;
  2. sağ cədvəl RIGHT JOIN sö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 JOINLEFT 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.

  1. 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ə.
  2. Əsas cədvəlin seçimi Adətən LEFT və ya RIGHT seçirsən, hansı cədvəl (sol, yoxsa sağ) sənin üçün əsasdırsa və sorğunu hansı sırada yazmaq rahatdırsa.

  3. Ekvivalentlik İstənilən RIGHT JOIN-i LEFT JOIN kimi, 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 JOIN standart 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:

  1. ON birləşmə şərtini yaddan çıxarırlar. Şərt yazmasan, cədvəllərin dekart hasilini alacaqsan və xaos yaranacaq.
  2. RIGHT JOINLEFT JOIN-i qarışdırırlar. Cədvəlləri səhv sırada yazsan, nəticə səhv olacaq.
  3. NULL dəyərləri düzgün işləmirlər. RIGHT JOIN ilə sorğularda tez-tez NULL çıxır, onları düzgün başa düşmək və ya COALESCE() ilə əvəzləmək lazımdır.

Bu qədər! Artıq bilirsən ki, RIGHT JOIN necə işləyir, RIGHT JOINLEFT 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!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION