# SQL JOIN turlari: INNER, LEFT, RIGHT, FULL

> SQL JOIN turlari farqi: INNER, LEFT, RIGHT va FULL JOIN. Buyurtma qilmagan mijozni ham ko'rsatish va qaysi holatda qaysi JOIN kerakligini o'rganamiz.

Manba: https://learncode.uz/sql/join-turlari/
Sana: 2026-06-15

Avvalgi darsda [JOIN bilan jadvallarni bog'lashni](https://learncode.uz/sql/join) ko'rdik. U
paytda ishlatgan oddiy `JOIN` — aslida `INNER JOIN`, ya'ni faqat ikkala
jadvalda **mos** bo'lgan qatorlarni beradi. Lekin ba'zan mos kelmaganlarni
ham ko'rsatish kerak bo'ladi. Shu yerda JOIN **turlari** ish beradi.

Eslatib o'tamiz: `mijozlar` da to'rt kishi bor, lekin **Malika** (`id` 4)
hech narsa buyurtma qilmagan.

## INNER JOIN — faqat mos qatorlar

Bu — standart tur. Faqat bog'lovchi shart bajarilgan qatorlar chiqadi:

```sql
SELECT m.ism, b.mahsulot_id
FROM mijozlar AS m
INNER JOIN buyurtmalar AS b ON m.id = b.mijoz_id;
```

O'zingiz ishga tushirib ko'ring — so'rovni tahrirlashingiz ham mumkin:

```sql
SELECT m.ism, b.id AS buyurtma
FROM mijozlar AS m
LEFT JOIN buyurtmalar AS b ON b.mijoz_id = m.id;
```

Natijada Malika **yo'q** — chunki uning buyurtmasi yo'q, mos qator topilmadi.
Aziz, Dilnoza va Bobur o'z buyurtmalari bilan chiqadi. `JOIN` va `INNER JOIN`
— bir xil narsa, `INNER` so'zini yozmasa ham bo'ladi.

## LEFT JOIN — chap jadvaldagi hammani saqlaydi

`LEFT JOIN` **chap** jadvaldagi (FROM dan keyingi) barcha qatorlarni
qaytaradi. O'ng jadvalda mos yo'q bo'lsa — ustunlar `NULL` bilan to'ldiriladi:

```sql
SELECT m.ism, b.mahsulot_id, b.soni
FROM mijozlar AS m
LEFT JOIN buyurtmalar AS b ON m.id = b.mijoz_id;
```

Natija — endi Malika ham bor:

| ism | mahsulot_id | soni |
|---|---|---|
| Aziz | 2 | 3 |
| Aziz | 4 | 1 |
| Aziz | 7 | 4 |
| Dilnoza | 1 | 10 |
| Dilnoza | 8 | 5 |
| Bobur | 3 | 2 |
| Malika | NULL | NULL |

Malika qatorida buyurtma ustunlari [`NULL`](https://learncode.uz/sql/null-va-distinct) — "qiymat
yo'q" degani. Aynan shu LEFT JOIN'ning kuchi: "hamma mijozni ko'rsat, buyurtma
bor-yo'qligidan qat'i nazar".

<Callout type="example" title="O'zingizni sinab ko'ring">
Hech narsa buyurtma qilmagan mijozlarni topish — LEFT JOIN'ning mashhur ishi:

```sql
SELECT m.ism
FROM mijozlar AS m
LEFT JOIN buyurtmalar AS b ON m.id = b.mijoz_id
WHERE b.id IS NULL;
```

Natija: faqat **Malika**. Avval hamma mijoz olinadi, keyin buyurtmasi
`NULL` bo'lganlari filtrlanadi.
</Callout>

## RIGHT JOIN — o'ng jadvaldagi hammani saqlaydi

`RIGHT JOIN` — LEFT'ning ko'zgudagi aksi: bu safar **o'ng** jadvaldagi hamma
qator saqlanadi. Amalda uni kamroq ishlatishadi, chunki jadvallar o'rnini
almashtirib, o'sha natijani LEFT JOIN bilan ham olsa bo'ladi:

```sql
-- Bu ikkisi bir xil natija beradi:
SELECT * FROM mijozlar AS m RIGHT JOIN buyurtmalar AS b ON m.id = b.mijoz_id;
SELECT * FROM buyurtmalar AS b LEFT JOIN mijozlar AS m ON b.mijoz_id = m.id;
```

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> Eski SQLite versiyalari `RIGHT JOIN` va `FULL JOIN` ni qo'llab-quvvatlamas
> edi (faqat 3.39, 2022-yildan qo'shildi). Agar xato chiqsa — jadvallarni
> almashtirib `LEFT JOIN` ishlating, natija bir xil bo'ladi. MySQL va
> PostgreSQL'da ikkalasi ham azaldan mavjud.

## FULL JOIN — ikkala tarafdagi hammani saqlaydi

`FULL JOIN` (to'liq nomi `FULL OUTER JOIN`) — LEFT va RIGHT ning birlashmasi:
ikkala jadvaldagi barcha qatorlar chiqadi, mos kelmaganlari `NULL` bilan.
U mijozlar va buyurtmalarni **umuman yo'qotmasdan** yonma-yon qo'yish kerak
bo'lganda ishlatiladi.

## Qaysi JOIN qachon kerak

| Savol | JOIN turi |
|---|---|
| Faqat mos qatorlar kerakmi? | INNER JOIN |
| Chap jadvaldan hamma kerakmi? | LEFT JOIN |
| O'ng jadvaldan hamma kerakmi? | RIGHT JOIN |
| Ikkala tarafdan ham hamma kerakmi? | FULL JOIN |

Amalda ko'p ishlatiladigan ikkitasi — **INNER** va **LEFT**. Shu ikkisini
puxta bilsangiz, JOIN masalalarining aksari yechiladi.

## Amaliy mashq

JOIN turlarini solishtiring:

1. `mijozlar` va `buyurtmalar` ni `INNER JOIN` bilan bog'lang;
2. xuddi shuni `LEFT JOIN` bilan yozing;
3. ikki natijadagi qatorlar sonini solishtiring;
4. `LEFT JOIN` da NULL chiqqan qatorni toping — bu kim?
5. `WHERE b.id IS NULL` qo'shib, hech narsa buyurtma qilmaganlarni ajrating;
6. Endi `mahsulotlar` ni chap jadval qiling: `LEFT JOIN buyurtmalar` va
   `GROUP BY` bilan har mahsulot necha marta buyurtma qilinganini sanang —
   qaysi ikki tovar `0` bilan chiqdi?

Malika nega faqat `LEFT JOIN` natijasida ko'rinadi?

## Qisqacha xulosa

- `INNER JOIN` (oddiy `JOIN`) — faqat **ikkala** jadvalda mos qatorlar.
- `LEFT JOIN` — **chap** jadvaldan hamma; mos yo'q joyda `NULL`.
- `RIGHT JOIN` — o'ngdan hamma; jadvalni almashtirib LEFT bilan ham bo'ladi.
- `FULL JOIN` — ikkala tarafdan hamma qator.
- `WHERE b.id IS NULL` bilan LEFT JOIN "mos kelmaganlarni" topadi (masalan
  buyurtmasiz mijozlar).

Keyingi darsda [`HAVING`](https://learncode.uz/sql/having) — guruhlangan natijani, ya'ni
[`GROUP BY`](https://learncode.uz/sql/group-by) chiqargan guruhlarni filtrlashni ko'ramiz.
