Təsəvvür elə, səndə iki cədvəl var: tələbələrin siyahısı və onların kurslara yazılışları. Bütün tələbələr kurs seçməyib və sən bütün tələbələrin tam siyahısını görmək istəyirsən, hətta hansısa səbəbdən kurs seçməyənləri də. INNER JOIN ilə ancaq kursa yazılanları görəcəksən, bəs qalan tələbələr necə olsun? Bax, bunun üçün LEFT JOIN var.
LEFT JOIN sol cədvəldəki bütün sətirləri (sorğuda birinci göstərilən) və sağ cədvəldə uyğun gələn sətirləri qaytarır. Əgər uyğunluq yoxdursa, sağ cədvəlin sütunları üçün NULL dəyəri qaytarılır.
LEFT JOIN sintaksisi
SELECT
cedvel1.sutun1,
cedvel1.sutun2,
cedvel2.sutun1,
cedvel2.sutun2
FROM
cedvel1 LEFT JOIN cedvel2
ON
cedvel1.umumi_sutun = cedvel2.umumi_sutun;
cedvel1— "sol" cədvəldir.cedvel2— "sağ" cədvəldir.umumi_sutun— birləşmə üçün istifadə olunan ümumi sütundur.
Sadə nümunə
Əgər students cədvəli belədirsə:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
Və enrollments cədvəli belədirsə:
| enrollment_id | student_id | course |
|---|---|---|
| 1 | 1 | Riyaziyyat |
| 2 | 1 | Fizika |
| 3 | 2 | Biologiya |
Onda sorğu belə olacaq:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Nəticə:
| name | course |
|---|---|
| Otto | Riyaziyyat |
| Otto | Fizika |
| Anna | Biologiya |
| Peter | NULL |
Gördüyün kimi, nəticədə bütün tələbələr qalıb, hətta Peter də, hansı ki, hələ heç bir kursa yazılmayıb. Peter üçün course sütununda NULL yazılıb.
LEFT JOIN istifadəsinə nümunələr
Nümunə 1: Bütün tələbələrin və onların kurslarının siyahısını almaq
Tapşırıq belədir: bütün tələbələrin siyahısını və onların yazıldığı kursları əldə etmək lazımdır. Əgər tələbə hələ kurs seçməyibsə, bu da göstərilməlidir.
Eyni sorğu:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Nəticə:
| name | course |
|---|---|
| Otto | Riyaziyyat |
| Otto | Fizika |
| Anna | Biologiya |
| Peter | NULL |
Bu, LEFT JOIN istifadəsinin klassik nümunəsidir.
Nümunə 2: Məhsullar və onların satışları
Tutaq ki, səndə iki cədvəl var:
Bütün məhsulları saxlayan products cədvəli:
| product_id | product_name |
|---|---|
| 1 | Smartfon |
| 2 | Planşet |
| 3 | Noutbuk |
Satış məlumatlarını saxlayan sales cədvəli:
| sale_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 5 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
İndi isə bütün məhsulları və onların satış sayını görmək istəyirsən, hətta satılmayan məhsullar da daxil olmaqla.
SELECT
products.product_name,
SUM(sales.quantity) AS total_sold
FROM
products LEFT JOIN sales
ON
products.product_id = sales.product_id
GROUP BY
products.product_name;
Nəticə:
| product_name | total_sold |
|---|---|
| Smartfon | 8 |
| Planşet | 2 |
| Noutbuk | NULL |
LEFT JOIN istifadə edəndə xüsusiyyətlər və problemlər
Həmişə NULL lazımdır?
Bəzən LEFT JOIN orda NULL verir ki, sən gözləmirdin. Belə hallarda NULL-u başa düşülən dəyərlə əvəz etmək üçün COALESCE() funksiyasından istifadə edə bilərsən.
SELECT
students.name,
COALESCE(enrollments.course, 'Kurs seçilməyib') AS course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Nəticə:
| name | course |
|---|---|
| Otto | Riyaziyyat |
| Otto | Fizika |
| Anna | Biologiya |
| Peter | Kurs seçilməyib |
Lazımsız təkrarlar
Əgər sağ cədvəldə təkrarlanan məlumatlar varsa, sorğunun nəticəsində gözlədiyindən çox sətir ola bilər. İşlədiyin dataya diqqət elə və əgər təkrarlar lazım deyilsə, DISTINCT istifadə et.
GO TO FULL VERSION