CREATE DATABASE, CREATE TABLE — sintaksis va qoidalar

~15 daq · MySQL · DDL — Tuzilma Boshqarish

Muammodan boshlaylik

Uy qurishdan oldin chizma chiziladi: nechta xona, qayerda eshik, qayerda deraza. Chizmasiz qurilgan uyni keyin o'zgartirish — devorlarni buzish demak.

Ma'lumotlar bazasida ham shunday. Ma'lumot qo'shishdan oldin tuzilma yaratiladi: qanday jadvallar, qanday ustunlar, qanday turlar, qanday qoidalar. Bu ishni DDL (Data Definition Language) buyruqlari bajaradi.

Bu darsda kurs davomida ishlatadigan dokon bazasini quramiz.


Baza yaratish

CREATE DATABASE dokon
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_0900_ai_ci;

Agar mavjud bo'lsa xato bermasligi uchun:

CREATE DATABASE IF NOT EXISTS dokon CHARACTER SET utf8mb4;

Bazani tanlash:

USE dokon;

Endi yaratilgan barcha jadvallar dokon ichida bo'ladi.


Jadval yaratish — sintaksis

CREATE TABLE jadval_nomi (
    ustun1  TUR  [cheklovlar],
    ustun2  TUR  [cheklovlar],
    ...
    [jadval darajasidagi cheklovlar]
);

Birinchi jadvalimiz:

CREATE TABLE toifalar (
    id   INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nom  VARCHAR(100) NOT NULL
);
Qism Ma'nosi
id Ustun nomi
INT UNSIGNED Turi: manfiy bo'lmagan butun son
AUTO_INCREMENT Har yangi qatorda avtomatik +1: 1, 2, 3...
PRIMARY KEY Har bir qatorning noyob identifikatori
NOT NULL Bo'sh bo'lishi mumkin emas

Primary key va AUTO_INCREMENT

Har bir jadvalda primary key bo'lishi kerak — qatorni boshqalaridan aniq ajratadigan ustun.

Nima uchun ism yoki email emas? Chunki ular o'zgaradi. Mijoz turmushga chiqib familiyasini o'zgartirdi — uning barcha buyurtmalaridagi bog'lanish buziladi. id esa hech qachon o'zgarmaydi va hech qanday ma'noga ega emas — shuning uchun ishonchli.

INSERT INTO toifalar (nom) VALUES ('Telefonlar'), ('Noutbuklar'), ('Aksessuarlar');
SELECT * FROM toifalar;
+----+--------------+
| id | nom          |
+----+--------------+
|  1 | Telefonlar   |
|  2 | Noutbuklar   |
|  3 | Aksessuarlar |
+----+--------------+

id ni biz bermadik — MySQL o'zi qo'ydi.

[!INFO] AUTO_INCREMENT raqamlari qayta ishlatilmaydi. 3-qatorni o'chirsangiz, keyingi yangi qator 4 bo'ladi, 3 emas. Raqamlarda "teshik" bo'lishi — normal holat.


Dokon bazasi — to'liq tuzilma

Kurs davomida shu 5 ta jadval bilan ishlaymiz:

CREATE TABLE toifalar (
    id          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nom         VARCHAR(100) NOT NULL UNIQUE
);

CREATE TABLE mahsulotlar (
    id          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    toifa_id    INT UNSIGNED NULL,
    nom         VARCHAR(200) NOT NULL,
    narx        INT UNSIGNED NOT NULL,
    soni        INT UNSIGNED NOT NULL DEFAULT 0,
    yaratilgan  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (toifa_id) REFERENCES toifalar(id)
);

CREATE TABLE mijozlar (
    id          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ism         VARCHAR(100) NOT NULL,
    email       VARCHAR(255) NOT NULL UNIQUE,
    telefon     VARCHAR(20) NULL,
    shahar      VARCHAR(50) NULL,
    yaratilgan  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE buyurtmalar (
    id          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    mijoz_id    INT UNSIGNED NOT NULL,
    holat       ENUM('yangi', 'tolangan', 'yolda', 'yetkazildi', 'bekor') NOT NULL DEFAULT 'yangi',
    yaratilgan  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (mijoz_id) REFERENCES mijozlar(id)
);

CREATE TABLE buyurtma_qatorlari (
    id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    buyurtma_id  INT UNSIGNED NOT NULL,
    mahsulot_id  INT UNSIGNED NOT NULL,
    soni         SMALLINT UNSIGNED NOT NULL,
    narx         INT UNSIGNED NOT NULL,     -- sotilgan paytdagi narx!
    FOREIGN KEY (buyurtma_id) REFERENCES buyurtmalar(id),
    FOREIGN KEY (mahsulot_id) REFERENCES mahsulotlar(id)
);

Sxema:

toifalar ──< mahsulotlar ──< buyurtma_qatorlari >── buyurtmalar >── mijozlar
   1      ko'p     1          ko'p          ko'p       1       ko'p     1

──< — "birga ko'p": bitta toifada ko'p mahsulot, bitta buyurtmada ko'p qator, bitta mijozda ko'p buyurtma.

Nima uchun buyurtma_qatorlari da ham narx bor? Mahsulot narxi ertaga o'zgaradi. Lekin o'tgan oydagi buyurtma o'sha paytdagi narxda sotilgan. Agar narxni faqat mahsulotlar dan olsak — eski hisobotlar o'zgarib ketadi.

FOREIGN KEY lar 7-darsda batafsil. UNIQUE, DEFAULT — 6-darsda.


Namuna ma'lumotlar

INSERT INTO toifalar (nom) VALUES ('Telefonlar'), ('Noutbuklar'), ('Aksessuarlar');

INSERT INTO mahsulotlar (toifa_id, nom, narx, soni) VALUES
    (1, 'iPhone 15',          12500000, 4),
    (1, 'Samsung Galaxy A55', 4800000, 12),
    (2, 'MacBook Air M3',     16900000, 2),
    (2, 'Lenovo IdeaPad',     7200000, 6),
    (3, 'AirPods Pro',        3100000, 15),
    (3, 'Qopqoq',             120000, 80),
    (NULL, 'Sovg''a kartasi', 500000, 100);

INSERT INTO mijozlar (ism, email, telefon, shahar) VALUES
    ('Aziz Karimov',     'aziz@mail.uz',   '+998901112233', 'Toshkent'),
    ('Malika Rahimova',  'malika@mail.uz', '+998935554433', 'Samarqand'),
    ('Jasur Toshev',     'jasur@mail.uz',  NULL,            'Toshkent'),
    ('Nodira Usmonova',  'nodira@mail.uz', '+998977778899', 'Buxoro');

INSERT INTO buyurtmalar (mijoz_id, holat, yaratilgan) VALUES
    (1, 'yetkazildi', '2026-09-05 10:15:00'),
    (1, 'tolangan',   '2026-10-12 18:40:00'),
    (2, 'yetkazildi', '2026-10-02 12:00:00'),
    (3, 'bekor',      '2026-10-20 09:30:00'),
    (2, 'yangi',      '2026-11-01 16:20:00');

INSERT INTO buyurtma_qatorlari (buyurtma_id, mahsulot_id, soni, narx) VALUES
    (1, 2, 1, 4800000), (1, 6, 2, 120000),
    (2, 5, 1, 3100000),
    (3, 3, 1, 16900000), (3, 5, 1, 3100000),
    (4, 1, 1, 12500000),
    (5, 6, 3, 120000), (5, 7, 2, 500000);

'Sovg''a kartasi' — SQL da matn ichidagi ' ikki marta yoziladi.

[!TIP] Bu skriptni dokon.sql fayliga saqlang. Biror narsani buzib qo'ysangiz — DROP DATABASE dokon; va qaytadan mysql -u root -p < dokon.sql. O'rganishda bu juda qulay.


Nomlash qoidalari

  • Jadval va ustun nomlari — kichik harf, so'zlar _ bilan: buyurtma_qatorlari, mijoz_id
  • Jadval nomi — ko'plikda: mijozlar, mahsulotlar
  • Foreign key — boshqa_jadval_birlikda_id: mijoz_id, toifa_id
  • SQL kalit so'zlarini nom sifatida ishlatmang: order, group, user, key. Majbur bo'lsangiz — teskari tirnoq: `order`
  • Bo'sh joy, tire, o'zbekcha ' belgisi — yo'q

Batafsil — 49-darsda.


Jadval haqida ma'lumot

SHOW TABLES;
DESCRIBE mahsulotlar;
SHOW CREATE TABLE mahsulotlar\G

DESCRIBE natijasi:

+------------+--------------+------+-----+-------------------+-------------------+
| Field      | Type         | Null | Key | Default           | Extra             |
+------------+--------------+------+-----+-------------------+-------------------+
| id         | int unsigned | NO   | PRI | NULL              | auto_increment    |
| toifa_id   | int unsigned | YES  | MUL | NULL              |                   |
| nom        | varchar(200) | NO   |     | NULL              |                   |
| narx       | int unsigned | NO   |     | NULL              |                   |
| soni       | int unsigned | NO   |     | 0                 |                   |
| yaratilgan | datetime     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+--------------+------+-----+-------------------+-------------------+

Jadvaldan nusxa

CREATE TABLE mahsulotlar_zaxira LIKE mahsulotlar;             -- faqat tuzilma
INSERT INTO mahsulotlar_zaxira SELECT * FROM mahsulotlar;      -- ma'lumot ham

CREATE TABLE arzon_mahsulotlar AS
    SELECT id, nom, narx FROM mahsulotlar WHERE narx < 1000000; -- so'rov natijasidan

LIKE indekslar va cheklovlarni ham ko'chiradi. CREATE TABLE ... AS SELECT — faqat ustunlar va ma'lumot, primary key va indekslarsiz.


Nima uchun shunday?

Nima uchun jadvallar tartib bilan yaratilishi kerak — avval toifalar, keyin mahsulotlar?

Chunki mahsulotlar toifalar ga ishora qiladi (FOREIGN KEY ... REFERENCES toifalar(id)). Ishora qilinadigan jadval hali yo'q bo'lsa, MySQL xato beradi: Failed to open the referenced table 'toifalar'. Qoida: avval "ota" jadvallar (hech kimga bog'liq bo'lmaganlar), keyin "bola" jadvallar. O'chirishda esa teskari tartib.


Xulosa

Eslab qoling:

  • CREATE DATABASE nom CHARACTER SET utf8mb4; + USE nom;
  • CREATE TABLE nom (ustun TUR cheklovlar, ...);
  • Har bir jadvalda: id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
  • Primary key — ma'nosiz, o'zgarmas id; ism yoki email emas
  • Nomlar: kichik harf, snake_case, jadval — ko'plikda
  • Avval ota jadvallar, keyin ularga ishora qiluvchilar
  • DESCRIBE, SHOW CREATE TABLE — tuzilmani ko'rish

Keyingi dars

6-dars: Constraints — PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT, CHECK