MySQL ga kirish — jadval, CRUD so'rovlar
Muammodan boshlaylik
Mahsulotlarni JSON faylda saqlayapsiz. 50 ta bo'lganda yaxshi ishladi. Endi 50 000 ta:
- "Narxi 100 000 dan arzon telefonlar" ni topish uchun butun faylni o'qib, PHP da filtrlaysiz — sekin
- Ikki administrator bir vaqtda mahsulot qo'shdi — biri ikkinchisining o'zgarishini ustidan yozib yubordi
- Buyurtma va mijoz ma'lumotlarini bog'lash — qo'lda, murakkab
Ma'lumotlar bazasi aynan shu muammolar uchun yaratilgan: tez qidirish, bir vaqtda xavfsiz yozish, bog'liq ma'lumotlar. PHP bilan eng ko'p ishlatiladigan baza — MySQL (va uning "egizagi" MariaDB).
[!INFO] Bu PHP kursidagi qisqa kirish — PHP dan foydalanish uchun yetarli asoslar. SQL ni chuqur o'rganish uchun saytda alohida MySQL kursi bor.
Asosiy tushunchalar
Ma'lumotlar bazasi — Excel kitobiga o'xshaydi:
| Excel | MySQL |
|---|---|
| Fayl (kitob) | Database (baza) |
| Varaq | Table (jadval) |
| Ustun sarlavhasi | Column (ustun) — nomi va turi bilan |
| Qator | Row (qator, yozuv) |
Farqi: har bir ustunning qat'iy turi bor, va siz ma'lumot bilan SQL tili orqali gaplashasiz.
Ulanish
Laragon / XAMPP da MySQL tayyor turadi. Terminalda:
mysql -u root -p
Yoki grafik vositalar: HeidiSQL (Laragon bilan keladi), phpMyAdmin (XAMPP), DBeaver, TablePlus.
Baza va jadval yaratish
CREATE DATABASE dokon CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE dokon;
CREATE TABLE mahsulotlar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(200) NOT NULL,
narx INT UNSIGNED NOT NULL,
soni INT UNSIGNED NOT NULL DEFAULT 0,
tavsif TEXT NULL,
yaratilgan DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
Tushuntirish:
utf8mb4— o'zbek, kirill harflari va emoji uchun to'liq Unicode. (utf8— eski, cheklangan variant, ishlatmang)INT UNSIGNED— manfiy bo'lmagan butun sonAUTO_INCREMENT PRIMARY KEY— har bir qatorga avtomatik noyob raqam: 1, 2, 3...VARCHAR(200)— 200 belgigacha matnNOT NULL— bo'sh bo'lishi mumkin emasDEFAULT— qiymat berilmasa shu ishlatiladiTEXT— uzun matn
CRUD — to'rt asosiy amal
Create, Read, Update, Delete — har qanday ilovaning 90% i shu to'rt amaldan iborat.
INSERT — qo'shish
INSERT INTO mahsulotlar (nom, narx, soni)
VALUES ('Telefon', 3200000, 5);
INSERT INTO mahsulotlar (nom, narx, soni) VALUES
('Noutbuk', 8900000, 2),
('Quloqchin', 249000, 12),
('Sichqoncha', 89000, 30);
id va yaratilgan yozilmadi — ular avtomatik to'ladi.
SELECT — o'qish
SELECT * FROM mahsulotlar;
SELECT nom, narx FROM mahsulotlar;
SELECT * FROM mahsulotlar WHERE narx < 500000;
SELECT * FROM mahsulotlar WHERE soni > 0 AND narx BETWEEN 50000 AND 300000;
SELECT * FROM mahsulotlar WHERE nom LIKE '%telefon%';
SELECT * FROM mahsulotlar ORDER BY narx DESC LIMIT 10;
SELECT * FROM mahsulotlar WHERE id = 3;
*— barcha ustunlar (amalda kerakli ustunlarni sanab o'tgan ma'qul)WHERE— shartLIKE '%so'z%'— ichida shu so'z borORDER BY ... DESC— kamayish tartibida (ASC— o'sish)LIMIT 10— faqat 10 ta
UPDATE — o'zgartirish
UPDATE mahsulotlar SET narx = 2990000 WHERE id = 1;
UPDATE mahsulotlar SET soni = soni - 1 WHERE id = 1 AND soni > 0;
DELETE — o'chirish
DELETE FROM mahsulotlar WHERE id = 4;
[!WARNING]
UPDATEvaDELETEdaWHEREni hech qachon unutmang.DELETE FROM mahsulotlar;— barcha mahsulotlarni o'chiradi, qaytarib bo'lmaydi. Xavfsiz odat: avval xuddi shuWHEREbilanSELECTqilib, qaysi qatorlar ta'sirlanishini ko'ring.
Hisoblash so'rovlari
SELECT COUNT(*) FROM mahsulotlar; -- nechta mahsulot
SELECT SUM(narx * soni) FROM mahsulotlar; -- ombordagi jami qiymat
SELECT AVG(narx) FROM mahsulotlar; -- o'rtacha narx
SELECT MIN(narx), MAX(narx) FROM mahsulotlar;
Jadvallarni bog'lash — qisqacha
Buyurtmalar jadvali mahsulotga ID orqali ishora qiladi:
CREATE TABLE buyurtmalar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
mahsulot_id INT UNSIGNED NOT NULL,
mijoz_ismi VARCHAR(100) NOT NULL,
soni INT UNSIGNED NOT NULL,
yaratilgan DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (mahsulot_id) REFERENCES mahsulotlar(id)
);
Mahsulot nomini har bir buyurtmada qayta yozmaymiz — faqat mahsulot_id. Ikkalasini birlashtirib o'qish:
SELECT b.id, b.mijoz_ismi, m.nom, b.soni, m.narx * b.soni AS jami
FROM buyurtmalar b
JOIN mahsulotlar m ON m.id = b.mahsulot_id
ORDER BY b.yaratilgan DESC;
JOIN va munosabatlar MySQL kursining 4-bo'limida batafsil.
Nima uchun shunday?
Nima uchun ma'lumotlarni PHP massivida yoki faylda emas, alohida dasturda (MySQL serverida) saqlaymiz?
Chunki baza o'nlab yillik muhandislik ishini o'z ichiga oladi: indekslar millionlab qatorda soniyaning mingdan biri ichida qidiradi; tranzaksiyalar pul o'tkazmasini "yarim bajarilgan" holda qoldirmaydi; qulflar yuzlab bir vaqtdagi foydalanuvchini to'g'ri navbatga qo'yadi; quvvat o'chsa ham ma'lumot buzilmaydi. Bularning hammasini faylda o'zingiz yozishga urinish — yillar ishi va baribir xatolar bilan.
Xulosa
Eslab qoling:
- Baza → jadvallar → ustunlar (qat'iy turli) → qatorlar
- Doim
utf8mb4ishlating id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY— har bir jadvalda- CRUD:
INSERT,SELECT,UPDATE,DELETE UPDATE/DELETEdaWHEREni unutmang- Bog'liq jadvallar
FOREIGN KEYvaJOINorqali
Keyingi dars
35-dars: PDO — ulanish, xatolar rejimi, DSN