Kurs davomida biz juda ko'p narsani o'rgandik: SELECT bilan ma'lumot olishni, WHERE bilan filtrlashni, ORDER BY bilan tartiblashni, SUM/COUNT kabi agregat funksiyalarni, GROUP BY bilan guruhlashni va JOIN bilan jadvallarni bog'lashni.
Bu yakuniy darsda mana shu bilimlarning hammasini bitta haqiqiy savolga javob berish uchun birlashtiramiz. Bu — kichik bir loyiha: do'kon egasi sizdan so'rashi mumkin bo'lgan amaliy hisobot.
Tasavvur qiling, onlayn do'kon egasi sizga shunday savol berdi:
"Har bir shahardagi mijozlarim menga jami qancha pulga buyurtma berishgan? Eng ko'p savdo qaysi shaharda?"
Bu savolga javob berish uchun bizga uchala jadval ham kerak bo'ladi. Sababini ko'raylik:
mijozlar jadvali — bu yerda mijozning qaysi shaharda ekani yozilgan:
| id | ism | shahar | yosh |
|---|---|---|---|
| 1 | Ali | Toshkent | 25 |
| 2 | Vali | Samarqand | 30 |
| 3 | Soli | Toshkent | 22 |
| 4 | Guli | Buxoro | 35 |
| 5 | Dilnoza | Toshkent | 28 |
| 6 | Jasur | Samarqand | 40 |
buyurtmalar jadvali — qaysi mijoz qaysi mahsulotni nechtadan olgani:
| 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 |
mahsulotlar jadvali — bu yerda har bir mahsulotning narxi bor:
| 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 |
E'tibor bering: shahar mijozlar jadvalida, narx esa mahsulotlar jadvalida. Bularni bir-biriga bog'lab turgan jadval — buyurtmalar. Demak, savolga javob berish uchun uchala jadvalni ham birlashtirishimiz shart.
Avvalgi darslarda biz ikkita jadvalni JOIN qildik. Endi ko'rasizki, uchta jadvalni bog'lash ham xuddi shunday — shunchaki yana bitta JOIN ... ON qo'shamiz.
Bog'lash zanjiri shunday:
mijozlar.id = buyurtmalar.mijoz_id (qaysi mijoz buyurtma bergan),buyurtmalar.mahsulot_id = mahsulotlar.id (qaysi mahsulot buyurtma qilingan).Jadvallarga qisqa nom (alias) beramiz: mijozlar uchun m, buyurtmalar uchun b, mahsulotlar uchun p.
SELECT m.shahar, p.narx, b.soni
FROM mijozlar m
JOIN buyurtmalar b ON m.id = b.mijoz_id
JOIN mahsulotlar p ON b.mahsulot_id = p.id;Bu so'rov har bir buyurtma uchun mijozning shahri, mahsulot narxi va soni bitta qatorga "yopishtirib" beradi:
Toshkent|5000000|1
Toshkent|50000|3
Samarqand|12000000|1
Toshkent|3000|10
Toshkent|300000|2
Toshkent|8000|5
Samarqand|250000|4Eslatma:
JOINlarni ketma-ket yozamiz. SQL avvalmijozlarvabuyurtmalarni bog'laydi, keyin natijagamahsulotlarni qo'shadi. Tartibi muhim emas — natija bir xil chiqadi.
Bitta buyurtmaning umumiy puli — bu narx × soni. Masalan, Ali 1 dona Telefon (narxi 5000000) olgan bo'lsa, bu buyurtma 5000000 * 1 = 5000000 so'm bo'ladi.
SQL da bu — p.narx * b.soni:
SELECT m.shahar, p.narx * b.soni
FROM mijozlar m
JOIN buyurtmalar b ON m.id = b.mijoz_id
JOIN mahsulotlar p ON b.mahsulot_id = p.id;Toshkent|5000000
Toshkent|150000
Samarqand|12000000
Toshkent|30000
Toshkent|600000
Toshkent|40000
Samarqand|1000000Endi har bir buyurtmaning puli alohida qatorda turibdi. Bizga esa shahar bo'yicha jami kerak — buni keyingi qadamda yig'amiz.
Endi yuqoridagi summalarni shahar bo'yicha guruhlab, har bir guruhda SUM bilan qo'shamiz:
GROUP BY m.shahar — qatorlarni shahar bo'yicha guruhlarga ajratadi,SUM(p.narx * b.soni) — har bir guruh ichidagi summalarni qo'shadi.SELECT m.shahar, SUM(p.narx * b.soni)
FROM mijozlar m
JOIN buyurtmalar b ON m.id = b.mijoz_id
JOIN mahsulotlar p ON b.mahsulot_id = p.id
GROUP BY m.shahar;Samarqand|13000000
Toshkent|5820000Mana, deyarli tayyor! Endi har bir shahar uchun jami savdo summasi chiqdi. Faqat bitta narsa qoldi — natijani tartiblash.
Do'kon egasi "eng ko'p savdo qaysi shaharda?" deb so'ragandi. Shuning uchun natijani summa bo'yicha kamayish tartibida (kattadan kichikka) tartiblaymiz — buning uchun ORDER BY ... DESC:
SELECT m.shahar, SUM(p.narx * b.soni)
FROM mijozlar m
JOIN buyurtmalar b ON m.id = b.mijoz_id
JOIN mahsulotlar p ON b.mahsulot_id = p.id
GROUP BY m.shahar
ORDER BY SUM(p.narx * b.soni) DESC;Samarqand|13000000
Toshkent|5820000Tayyor! Endi javob aniq: eng ko'p savdo Samarqandda (13 000 000 so'm), keyin Toshkent (5 820 000 so'm).
Muhim:
ORDER BYdaSUM(p.narx * b.soni)ifodasini to'liq yozdik.GROUP BYdan keyin tartiblayotganimiz uchun, agregat ifoda bo'yicha tartiblash mumkin.
E'tibor bering: javobda Buxoro yo'q. Sababi — Buxorolik mijoz (Guli) hech qanday buyurtma bermagan, shuning uchun JOIN uni natijaga qo'shmadi.
Bu loyihada barcha bilimlarni ketma-ket ishlatdik:
JOIN (3 jadval) — shahar, narx va sonini bitta joyga to'pladi,narx * soni — har bir buyurtmaning summasini hisobladi,GROUP BY — qatorlarni shahar bo'yicha guruhladi,SUM — har bir guruhdagi summalarni qo'shdi,ORDER BY ... DESC — natijani kattadan kichikka tartibladi.So'rovdagi elementlar tartibi har doim bir xil: avval FROM ... JOIN ... ON, keyin GROUP BY, eng oxirida ORDER BY.
Pastdagi kod oynasida mahsulotlar, mijozlar va buyurtmalar jadvallari allaqachon yaratilgan va to'ldirilgan. Sizning vazifangiz — har bir shahar bo'yicha jami savdo summasini (narx * soni) hisoblab, shahar va summani summa bo'yicha kamayish tartibida chiqaring. Buning uchun uchala jadvalni JOIN bilan bog'lang.