SQL va MySQL β Noldan boshlovchilar uchun amaliy kitob¶
Bu kitob hech qachon dasturlash qilmagan odam ham tushunadigan tilda yozilgan. Har bir bobda: sodda nazariya β tayyor misollar β 20 ta masala (o'zingiz yechasiz). Jami 28 bob, 560 masala.
π¨ Har bob SVG diagrammalar bilan boyitilgan β JOIN, GROUP BY, indeks, tranzaksiya, normalizatsiya kabi tushunchalar ko'z bilan ko'rib o'rganiladi.
Qoida: SQL o'qib o'rganilmaydi β YOZIB o'rganiladi. Har bir masalani kompyuterda o'zingiz tering. Xato chiqsa β bu yaxshi, xatodan o'rganasiz.
Ma'lumotlar bazasi nima va u daftar yoki Excel'dan nimasi bilan kuchli ekanini, jadval/qator/ustun/id tushunchalarini, SQL (til) bilan MySQL (dastur) farqini va klient-server modelini kutubxona misolida o'rganamiz. Bob oxirida kompyutersiz yechiladigan 20 ta qog'oz masalasi bor.
MySQL'ning server-klient arxitekturasini tushunib, uni Windows (Laragon), macOS (brew) va Linux (apt) tizimlariga o'rnatamiz, terminal hamda DBeaver orqali ulanib, birinchi SQL buyruqlarimizni bajarishni o'rganamiz.
Butun kitob davomida ishlatiladigan 4 ta amaliyot bazasini (kutubxona, do'kon, klinika, taksi) yaratamiz, jadvallar orasidagi bog'lanishlarni ER-diagrammalarda ko'rib, skriptlarni bajarib tekshirishni o'rganamiz.
CREATE DATABASE, USE va CREATE TABLE bilan birinchi baza va jadvalimizni quramiz; PRIMARY KEY, AUTO_INCREMENT, NOT NULL, UNIQUE, DEFAULT qoidalarini hamda SHOW/DESCRIBE/DROP yordamchi buyruqlarini o'rganamiz.
Sonlar (INT, DECIMAL, FLOAT), matnlar (CHAR, VARCHAR, TEXT), sana-vaqt va maxsus turlar (ENUM, BOOLEAN, JSON) bilan tanishamiz; har bir ustunga to'g'ri tur tanlashni va pul nima uchun faqat DECIMAL'da saqlanishini o'rganamiz.
Jadvalga yangi qator qo'shishni o'rganamiz: INSERT INTO anatomiyasi, ko'p qatorli kiritish, AUTO_INCREMENT va DEFAULT qanday ishlashi, NOW() va LAST_INSERT_ID() hamda INSERT xatolarini o'qib tushunish.
SQL'ning eng ko'p ishlatiladigan buyrug'i β SELECT bilan jadvaldan kerakli ustunlarni tanlab o'qishni, alias (AS) berishni, SELECT ichida hisob-kitob qilishni va DISTINCT bilan takrorlarni olib tashlashni o'rganamiz.
Qatorlarni shart bo'yicha filtrlashni o'rganamiz: taqqoslash operatorlari, AND/OR/NOT mantiqiy bog'lovchilari va qavslar, BETWEEN va IN, LIKE naqshlari hamda NULL bilan to'g'ri ishlash (IS NULL).
Natijani ORDER BY bilan saralashni, LIMIT/OFFSET bilan kesishni ("eng katta N ta" qolipi va sahifalash) hamda DISTINCT bilan takror qiymatlarni olib tashlashni o'rganamiz.
MySQL'ning tayyor funksiyalarini o'rganamiz: matn (UPPER, CONCAT, SUBSTRING), son (ROUND, CEIL, FLOOR), sana (NOW, DATEDIFF, DATE_FORMAT, TIMESTAMPDIFF), shartli qiymat (IF, CASE) va NULL bilan ishlash (IFNULL, COALESCE) β hammasi hayotiy misollarda.
COUNT, SUM, AVG, MIN, MAX bilan ko'p qatordan bitta xulosa chiqarishni, "har bir ... bo'yicha" savollariga GROUP BY bilan javob berishni va guruhlarni HAVING bilan filtrlashni o'rganamiz. COUNT(*) va COUNT(ustun) orasidagi NULL farqi hamda query bajarilish tartibini ham ko'rib chiqamiz.
Bo'lingan ma'lumotni qaytadan yig'ishni β JOIN'ni o'rganamiz: ON sharti, INNER va LEFT JOIN farqi, anti-join qolipi, LEFT JOIN + WHERE tuzog'i, 3-4 jadvalli zanjirlar va JOIN + GROUP BY bilan real hisobotlar.
Bir nechta SELECT natijasini bitta ro'yxatga "tagma-tag" ulaydigan UNION va UNION ALL'ni, ustun yetishmaganda NULL bilan to'ldirishni, UNION'da ORDER BY/LIMIT qoidalarini va JOIN bilan farqini o'rganamiz.
Query ichiga yana bitta query joylashni o'rganamiz: skalyar, IN-ro'yxat va correlated (EXISTS) subquery turlari, mashhur NOT IN + NULL tuzog'idan qochish hamda FROM ichidagi hosila jadval bilan ikki bosqichli hisob-kitoblar.
WITH yordamida murakkab query'ni nomli, yuqoridan pastga o'qiladigan bosqichlarga bo'lishni, bir nechta CTE'ni zanjir qilishni va recursive CTE bilan jadvalsiz sonlar, kalendar hamda daraxt strukturalar hosil qilishni o'rganamiz.
GROUP BY'dan farqli, qatorlarni yo'qotmasdan guruh statistikasini hisoblashni o'rganamiz: OVER va PARTITION BY, ROW_NUMBER/RANK/DENSE_RANK bilan raqamlash, LAG/LEAD, yig'ilib boruvchi summa va LAST_VALUE'dagi frame tuzog'i.
Tayyor jadvalni ALTER TABLE bilan buzmasdan o'zgartirishni, bazaning o'zi qo'riqlaydigan qoidalar β NOT NULL, UNIQUE, DEFAULT, CHECK constraint'larini va jadvallararo bog'lanish kafolati FOREIGN KEY'ni o'rganamiz; ota qator o'chirilganda nima bo'lishini ON DELETE (RESTRICT, CASCADE, SET NULL) bilan boshqaramiz.
Bitta katta jadvalning kasalliklarini (takrorlash, yangilash/o'chirish/kiritish anomaliyalari), normalizatsiyaning 3 sodda qoidasini (1NF, 2NF, 3NF), bog'lanish turlarini (1:1, 1:N, N:M) va qachon ataylab takrorlash (snapshot, denormalizatsiya) to'g'ri ekanini o'rganamiz.
Indeksni kitob oxiridagi alfavit ko'rsatkich o'xshatishi bilan tushunamiz: 1 million qatorli jadvalda full scan va indeksli qidiruv farqini o'z qo'limiz bilan o'lchaymiz, B-tree daraxti, indeks ishlamaydigan tuzoqlar, kompozit indeks (chap prefiks qoidasi) va indeksning narxini o'rganamiz.
Takrorlanadigan SELECT'ni bazada nom berib saqlaydigan VIEW'ni chuqur o'rganamiz: CREATE va CREATE OR REPLACE VIEW, ustunlarni qayta nomlash, view'ning ichki mexanikasi (ma'lumot saqlamasligi va nega tezlik bermasligi), yangilanadigan va faqat-o'qish view'lar, WITH CHECK OPTION, ALGORITHM turlari, view'ni xavfsizlik qatlami sifatida ishlatish va MySQL'da materialized view'ni jadval + EVENT bilan simulyatsiya qilish.
Bazaning ichida yashaydigan kod β stored PROCEDURE va FUNCTION'ni o'rganamiz: DELIMITER, IN/OUT/INOUT parametrlar, DECLARE bilan lokal o'zgaruvchi, boshqaruv oqimi (IF/CASE/WHILE/REPEAT/LOOP), xatolarni DECLARE ... HANDLER bilan ushlash va SIGNAL/RESIGNAL bilan o'z xatongni "otish", CREATE FUNCTION (RETURNS, DETERMINISTIC) hamda "biznes-mantiq bazadami yoki ilovadami?" munozarasi.
Bazaning ikkita "avtomat" mexanizmi: jadval ustiga qo'yilgan soqchi β TRIGGER (BEFORE/AFTER Γ INSERT/UPDATE/DELETE 6 turi, OLD/NEW psevdo-jadvallari, FOLLOWS/PRECEDES tartibi, audit/tarix naqshi va cheklovlari) hamda bazaning budilnigi β EVENT (event_scheduler, CREATE EVENT, ON SCHEDULE, ON COMPLETION PRESERVE) bilan eski log tozalash va arxivlash kabi vazifalarni o'rganamiz.
Stored program ichida natija to'plamini qatorma-qator aylanadigan cursor (DECLARE/OPEN/FETCH/CLOSE va NOT FOUND handler) sintaksisini, RBAR antipatternini va deyarli har doim tezroq bo'lgan to'plam-asosli (set-based) muqobilni o'rganamiz. Stored procedure (23-bob) ustiga quriladi β cursor faqat procedure ichida yashaydi.
Sekin query'ning sababini EXPLAIN bilan ochishni o'rganamiz: type/rows/key ustunlarini o'qish, const'dan ALL'gacha shkala, va to'liq optimizatsiya sikli β sekin query β EXPLAIN β indeks β qayta o'lchash.
Har ilovaga alohida foydalanuvchi yaratish va GRANT bilan minimal ruxsat berishni, SQL injection hujumi qanday ishlashini va prepared statement bilan himoyalanishni, mysqldump bilan backup/restore qilishni o'rganamiz.
O'rganganlarimizni jamlab 3 ta to'liq tizimni noldan quramiz: talablar β schema β CREATE β ma'lumotlar β hisobot query'lari. Oxirida kitobdan keyingi yo'l xaritasi: PostgreSQL, ORM va backend tomon.