CREATE DATABASE, CREATE TABLE — sintaksis va qoidalar
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_INCREMENTraqamlari qayta ishlatilmaydi. 3-qatorni o'chirsangiz, keyingi yangi qator4bo'ladi,3emas. 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.sqlfayliga saqlang. Biror narsani buzib qo'ysangiz —DROP DATABASE dokon;va qaytadanmysql -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