CodeGym /Kurslar /SQL SELF /SELF JOIN ilə verilənlərin öz-özünə birləşdirilməsi

SELF JOIN ilə verilənlərin öz-özünə birləşdirilməsi

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

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 Atable_name B — eyni cədvəldir, sadəcə fərqli alias-larla.
  • A.common_columnB.common_column — qeydləri birləşdirmək üçün istifadə olunan sütunlardır.

Alias-lar (AB) 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şçinin employee_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:

  • e cədvəli — "işçilər"dir.
  • m cə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!

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