# SQL JOIN — jadvallarni bog'lash

> SQL JOIN bilan bir nechta jadvalni bog'lash: ON sharti orqali ustunlarni ulash, ikki va uch jadvalni birlashtirish hamda chet kalit tushunchasi.

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

Shu paytgacha bitta jadval bilan ishladik. Haqiqiy bazada esa ma'lumot
bir nechta jadvalga **bo'lingan** bo'ladi. Masalan buyurtmada faqat mijoz
raqami turadi, ismi emas. Bu jadvallarni birlashtirish uchun **`JOIN`**
ishlatiladi — bu SQL'ning eng kuchli imkoniyati.

Namuna bazadagi `buyurtmalar` jadvali:

| id | mijoz_id | mahsulot_id | soni | sana |
|---|---|---|---|---|
| 1 | 1 | 2 | 3 | 2026-07-01 |
| 2 | 1 | 4 | 1 | 2026-07-02 |
| 3 | 2 | 1 | 10 | 2026-07-02 |
| 4 | 3 | 3 | 2 | 2026-07-05 |
| 5 | 2 | 8 | 5 | 2026-07-06 |
| 6 | 1 | 7 | 4 | 2026-07-08 |

## Nega ma'lumot bo'lingan

`buyurtmalar` da mijozning **ismi** yo'q — faqat `mijoz_id` (raqami).
Sabab: agar har buyurtmada ism, shahar, yoshi takrorlansa, ma'lumot
ko'payadi va mijoz ismini o'zgartirish kerak bo'lsa, uni yuzta joyda
tuzatishga to'g'ri kelardi. Shuning uchun mijoz ma'lumoti bir marta
`mijozlar` da saqlanadi, buyurtma esa faqat uning raqamiga **ishora**
qiladi.

`JOIN` shu ishorani ochadi: raqam orqali `mijozlar` dan ismni topib,
buyurtmaga qo'shib beradi.

## JOIN — ikki jadvalni birlashtirish

Har buyurtmani mijoz ismi bilan ko'ramiz. `buyurtmalar` va `mijozlar` ni
`mijoz_id` orqali bog'laymiz:

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

Natija — endi raqam o'rniga ism:

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

`ON b.mijoz_id = m.id` — **bog'lovchi shart**: buyurtmadagi `mijoz_id`
mijozdagi `id` ga teng bo'lgan qatorlar birlashtiriladi. `b` va `m` —
[jadval taxalluslari](https://learncode.uz/sql/as-taxallus): qaysi ustun qaysi jadvaldan
ekanini ko'rsatadi.

> **Atama**
>
> **Chet kalit** (foreign key) — bir jadvaldagi ustun boshqa jadvalning
> kalitiga (`id`) ishora qilsa, u chet kalit deyiladi. `buyurtmalar.mijoz_id`
> — `mijozlar.id` ga chet kalit. Jadvallar aynan shu ishoralar orqali
> bog'lanadi, `JOIN` esa ularni qayta birlashtiradi.

## Uch jadvalni bog'lash

`mahsulot_id` ham raqam. Uni ham nomga aylantirish uchun yana bitta `JOIN`
qo'shamiz — bu safar `mahsulotlar` bilan:

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

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

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

Natija — to'liq o'qiladigan ko'rinish: kim, nimani, nechta:

| ism | nom | soni |
|---|---|---|
| Aziz | Non | 3 |
| Aziz | Choy | 1 |
| Dilnoza | Olma | 10 |
| Bobur | Sut | 2 |
| Dilnoza | Guruch | 5 |
| Aziz | Suv | 4 |

Endi natija odam o'qiy oladigan holga keldi — hech qanday raqam qolmadi.

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> `JOIN` (aniqrog'i `INNER JOIN`) faqat **ikkala jadvalda mos** bo'lgan
> qatorlarni qaytaradi. Malika (`id` 4) hech narsa buyurtma qilmagan, shuning
> uchun u natijada **yo'q**. Buyurtma qilmaganlarni ham ko'rsatmoqchi
> bo'lsangiz, boshqa tur — `LEFT JOIN` kerak (buni o'rta darslarda ko'ramiz).

<Callout type="example" title="O'zingizni sinab ko'ring">
Namuna bazangizda sinang — bog'lashga `WHERE` ham qo'shsa bo'ladi:

```sql
SELECT m.ism, p.nom, b.soni, b.sana
FROM buyurtmalar AS b
JOIN mijozlar AS m ON b.mijoz_id = m.id
JOIN mahsulotlar AS p ON b.mahsulot_id = p.id
WHERE m.ism = 'Aziz';
```

Bu faqat Azizning buyurtmalarini beradi (Non, Choy, Suv). `JOIN` bilan
`WHERE` birga ishlaydi: avval jadvallar bog'lanadi, keyin natija filtrlanadi.
</Callout>

## Amaliy mashq

Jadvallarni bog'lang:

1. `buyurtmalar` va `mijozlar` ni `mijoz_id` orqali bog'lang;
2. natijaga mijoz ismi va buyurtma sonini chiqaring;
3. uchinchi jadval `mahsulotlar` ni ham qo'shing;
4. har buyurtma uchun: kim, nima, nechta — uch ustunda ko'rsating;
5. `ON` shartini ataylab noto'g'ri yozing — natija qanday o'zgardi?
6. Uch jadvalli so'rovga `WHERE mi.shahar = 'Toshkent'` qo'shing — faqat
   toshkentliklarning buyurtmalari qoldimi?

5-qadamda nechta qator chiqdi va nega?

## Qisqacha xulosa

- Ma'lumot takrorlanmasligi uchun jadvallarga **bo'linadi**; buyurtmada
  ism emas, `mijoz_id` (raqam) turadi.
- `JOIN ... ON` — ikki jadvalni bog'lovchi shart orqali birlashtiradi:
  `ON b.mijoz_id = m.id`.
- **Chet kalit** — boshqa jadvalning `id` siga ishora qiluvchi ustun.
- Bir nechta `JOIN` bilan uch va undan ko'p jadvalni birlashtirish mumkin.
- `JOIN` (INNER) faqat **mos** qatorlarni beradi; mos kelmaganlar tushadi.

Keyingi darsda [`GROUP BY`](https://learncode.uz/sql/group-by) — qatorlarni **guruhlab**,
har guruh uchun umumiy hisob chiqarishni ko'ramiz.
