Hozirgacha biz ko'pincha bitta jadval bilan ishladik. Lekin haqiqiy ma'lumotlar bazasida ma'lumot bir nechta jadvalga ajratiladi. Bizning onlayn do'konimizda uchta jadval bor:
mahsulotlar — sotiladigan tovarlar (id, nomi, kategoriya, narx, ombor).mijozlar — xaridorlar (id, ism, shahar, yosh).buyurtmalar — kim qaysi mahsulotni qachon sotib olgani (id, mijoz_id, mahsulot_id, soni, sana).Tasavvur qiling, hammasini bitta jadvalga jamlaganimizda, har bir buyurtmada mijozning ismi, shahri, mahsulotning nomi, narxi — hammasi qayta-qayta takrorlanardi. Ali to'rt marta xarid qilsa, uning ismi va shahri to'rt marta yozilardi. Ma'lumotni jadvallarga ajratish esa shu takrorlanishni kamaytiradi: mijoz haqidagi ma'lumot bir joyda — mijozlar jadvalida — bir marta saqlanadi.
Har bir jadvalda har bir qatorni yagona aniqlaydigan ustun bo'ladi. U birlamchi kalit (primary key) deb ataladi. Bizning jadvallarda bu — id ustuni.
| id | ism | shahar | yosh |
|---|---|---|---|
| 1 | Ali | Toshkent | 25 |
| 2 | Vali | Samarqand | 30 |
| 3 | Soli | Toshkent | 22 |
mijozlar jadvalida ikkita "Ali" bo'lishi mumkin, lekin ikkita id = 1 bo'lishi mumkin emas. Shuning uchun istalgan mijozni id orqali aniq topa olamiz. Birlamchi kalit takrorlanmaydi va bo'sh (NULL) bo'lmaydi.
Endi jadvallarni o'zaro bog'lash kerak. Buning uchun tashqi kalit (foreign key) ishlatiladi — bu boshqa jadvalning birlamchi kalitiga ishora qiladigan ustun.
buyurtmalar jadvaliga qarang:
| 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 |
Bu yerda:
mijoz_id — mijozlar.id ga ishora qiluvchi tashqi kalit. 1 qiymati "bu buyurtmani id = 1 bo'lgan mijoz (Ali) qilgan" degani.mahsulot_id — mahsulotlar.id ga ishora qiluvchi tashqi kalit. 4 qiymati "sotib olingan mahsulot — id = 4 (Kitob)" degani.Ya'ni buyurtmalar jadvali mijozning ismini yoki mahsulotning nomini takrorlamaydi — faqat ularning id larini saqlaydi. Kerak bo'lsa, shu id orqali to'liq ma'lumotni boshqa jadvaldan topib olamiz.
Eslatma: Tashqi kalit ustun nomi har xil bo'lishi mumkin (
mijoz_id), lekin u doim boshqa jadvalning birlamchi kaliti (mijozlar.id) qiymatlaridan birini saqlaydi.
Bitta mijoz bir nechta buyurtma berishi mumkin. Masalan, Ali (mijoz_id = 1) jadvalda uch marta uchraydi: 1, 2 va 6 raqamli buyurtmalar — hammasi uniki.
Lekin har bir buyurtma faqat bitta mijozga tegishli. Bunday aloqa bir-ko'p bog'lanish (one-to-many) deb ataladi: bir mijoz — ko'p buyurtma. Bog'lanishning "ko'p" tarafi (buyurtmalar) tashqi kalitni saqlaydi, "bir" tarafi (mijozlar) esa birlamchi kalitni beradi.
Bir buyurtmaning mijozi kim ekanini bilmoqchi bo'lsak, ikki jadvalni birlashtirishimiz kerak: buyurtmalar.mijoz_id ni mijozlar.id bilan moslashtiramiz. SQL da buni JOIN amali bajaradi — u tashqi kalit va birlamchi kalit orqali bog'langan jadvallarni bitta natijaga birlashtiradi.
JOIN ning aniq sintaksisini keyingi darslarda o'rganamiz. Hozircha asosiy g'oyani eslab qoling: jadvallar kalitlar orqali bog'lanadi, JOIN esa shu bog'lanishdan foydalanib ularni birga ko'rsatadi.
Muhim: Tashqi kalit har doim "ko'p" tarafdagi jadvalda turadi. Bizda bu —
buyurtmalar, chunki bitta mijoz va bitta mahsulotga ko'p buyurtma to'g'ri kelishi mumkin.
Bu dars uchun kod yozish shart emas. Quyidagi test orqali birlamchi kalit, tashqi kalit va jadvallar orasidagi bog'lanish haqidagi tushunchalaringizni sinab ko'ring.