Onlayn do'konimizda ma'lumot bitta jadvalda emas, balki bir nechta jadvalga bo'lib saqlanadi. Mahsulotlar haqidagi ma'lumot mahsulotlar jadvalida, har bir buyurtma esa buyurtmalar jadvalida turadi:
mahsulotlar jadvali:
| id | nomi | kategoriya | narx | ombor |
|---|---|---|---|---|
| 1 | Telefon | Elektronika | 5000000 | 10 |
| 2 | Noutbuk | Elektronika | 12000000 | 5 |
| 3 | Quloqchin | Elektronika | 300000 | 50 |
| 4 | Kitob | Kitoblar | 50000 | 100 |
| 5 | Daftar | Kanstovar | 8000 | 200 |
| 6 | Ruchka | Kanstovar | 3000 | 500 |
| 7 | Stol | Mebel | 800000 | 15 |
| 8 | Stul | Mebel | 250000 | 40 |
buyurtmalar jadvali:
| id | mijoz_id | mahsulot_id | soni | sana |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 2024-01-15 |
| 2 | 1 | 4 | 3 | 2024-01-20 |
| 3 | 2 | 2 | 1 | 2024-02-05 |
| 4 | 3 | 6 | 10 | 2024-02-10 |
| 5 | 5 | 3 | 2 | 2024-03-01 |
| 6 | 1 | 5 | 5 | 2024-03-15 |
| 7 | 6 | 8 | 4 | 2024-03-20 |
E'tibor bering: buyurtmalar jadvalida mahsulotning nomi yo'q — faqat mahsulot_id ustuni bor. Bu son mahsulotlar jadvalidagi id ga ishora qiladi. Masalan, 1-buyurtmada mahsulot_id = 1, demak bu Telefonga oid buyurtma.
Agar biz "qaysi buyurtmada qaysi mahsulot nomi sotilgan?" degan savolga javob bermoqchi bo'lsak, ikki jadvalni birga bog'lashimiz kerak. Mana shu yerda JOIN yordam beradi.
JOIN ikki jadvalni umumiy ustun orqali bir-biriga ulaydi. Bog'lash sharti ON so'zidan keyin yoziladi. Bizning holatda bog'lovchi shart — buyurtmalar.mahsulot_id qiymati mahsulotlar.id ga teng bo'lishi:
SELECT mahsulotlar.nomi, buyurtmalar.soni
FROM mahsulotlar
JOIN buyurtmalar ON mahsulotlar.id = buyurtmalar.mahsulot_id;Bu so'rov har bir buyurtmaga uning mahsulot nomini "yopishtirib" qo'yadi:
Telefon|1
Kitob|3
Noutbuk|1
Ruchka|10
Quloqchin|2
Daftar|5
Stul|4JOIN ishlash tartibi sodda: buyurtmalar jadvalidagi har bir qator uchun SQL mahsulotlar jadvalidan id si mos keladigan qatorni topadi va ikkalasini bitta qatorga birlashtiradi.
Eslatma: Ustun nomi ikkala jadvalda ham bo'lishi mumkin (masalan,
id). Chalkashlik bo'lmasligi uchun ustun oldiga jadval nomini yozamiz:mahsulotlar.id,buyurtmalar.mahsulot_id.
Har safar to'liq jadval nomini yozish uzun bo'ladi. Shuning uchun jadvalga qisqa nom (alias) beramiz — jadval nomidan keyin bitta harf yozsak yetadi. Quyida mahsulotlar uchun p, buyurtmalar uchun b aliasini ishlatamiz:
SELECT p.nomi, b.soni
FROM mahsulotlar p
JOIN buyurtmalar b ON p.id = b.mahsulot_id;Bu yuqoridagi so'rov bilan aynan bir xil ishlaydi, faqat yozishga qisqaroq va o'qishga qulayroq.
Endi eng qiziq qismi. JOIN bilan ikki jadvalni birlashtirgandan so'ng, natijani GROUP BY bilan guruhlab, har bir guruh uchun agregat hisoblashimiz mumkin.
Masalan, "har bir mahsulot jami necha dona buyurtma qilingan?" degan savolga javob beraylik. Buning uchun:
mahsulotlar va buyurtmalar ni JOIN bilan bog'laymiz,GROUP BY qilamiz,soni ustunini SUM bilan qo'shamiz.SELECT p.nomi, SUM(b.soni)
FROM mahsulotlar p
JOIN buyurtmalar b ON p.id = b.mahsulot_id
GROUP BY p.id
ORDER BY p.nomi;Natija — har bir mahsulot va uning jami buyurtma qilingan soni:
Daftar|5
Kitob|3
Noutbuk|1
Quloqchin|2
Ruchka|10
Stul|4
Telefon|1So'rovning tuzilishini bosqichma-bosqich tushunamiz:
FROM mahsulotlar p JOIN buyurtmalar b ON p.id = b.mahsulot_id — ikki jadvalni bog'laydi,GROUP BY p.id — natijadagi qatorlarni mahsulot bo'yicha guruhlarga bo'ladi,SUM(b.soni) — har bir guruh ichidagi soni qiymatlarini alohida qo'shadi,ORDER BY p.nomi — guruhlarni mahsulot nomi bo'yicha alifbo tartibida tartiblaydi.Muhim:
GROUP BY p.idbo'yicha guruhlaganimiz bilan,SELECTdap.nomini ko'rsatamiz. Har birido'ziga xos (unikal) bo'lgani uchun, bir guruhdagi barcha qatorlarning nomi ham bir xil bo'ladi — natija to'g'ri chiqadi.
So'rovlarda elementlar tartibi doimo bir xil: avval JOIN ... ON, keyin GROUP BY, eng oxirida ORDER BY.
Pastdagi kod oynasida mahsulotlar va buyurtmalar jadvallari allaqachon yaratilgan va to'ldirilgan. Sizning vazifangiz — ikki jadvalni JOIN bilan bog'lab, har bir buyurtma qilingan mahsulot uchun jami buyurtma qilingan sonini (SUM(soni)) hisoblang va natijani mahsulot nomi bo'yicha alifbo tartibida chiqaring.