Hozirgacha biz har bir so'rovni bitta jadvaldan oldik. Lekin real ma'lumotlar bazasida ma'lumot ko'pincha bir nechta jadvalga taqsimlanadi. Bizning onlayn do'konimizda buyurtmalar haqidagi ma'lumot buyurtmalar jadvalida saqlanadi:
| 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: bu jadvalda mahsulotning nomi yo'q — faqat mahsulot_id (mahsulotning raqami) bor. Mahsulot nomlari esa boshqa, mahsulotlar jadvalida turadi:
| 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 |
Demak, agar "1-buyurtmada qanday mahsulot sotib olingan?" degan savolga javob bermoqchi bo'lsak, ikkita jadvalga ham qarashimiz kerak: buyurtmalar da mahsulot_id = 1, mahsulotlar da esa id = 1 bo'lgani Telefon. Mana shu ikki jadvalni bog'lash uchun JOIN ishlatiladi.
JOIN (to'liq nomi — INNER JOIN) ikkita jadvalni umumiy ustun (kalit) orqali birlashtiradi. Qaysi ustunlar mos kelishi kerakligini ON sharti bilan ko'rsatamiz.
Bizning holatimizda bog'lovchi kalit shu: buyurtmalar jadvalidagi mahsulot_id mahsulotlar jadvalidagi id ga teng bo'lishi kerak:
SELECT buyurtmalar.id, mahsulotlar.nomi
FROM buyurtmalar
JOIN mahsulotlar ON buyurtmalar.mahsulot_id = mahsulotlar.id;JOIN har bir buyurtma qatorini, mahsulot_id mos keladigan mahsulot qatori bilan bitta qatorga birlashtiradi. Natijada buyurtma raqami yonida mahsulotning nomi ham paydo bo'ladi:
1|Telefon
2|Kitob
3|Noutbuk
4|Ruchka
5|Quloqchin
6|Daftar
7|StulSo'rovning tuzilishi sodda: FROM da birinchi jadval, JOIN dan keyin ikkinchi jadval, ON dan keyin esa qaysi ustunlar mos kelishi kerakligi yoziladi.
Muhim: Ikkala jadvalda ham
idnomli ustun bor. Shuning uchun ustun nomidan oldin qaysi jadvalga tegishli ekanini yozib qo'yamiz:buyurtmalar.id,mahsulotlar.id. Bunday qilmasak, ma'lumotlar bazasi qaysiidni nazarda tutganimizni bilmaydi va xato beradi.
buyurtmalar.mahsulot_id kabi to'liq nomlarni qayta-qayta yozish charchatadi. Buni qisqartirish uchun jadvalga taxallus (alias) beramiz — jadval nomidan keyin qisqa harf yozamiz:
SELECT b.id, p.nomi
FROM buyurtmalar b
JOIN mahsulotlar p ON b.mahsulot_id = p.id;Bu yerda buyurtmalar jadvaliga b, mahsulotlar jadvaliga p taxallusini berdik. Endi buyurtmalar.id o'rniga qisqacha b.id, mahsulotlar.nomi o'rniga p.nomi deb yozsak bo'ladi. Natija avvalgisining xuddi o'zi:
1|Telefon
2|Kitob
3|Noutbuk
4|Ruchka
5|Quloqchin
6|Daftar
7|StulTaxallus so'rovni ancha qisqartiradi va o'qishni osonlashtiradi. Shuning uchun JOIN bilan ishlaganda taxallus ishlatish odatga aylangan.
Eslatma: Taxallusni tanlash erkin —
po'rnigamyokit1ham bo'laveradi. Odatda jadval nomining birinchi harfi tanlanadi (buyurtmalar→b,mahsulotlar→p, ya'ni "product").
SELECT da istalgan jadvaldan istalgan ustunni olishimiz mumkin. Masalan, mahsulot nomi yoniga buyurtma sonini (soni) ham qo'shamiz va natijani buyurtma raqami bo'yicha tartiblaymiz:
SELECT p.nomi, b.soni
FROM buyurtmalar b
JOIN mahsulotlar p ON b.mahsulot_id = p.id
ORDER BY b.id;Natija:
Telefon|1
Kitob|3
Noutbuk|1
Ruchka|10
Quloqchin|2
Daftar|5
Stul|4Muhim:
JOINnatijasidagi qatorlar tartibi kafolatlanmaydi. Natija aniq tartibda chiqishi uchun deyarli har doim oxirigaORDER BYqo'shing — bu yerda buyurtma raqami (b.id) bo'yicha tartibladik.
Pastdagi kod oynasida buyurtmalar va mahsulotlar jadvallari allaqachon yaratilgan va to'ldirilgan. Sizning vazifangiz — har bir buyurtma uchun buyurtma qilingan mahsulot nomini va sonini chiqaruvchi SELECT so'rovini yozish. Ikki jadvalni mahsulot_id orqali bog'lang va natijani buyurtma id si bo'yicha tartiblang.