Bu gün ən demokratik məlumat birləşdirmə üsuluna baxacağıq — FULL OUTER JOIN. Burada hamı nəticəyə düşür, hətta cütü olmayanlar da.
FULL OUTER JOIN — bu elə bir birləşdirmə növüdür ki, hər iki cədvəldəki bütün sətirlər qaytarılır. Əgər bir cədvəldəki sətrin digərində uyğunluğu yoxdursa, nəticədə həmin sütunlar üçün NULL yazılır. Bu, sanki iki fərqli party-yə gələn bütün adamların siyahısını tutmaq kimidir: biri yalnız birinə gəlibsə də, yenə də siyahıda olacaq.
Bunu vizual olaraq belə təsəvvür etmək olar:
Cədvəl A Cədvəl B
+----+----------+ +----+----------+
| id | ad | | id | kurs |
+----+----------+ +----+----------+
| 1 | Alice | | 2 | Riyaziyyat|
| 2 | Bob | | 3 | Fizika |
| 4 | Charlie | | 5 | Tarix |
+----+----------+ +----+----------+
FULL OUTER JOIN NƏTİCƏ:
+----+----------+----------+
| id | ad | kurs |
+----+----------+----------+
| 1 | Alice | NULL |
| 2 | Bob | Riyaziyyat|
| 3 | NULL | Fizika |
| 4 | Charlie | NULL |
| 5 | NULL | Tarix |
+----+----------+----------+
Uyğunluğu olmayan sətirlər saxlanılır, amma olmayan sütunlar üçün NULL yazılır.
FULL OUTER JOIN Sintaksisi
Sintaksis sadədir, amma gücü böyükdür:
SELECT
sütunlar
FROM
cədvəl1
FULL OUTER JOIN
cədvəl2
ON cədvəl1.ümumi_sütun = cədvəl2.ümumi_sütun;
Əsas hissə — FULL OUTER JOIN, hansı ki, PostgreSQL-ə hər iki cədvəldəki bütün sətirləri götürməyə məcbur edir. Əgər ON şərtinə görə cüt tapılmırsa, həmin dəyərlər NULL olur.
İstifadə nümunələri
Gəlin tanış university bazası üzərində real nümunələrə baxaq, burada students və enrollments cədvəlləri var.
Nümunə 1: bütün tələbə və kursların siyahısı
Təsəvvür et ki, iki cədvəlimiz var:
students cədvəli:
| student_id | ad |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
enrollments cədvəli:
| enrollment_id | student_id | kurs |
|---|---|---|
| 101 | 1 | Riyaziyyat |
| 102 | 2 | Fizika |
| 103 | 4 | Tarix |
Məqsədimiz — bütün tələbə və kursların tam siyahısını almaqdır, yəni kursa yazılmayan tələbələr və tələbəsi olmayan kurslar da daxil olsun.
Budur sorğu:
SELECT
s.student_id,
s.ad,
e.kurs
FROM
students s
FULL OUTER JOIN
enrollments e
ON
s.student_id = e.student_id;
Nəticə:
| student_id | ad | kurs |
|---|---|---|
| 1 | Alice | Riyaziyyat |
| 2 | Bob | Fizika |
| 3 | Charlie | NULL |
| NULL | NULL | Tarix |
Gördüyün kimi, nəticədə bütün tələbələr və bütün kurslar var. Charlie kursa yazılmayıb, ona görə kurs sütunu NULL oldu. Tarix kursunun isə tələbəsi yoxdur, ona görə student_id və ad NULL oldu.
Nümunə 2: Satış və məhsulların analizi
İndi isə mağaza nümunəsinə baxaq. İki cədvəlimiz var:
products cədvəli:
| product_id | ad |
|---|---|
| 1 | Laptop |
| 2 | Smartphone |
| 3 | Printer |
sales cədvəli:
| sale_id | product_id | miqdar |
|---|---|---|
| 101 | 1 | 5 |
| 102 | 3 | 2 |
| 103 | 4 | 10 |
Bütün məhsullar və satışların tam siyahısını almaq istəyirik, yəni satılmayan məhsullar və səhv product_id ilə olan satışlar da daxil olsun.
Sorğu:
SELECT
p.product_id,
p.ad AS product_name,
s.miqdar
FROM
products p
FULL OUTER JOIN
sales s
ON
p.product_id = s.product_id;
Nəticə:
| product_id | product_name | miqdar |
|---|---|---|
| 1 | Laptop | 5 |
| 2 | Smartphone | NULL |
| 3 | Printer | 2 |
| NULL | NULL | 10 |
Burada görürük ki, Smartphone satılmayıb (miqdar = NULL), və product_id = 4 olan satış heç bir məhsula uyğun gəlmir.
Praktiki tapşırıq
İndi isə departments və employees cədvəlləri üçün sorğu yazmağa çalış:
departments cədvəli:
| department_id | department_name |
|---|---|
| 1 | HR |
| 2 | IT |
| 3 | Marketing |
employees cədvəli:
| employee_id | department_id | ad |
|---|---|---|
| 101 | 1 | Alice |
| 102 | 2 | Bob |
| 103 | 4 | Charlie |
FULL OUTER JOIN ilə tam departament və işçi siyahısı çıxart. Olmayan məlumatları NULL ilə doldur.
NULL dəyərləri necə işləməli
NULL dəyərləri — FULL OUTER JOIN istifadə edəndə qaçılmazdır. Məsələn, real tapşırıqlarda NULL əvəzinə daha mənalı dəyərlər göstərmək lazım ola bilər. PostgreSQL-də bunu COALESCE() funksiyası ilə edə bilərsən.
Nümunə:
SELECT
COALESCE(s.ad, 'Tələbə yoxdur') AS student_name,
COALESCE(e.kurs, 'Kurs yoxdur') AS course_name
FROM
students s
FULL OUTER JOIN
enrollments e
ON
s.student_id = e.student_id;
Nəticə:
| student_name | course_name |
|---|---|
| Alice | Riyaziyyat |
| Bob | Fizika |
| Charlie | Kurs yoxdur |
| Tələbə yoxdur | Tarix |
İndi NULL əvəzinə daha aydın dəyərlər görürük, bu da hesabatları oxunaqlı edir.
FULL OUTER JOIN nə vaxt istifadə etməli
FULL OUTER JOIN o vaxt faydalıdır ki, hər iki cədvəldəki bütün məlumatları görmək lazımdır, hətta tam uyğunluq olmasa belə. Nümunələr:
- Satış və məhsul hesabatları — həm satılan, həm də satılmayan məhsulları görmək üçün.
- Tələbə və kurs analizi — qeydə alınmayan məlumatları yoxlamaq üçün.
- Siyahıların müqayisəsi — məsələn, iki məlumat dəsti arasında uyğunsuzluqları tapmaq üçün.
Ümid edirəm bu leksiya sənə FULL OUTER JOIN barədə yaxşı təsəvvür verdi. İndi isə səni daha maraqlı birləşdirmələr və məlumat işləmə dünyası gözləyir!
GO TO FULL VERSION