Keçən dərsdə SQL-də hansı JOIN tipləri olduğunu danışdıq. Bu gün isə INNER JOIN mövzusuna daha yaxından baxacağıq.
INNER JOIN — relasion bazalarda məlumatların birləşdirilməsi tipidir, hansı ki, iki cədvəldən sətirləri götürüb yalnız sənin təyin etdiyin şərtə uyğun "uyğun gələn" sətirləri qaytarır. Yəni, INNER JOIN yalnız iki cədvəlin kəsişən hissələrini qaytarır, qalan hər şeyi saymır.
Gəlin təsəvvür edək ki, səndə iki qutu var. Birində tələbələrin kartları, digərində isə tələbələrin qeydiyyatdan keçdiyi kursların kartları var. Sən bilmək istəyirsən ki, hansı tələbə hansı kursa yazılıb. Əgər uyğunluq yoxdursa (məsələn, tələbə heç bir yerə yazılmayıbsa), bu məlumatlar bizi hələ maraqlandırmır. Belə bir ssenari üçün INNER JOIN superdir.
INNER JOIN Sintaksisi
Sintaksis çox sadədir — birləşdirmək istədiyin iki cədvəli göstərirsən və birləşdirmə şərtini ON açar sözü ilə yazırsan.
SELECT sütunlar
FROM cədvəl1 INNER JOIN cədvəl2
ON cədvəl1.sahə = cədvəl2.sahə;
cədvəl1vəcədvəl2— birləşdirmək istədiyin cədvəllərdir.sahə— uyğunluq aparılan sütunlardır.ON-dan sonra olan şərt hər iki cədvəldə sətirlərin necə uyğunlaşdırılacağını göstərir.
INNER JOIN istifadə nümunələri
Davam edən nümunələr üçün iki cədvəllə işləyəcəyik:
students cədvəli — tələbələr haqqında məlumatlar
| student_id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Anna | 22 |
| 3 | Peter | 19 |
| 4 | Dia | 21 |
enrollments cədvəli — kurslara yazılışlar haqqında məlumatlar
| enrollment_id | student_id | course_id |
|---|---|---|
| 101 | 1 | 501 |
| 102 | 2 | 502 |
| 103 | 2 | 503 |
| 104 | 3 | 504 |
Diqqət et, Dia tələbəsi (student_id = 4) heç bir kursa yazılmayıb.
Nümunə 1: Tələbələr və onların kursları haqqında məlumat almaq
Biz bilmək istəyirik ki, hansı tələbələr kurslara yazılıb. Bu, INNER JOIN üçün tipik nümunədir. Bizə yalnız students və enrollments cədvəllərində student_id əsasında uyğunluq olanlar maraqlıdır.
SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;
Nəticə:
| name | course_id |
|---|---|
| Otto | 501 |
| Anna | 502 |
| Anna | 503 |
| Peter | 504 |
Nə görürük? INNER JOIN yalnız kurslara yazılan tələbələri qaytardı. Dia tələbəsi isə heç bir kursa yazılmadığı üçün nəticədə yoxdur.
Nümunə 2: Sifarişlər və müştərilər haqqında məlumat almaq
İndi başqa bir nümunəyə baxaq. Tutaq ki, bizdə orders (sifarişlər) və customers (müştərilər) cədvəlləri var. Biz bütün sifarişləri müştəri adları ilə birlikdə almaq istəyirik.
orders cədvəli
| order_id | customer_id | amount |
|---|---|---|
| 1 | 101 | 500 |
| 2 | 102 | 300 |
| 3 | 103 | 700 |
customers cədvəli
| customer_id | name |
|---|---|
| 101 | Otto |
| 102 | Anna |
| 104 | Peter |
Tapşırıq: orders və customers cədvəllərini customer_id üzrə birləşdirib yalnız uyğun müştərisi olan sifarişləri qaytarmalıyıq.
SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;
Nəticə:
| order_id | name | amount |
|---|---|---|
| 1 | Otto | 500 |
| 2 | Anna | 300 |
Diqqət et, order_id = 3 olan sifariş nəticəyə düşməyib, çünki customer_id = 103 olan müştəri customers cədvəlində yoxdur.
INNER JOIN cədvəlləri necə birləşdirir (və nə səhv ola bilər)
INNER JOIN — relasion bazada işləyəcəyin istənilən layihədə ən əsas alətdir. Bu, sanki alət dəstindəki açar kimidir: onsuz da nəsə edə bilərsən, amma nəticə əldə etmək çətin olacaq. Məsələn:
- Bir neçə cədvəldən məlumatları birləşdirib hesabat hazırlayanda.
- Analitika quranda, faktları ölçülərlə birləşdirəndə (məsələn, satışlar və müştərilər).
- Başqa sistemlərin məlumatlarını inteqrasiya edəndə.
Yeni başlayanların ən çox etdiyi səhv — ON yazmağı unutmaq və ya birləşdirmə şərtini səhv göstərməkdir. Əgər düzgün şərt yazmasan, gözlədiyin nəticə əvəzinə iki cədvəlin dekart hasilini alacaqsan — bu minlərlə, hətta milyonlarla mənasız sətir ola bilər.
Səhv nümunəsi:
Bu nümunədə birləşdirmə şərti yoxdur, ona görə də sorğu iki cədvəldəki bütün mümkün sətir kombinasiyalarını yaradacaq (və bu, çox güman ki, istədiyin deyil):
SELECT students.name, enrollments.course_id
FROM students, enrollments; -- SƏHV: birləşdirmə şərti yoxdur!
Nəticə tam xaos olacaq: students cədvəlindəki hər bir sətir enrollments cədvəlindəki hər bir sətirlə birləşəcək.
GO TO FULL VERSION