MySQL ga kirish — jadval, CRUD so'rovlar

~20 daq · PHP · Ma'lumotlar bazasi

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 son
  • AUTO_INCREMENT PRIMARY KEY — har bir qatorga avtomatik noyob raqam: 1, 2, 3...
  • VARCHAR(200) — 200 belgigacha matn
  • NOT NULL — bo'sh bo'lishi mumkin emas
  • DEFAULT — qiymat berilmasa shu ishlatiladi
  • TEXT — 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 — shart
  • LIKE '%so'z%' — ichida shu so'z bor
  • ORDER 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] UPDATE va DELETE da WHERE ni hech qachon unutmang. DELETE FROM mahsulotlar; — barcha mahsulotlarni o'chiradi, qaytarib bo'lmaydi. Xavfsiz odat: avval xuddi shu WHERE bilan SELECT qilib, 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 utf8mb4 ishlating
  • id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY — har bir jadvalda
  • CRUD: INSERT, SELECT, UPDATE, DELETE
  • UPDATE / DELETE da WHERE ni unutmang
  • Bog'liq jadvallar FOREIGN KEY va JOIN orqali

Keyingi dars

35-dars: PDO — ulanish, xatolar rejimi, DSN