28 β Yakuniy loyihalar¶
β¬ οΈ Oldingi: 27 β Xavfsizlik va administratsiya Β· π README
Bu bobda: kitob davomida o'rganganlarimizning hammasini jamlab, 3 ta to'liq tizimni noldan quramiz β kinoteatr, onlayn kurslar platformasi va yetkazib berish xizmati. Har birida yo'l bir xil: talablar β schema β CREATE β test ma'lumot β query'lar β hisobotlar. Oxirida kitobdan keyingi yo'l xaritasi va 28-bob masalalari β intervyuga tayyorgarlik uchun 20 ta klassik savol bor.
Bilim sinovdan o'tadi. 3 ta loyiha β har biri "noldan oxirigacha". Hech qayerdan ko'chirmang, o'zingiz yozing. Qiynalsangiz β tegishli bobga qayting: bu mag'lubiyat emas, aynan shunday o'rganiladi. Bu bobda ataylab tayyor kod yo'q β kitob davomida ko'chirib yozdingiz, endi o'zingiz yaratasiz.
Loyihani qanday qurish kerak β 6 qadam¶
Uchala loyihada ham ish tartibi bir xil. Real ishda ham xuddi shunday:
- Talablar. Tizim nimani saqlashi va qanday savollarga javob berishi kerak? Bir varaq qog'ozga yozib chiqing.
- Schema β avval qog'ozda. Jadvallar, ustunlar, bog'lanishlar (1:N, N:M) β chizing (3 va 20-boblar). Klaviaturaga shoshilmang: qog'ozdagi xato 1 daqiqada tuzatiladi, to'la bazadagi xato β bir soatda.
- CREATE. Jadvallarni FK, CHECK, UNIQUE bilan yarating (4 va 18-boblar). Tartib muhim: avval "ota" jadvallar, keyin ularga FK bilan bog'lanadigan "bola"lar.
- Test ma'lumot. INSERT bilan boy va xilma-xil data kiriting (6-bob). NULL'lar, bekor qilingan buyurtmalar, sotuvsiz filmlar ham bo'lsin β "ideal" data hech narsani sinamaydi.
- Query'lar. Topshiriqlardagi savollarga javob yozing (7β16-boblar). GROUP BY'da SELECT'ga faqat guruhlangan ustunlar va aggregate'lar yozilishini unutmang β MySQL 8 buni qattiq tekshiradi (ONLY_FULL_GROUP_BY, 11-bob).
- Hisobot va jilo. VIEW, PROCEDURE, TRIGGER, indeks va EXPLAIN (21β26-boblar) β loyihani "mahsulot" darajasiga ko'taring.
π Schema tavsiflarida ustun nomlari apostrofsiz yozilgan (o'rin emas, orin_raqami) β SQL identifikatorlarida apostrof ishlatilmaydi, jadval yaratganingizda siz ham shunday yozing.
Uchala loyiha bir qarashda β jadvallar soni va murakkablik A dan C tomon o'sib boradi:
LOYIHA A: Kinoteatr (oson-o'rta)¶
Tanish mavzu, 4 jadval β qizishish uchun ideal. Asosiy "tuz" β bitta o'rin ikki marta sotilmasligini bazaning o'zi kafolatlashi.
Schema (o'zingiz yarating): filmlar (nomi, janr, davomiyligi, yil), zallar (nomi, sigimi), seanslar (film, zal, vaqt, narx), chiptalar (seans, orin_raqami, mijoz_ism, sotilgan_vaqt).
Topshiriqlar:
- 4 jadvalni FK'lar bilan yarating (chiptada seans+o'rin UNIQUE bo'lsin β bir o'rin ikki marta sotilmasin!)
- 5 film, 3 zal, 10 seans, 25 chipta kiriting
- Bugungi seanslar afishasi: film + zal + vaqt + narx
- Har film nechta chipta sotgan (sotuvsizlar 0 bilan)
- Har seansning to'liqlik foizi: chiptalar / zal sig'imi * 100
- Eng daromadli film (chiptalar narxidan)
- Birorta ham seansi yo'q filmlar (anti-join)
- Chipta sotish PROCEDURE'i: o'rin bandligini tekshirib INSERT (band bo'lsa β hech narsa)
v_afishaview yarating- Har janr bo'yicha o'rtacha chipta narxi va jami daromad
π‘ Maslahatlar: 4-topshiriq β LEFT JOIN + COUNT (12-bob); 5-da natijani ROUND bilan chiroyli qiling; 7 β anti-join qolipi (12-bob); 8-procedure ichida IF + EXISTS tekshiruvi bo'ladi (23-bob).
LOYIHA B: Onlayn kurslar platformasi (o'rta)¶
Endi 5 jadval va eng muhim yangi tushuncha β talabaning progressi: ikki xil hisobning (ko'rilgan darslar va jami darslar) nisbati.
Schema: kurslar (nomi, narx, daraja), talabalar, yozilishlar (talaba, kurs, sana, tolangan_summa β snapshot, 20-bob!), darslar (kurs, nomi, tartib_raqami), korishlar (talaba, dars, sana).
Topshiriqlar:
- Schema + FK + CHECK'lar (narx >= 0, tartib_raqami > 0)
- Test data: 5 kurs, 10 talaba, 20 yozilish, 25 dars, 60+ ko'rish
- Har kursning talabalari soni va jami tushumi
- Har talabaning progressi: kursdagi ko'rgan darslari / jami darslar * 100 (eng qiyin query β JOIN + GROUP BY + subquery!)
- Eng mashhur 3 kurs; birorta talabasi yo'q kurslar
- Oxirgi 7 kunda faol bo'lgan (dars ko'rgan) talabalar
- "Tashlab qo'yganlar": yozilgan, lekin 14+ kun dars ko'rmaganlar
- Window: har kurs ichida talabalarni progress bo'yicha reytinglang
- Oylik tushum + o'tgan oyga nisbatan o'sish (LAG)
- Trigger: yangi ko'rish yozilganda yozilishlar jadvalidagi
oxirgi_faollikustuni yangilansin (ustunni o'zingiz qo'shing)
π‘ 4-topshiriqda ikki xil hisobni BITTA query'da aralashtirmang β alohida hisoblang-da, keyin birlashtiring: subquery (14-bob) yoki CTE (15-bob) bilan bo'laklang. 6 va 7 uchun sana funksiyalari (10-bob), 8β9 uchun window funksiyalar (16-bob) kerak bo'ladi.
LOYIHA C: Yetkazib berish xizmati (murakkab β portfolio darajasi!)¶
6 jadval, tranzaksiya, indeks auditi va backup β bu loyihani tugatsangiz, GitHub'ga qo'yib intervyuda ko'rsatsa bo'ladi.
Schema: restoranlar, taomlar (restoran, nomi, narx), kuryerlar (ism, telefon, faolmi), mijozlar, buyurtmalar (mijoz, restoran, kuryer, holat: yangiβtayyorlanmoqdaβyoldaβyetkazildi/bekor, yaratilgan_vaqt, yetkazilgan_vaqt), buyurtma_taomlari (buyurtma, taom, soni, narx β snapshot).
Topshiriqlar:
- To'liq schema: FK, CHECK, kerakli indekslar (qaysi ustunlarga β o'zingiz asoslang!)
- Boy test data: 5 restoran, 25 taom, 6 kuryer, 10 mijoz, 30 buyurtma har xil holatda
- Buyurtma tranzaksiyasi (procedure): buyurtma + taomlar + jami hisoblash β atomar
- Har restoranning daromadi (faqat 'yetkazildi'lar), kamayish tartibida
- Har kuryer: yetkazgan buyurtmalari, o'rtacha yetkazish vaqti (TIMESTAMPDIFF(MINUTE, yaratilgan, yetkazilgan))
- Eng ko'p buyurtma qilingan 5 taom
- Har mijozning LTV'si (jami xaridi) + birinchi va oxirgi buyurtma sanasi (window yoki MIN/MAX)
- Soatlar bo'yicha buyurtmalar taqsimoti (HOUR + GROUP BY) β "qaysi soat eng gavjum?"
- Kunlik tushum + yig'ilib boruvchi summa (running total) + 3 kunlik o'rtacha
v_boshqaruv_paneliview: bugungi buyurtmalar, tushum, faol kuryerlar, o'rtacha yetkazish vaqti β bitta view'da- EXPLAIN audit: 5 ta asosiy query'ngizni tekshirib, kerakli indekslarni isbot bilan qo'ying
- To'liq backup + tiklash sinovi
π‘ Maslahatlar: holat ustuni uchun ENUM mos keladi (5-bob); 3-topshiriqda START TRANSACTION + COMMIT/ROLLBACK (19-bob); 9-dagi 3 kunlik o'rtacha β window frame: ROWS BETWEEN 2 PRECEDING AND CURRENT ROW (16-bob); 12-da mysqldump (27-bob). yetkazilgan_vaqt faqat 'yetkazildi' holatida to'ladi β qolganlarida NULL bo'lishi tabiiy.
Loyihalardan keyin β keyingi qadamlar¶
Kitob tugadi, lekin yo'l endi boshlanadi. Mana xarita:
- Masala yechish: sql-practice.com (bepul, brauzerda), LeetCode Database bo'limi, HackerRank SQL β haftasiga 5 ta masala
- O'z loyihangiz: atrofingizdagi real muammoga baza yasang (mahalla kutubxonasi? oilaviy byudjet?)
- Dasturlash tiliga ulash: PHP (PDO), Python (mysql-connector) yoki JavaScript (mysql2) bilan bazaga ulanib, mini-ilova yozing β SQL bilimingiz "jonlanadi"
- Kengayish: PostgreSQL bilan tanishing β sintaksisning 90 foizi sizga tanish bo'ladi; ORM nima ekanini ko'ring (Django ORM, Prisma, Eloquent) β lekin ORM ostida baribir SQL yotganini unutmang
- Chuqurlashish: indekslarning B-Tree tuzilishi, isolation levels, replikatsiya β bular keyingi bosqich
28-bob masalalari (intervyuga tayyorgarlik β 20 ta klassik savol)¶
Bu bobning 20 masalasi β intervyu formatida. Har savolga avval o'zingiz yozma javob bering (og'zaki "bilaman" hisobga o'tmaydi!), keyin quyidagi jadval orqali tegishli bobdan tekshiring:
- PRIMARY KEY va UNIQUE farqi? (PK β bitta, NULL yo'q; UNIQUE β ko'p bo'lishi mumkin, NULL mumkin)
- INNER JOIN va LEFT JOIN farqi?
- WHERE va HAVING farqi?
COUNT(*)vaCOUNT(ustun)farqi?- NULL bilan
=nega ishlamaydi? - DELETE, TRUNCATE, DROP farqlari?
- Indeks nima, qachon ishlamaydi?
- Kompozit indeksning "chap qism" qoidasi?
- Tranzaksiya nima? ACID?
- SQL Injection nima, qanday himoyalanasiz?
- Normalizatsiya nima? 3 ta anomaliya?
- N:M bog'lanish qanday quriladi?
- Subquery va JOIN β qachon qaysi?
- GROUP BY'da SELECT'ga qanday ustunlar yozish mumkin?
- Har guruhdagi eng katta yozuvni qanday topasiz? (window: PARTITION + ROW_NUMBER)
- View nima, ma'lumot saqlaydimi?
- EXPLAIN'da type=ALL nimani anglatadi?
- Soft delete nima, nega kerak?
- FOR UPDATE qachon kerak? (parallel yozishda race condition)
- Katta OFFSET nega sekin, yechimi? (keyset pagination)
Hammasiga bu kitobda javob bor β bilmaganingizga duch kelsangiz, tegishli bobga qayting:
| Savol | Bob | Savol | Bob |
|---|---|---|---|
| 1 | 04, 18 | 11, 12 | 20 |
| 2 | 12 | 13 | 14 |
| 3, 4, 14 | 11 | 15 | 16 |
| 5 | 08 | 16 | 22 |
| 6, 18 | 17 | 17 | 23 |
| 7, 8 | 21 | 19 | 19 |
| 9 | 19 | 20 | 23 |
| 10 | 24 |
π‘ Intervyuda "yodlab kelgan ta'rif"dan ko'ra kichik misol kuchliroq ta'sir qiladi: "NULL bilan = ishlamaydi, chunki NULL β noma'lum; WHERE telefon = NULL hech narsa qaytarmaydi, IS NULL kerak" β mana shunday javob bering.
So'nggi so'z¶
Siz 28 bob va 560 ta masalani bosib o'tdingiz. Endi siz:
- Noldan baza loyihalay olasiz
- Istalgan murakkablikdagi query yoza olasiz
- Sekin query'ni topib, davolay olasiz
- Ma'lumotni xavfsiz saqlay olasiz
SQL 1970-yillarda tug'ilgan β 50 yildan beri asosi o'zgargani yo'q va yana o'nlab yillar xizmat qiladi. Framework'lar keladi-ketadi, SQL qoladi.
Eng katta sirni oxirida aytaman: bu kitobdagi eng kuchli o'quvchi β masalalarning hammasini YOZGAN o'quvchi. O'qigan emas. Yozgan. Omad! π