CodeGym /Kurslar /SQL SELF /FULL OUTER JOIN ilə məlumatların tam birləşdirilməsi

FULL OUTER JOIN ilə məlumatların tam birləşdirilməsi

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

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 studentsenrollments 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_idad 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ə departmentsemployees 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!

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Məlumatların birləşdirilməsi
Məlumatların birləşdirilməsi
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION