SELF JOIN ilə verilənlərin öz-özünə birləşdirilməsi SELF JOIN
SELF JOIN — cədvəlin özü ilə birləşdirilməsi üsuludur. İlk baxışda qəribə görünə bilər: niyə cədvəli özü ilə birləşdirək ki? Amma real həyatda belə tapşırıqlar tez-tez olur. Məsələn, təsəvvür elə ki, səndə işçilər cədvəli var və hər işçinin meneceri var. Menecer özü də işçidir, yəni onun məlumatları da həmin cədvəldədir. SELF JOIN bizə işçiləri onların menecerləri ilə uyğunlaşdırmağa kömək edəcək.
Rəsmi desək, SELF JOIN — adi JOIN-dir, sadəcə burada eyni cədvəldən iki dəfə istifadə edirik, ona fərqli alias-lar (və ya ləqəblər) veririk ki, "versiyaları" fərqləndirək.
SELF JOIN istifadə oluna bilər:
- Iyerarxik əlaqələr üçün: "valideyn-övlad" münasibətləri qurmaq, məsələn, işçi və onun meneceri.
- Cədvəl daxilində verilənlərin analizi üçün: cədvəldəki qeydləri müqayisə etmək, məsələn, oxşar məhsullar və ya hadisələri tapmaq.
- Təkrarlanan məntiqi olan strukturlara mürəkkəb sorğular üçün.
SELF JOIN sintaksisi
Daha aydın olsun deyə, SELF JOIN-in sadələşdirilmiş sintaksisinə baxaq:
SELECT
A.column_name,
B.column_name
FROM
table_name A
JOIN
table_name B
ON
A.common_column = B.common_column;
Burada:
table_name Avətable_name B— eyni cədvəldir, sadəcə fərqli alias-larla.A.common_columnvəB.common_column— qeydləri birləşdirmək üçün istifadə olunan sütunlardır.
Alias-lar (A və B) ona görə lazımdır ki, DBMS "başa düşsün" sən cədvəlin hansı "nüsxəsi" ilə işləyirsən.
SELF JOIN istifadə nümunələri
Nümunə 1: işçilər və onların menecerlərinin siyahısı
Deməli, bizdə belə bir employees cədvəli var:
| employee_id | name | manager_id |
|---|---|---|
| 1 | Alex Lin | NULL |
| 2 | Maria Chi | 1 |
| 3 | Otto Song | 1 |
| 4 | Nina Zhao | 2 |
Bu cədvəldə:
employee_id— işçinin identifikatoru.name— işçinin adı.manager_id— menecerin identifikatoru, o da başqa bir işçininemployee_id-sidir.
Tapşırıq: işçilərin və onların menecerlərinin siyahısını əldə et.
Bu tapşırıq SELF JOIN ilə belə həll olunur:
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
employees e
LEFT JOIN
employees m
ON
e.manager_id = m.employee_id;
Nəticə:
| employee_name | manager_name |
|---|---|
| Alex Lin | NULL |
| Maria Chi | Alex Lin |
| Otto Song | Alex Lin |
| Nina Zhao | Maria Chi |
Burada:
ecədvəli — "işçilər"dir.mcədvəli — yenə "işçilər"dir, amma "menecer" rolunda.
Alex Lin-in meneceri yoxdur manager_id = NULL, ona görə nəticədə manager_name sahəsi boş olacaq.
Nümunə 2: Oxşar məhsulların axtarışı
Tutaq ki, bizdə products cədvəli var:
| product_id | product_name | category |
|---|---|---|
| 1 | Xolodilnik | Texnika |
| 2 | Stiralnaya maşın | Texnika |
| 3 | Smartfon | Gadjetlər |
| 4 | Planşet | Gadjetlər |
Tapşırıq: eyni kateqoriyaya aid məhsul cütlərini tap.
SELF JOIN istifadə edərək həll:
SELECT
p1.product_name AS product_1,
p2.product_name AS product_2
FROM
products p1
JOIN
products p2
ON
p1.category = p2.category
AND
p1.product_id < p2.product_id;
Nəticə:
| product_1 | product_2 |
|---|---|
| Xolodilnik | Stiralnaya maşın |
| Smartfon | Planşet |
p1.product_id < p2.product_id şərtinə fikir ver. Bu, cütlüklərin təkrarlanmasının qarşısını alır, məsələn, nəticədə həm Xolodilnik — Stiralnaya maşın, həm də Stiralnaya maşın — Xolodilnik kimi sətirlər çıxmasın deyə.
Nümunə 3: İyerarxiyaların analizi (valideynlər və övladlar)
Başqa bir nümunəyə baxaq. Tutaq ki, bizdə categories cədvəli var:
| category_id | category_name | parent_id |
|---|---|---|
| 1 | Texnika | NULL |
| 2 | Gadjetlər | 1 |
| 3 | Kompüterlər | 1 |
| 4 | Smartfonlar | 2 |
Burada:
category_id— kateqoriyanın identifikatoru.category_name— kateqoriyanın adı.parent_id— valideyn kateqoriyanın identifikatoru.
Tapşırıq: kateqoriyaları və onların valideyn kateqoriyalarını uyğunlaşdır.
Sorgu:
SELECT
c1.category_name AS child_category,
c2.category_name AS parent_category
FROM
categories c1
LEFT JOIN
categories c2
ON
c1.parent_id = c2.category_id;
Nəticə:
| child_category | parent_category |
|---|---|
| Texnika | NULL |
| Gadjetlər | Texnika |
| Kompüterlər | Texnika |
| Smartfonlar | Gadjetlər |
SELF JOIN istifadə edərkən tipik səhvlər
Alias-ları (ləqəbləri) göstərməyi unutmaq: əgər alias istifadə etməsən, cədvəlin bir "nüsxəsini" digərindən ayırmaq mümkün olmur.
Sikliki istinadlar: əgər verilənlərdə siklik istinadlar varsa (məsələn, işçi özü-özünə menecerdirsə), bu, gözlənilməz nəticələrə gətirib çıxara bilər.
Nəticələrin təkrarlanması: nəticələri filtr etməyi unutma (məsələn, p1.product_id < p2.product_id ilə), təkrarlanmadan qaçmaq üçün.
SELF JOIN — verilənlərlə işləyərkən güclü alətdir və onu düzgün istifadə etsən, iyerarxiyalar, cədvəl daxilində əlaqələr və verilənlərin analizi ilə bağlı mürəkkəb tapşırıqları həll edə bilərsən. Ümid edirəm, indi görürsən ki, SQL aləmində bu "selfie" nə qədər faydalıdır!
GO TO FULL VERSION