CREATE TABLEilə cədvəl yaratmaq vəALTER TABLE,DROP TABLEilə onu dəyişmək- Müxtəlif VBİS-lərdə məlumat tiplərini seçmək
- Məhdudiyyətlərlə məlumatın düzgünlüyünü qorumaq
İndiyə qədər hazır cədvəllərlə işlədik. Bəs onları kim və necə qurur? Yaxşı cədvəl təkcə sütunlar siyahısı deyil, həm də qaydalar toplusudur: soyadsız şagird, mənfi qiymət və ya eyni e-poçtla iki istifadəçi bazaya ümumiyyətlə düşməməlidir. Bu dərsdə məktəb dərnəkləri üçün öz cədvəllərimizi yaradacağıq.
CREATE TABLE
CREATE TABLE ad (...) mötərizədə hər sütunun adını, tipini və qaydalarını sadalayır. Aşağıda clubs (dərnəklər) cədvəli yaradılır: id — əsas açar, name — boş və təkrar ola bilməz, max_members — yazılmasa 20 olur və müsbət olmalıdır.
CREATE TABLE clubs (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
room TEXT,
max_members INTEGER DEFAULT 20
CONSTRAINT positive_max CHECK (max_members > 0)
);
INSERT INTO clubs (name, room) VALUES ('Chess club', '201'), ('Robotics', 'Lab 2');
INSERT INTO clubs (name, room, max_members) VALUES ('Debate', '105', 12);
SELECT * FROM clubs ORDER BY id;▸ Gözlənilən nəticə
id | name | room | max_members 1 | Chess club | 201 | 20 2 | Robotics | Lab 2 | 20 3 | Debate | 105 | 12
max_members yazılmayıb, ona görə DEFAULT qiyməti — 20 götürülüb.Məlumat tipləri
Hər sütunun tipi var: tam ədəd, kəsr ədəd, mətn, tarix. MySQL, PostgreSQL və SQL Server tipə ciddi əməl edir: tam ədəd sütununa mətn yazmaq olmur. Tiplərin adları isə VBİS-dən VBİS-ə fərqlənir.
| Məlumat | SQLite | MySQL | PostgreSQL | SQL Server |
|---|---|---|---|---|
| Tam ədəd | INTEGER | INT | INTEGER | INT |
| Dəqiq kəsr (pul) | yoxdur: qəpiklə INTEGER | DECIMAL(10, 2) | NUMERIC(10, 2) | DECIMAL(10, 2) |
| Mətn | TEXT | VARCHAR(100) | VARCHAR(100), TEXT | NVARCHAR(100) |
| Tarix | TEXT ('2025-09-15') | DATE | DATE | DATE |
| Doğru / yalan | INTEGER (0/1) | BOOLEAN | BOOLEAN | BIT |
| Avtomatik nömrə | INTEGER PRIMARY KEY | INT AUTO_INCREMENT | INTEGER GENERATED ALWAYS AS IDENTITY | INT IDENTITY(1, 1) |
VARCHAR(100) — ən çoxu 100 simvolluq mətn; DECIMAL(10, 2) — 10 rəqəmli, onlardan 2-si vergüldən sonra olan ədəd.SQLite-da isə tip yalnız tövsiyədir (type affinity). O, qiyməti tipə çevirməyə çalışır: '15' mətni tam ədəd sütununda 15 ədədinə çevrilir, 'abc' isə çevrilə bilmədiyi üçün mətn olaraq qalır. TYPEOF() funksiyası qiymətin əslində hansı tipdə saxlandığını göstərir.
CREATE TABLE t (n INTEGER, s TEXT);
INSERT INTO t VALUES ('abc', 42), ('15', 7);
SELECT n, TYPEOF(n) AS n_type,
s, TYPEOF(s) AS s_type
FROM t;▸ Gözlənilən nəticə
n | n_type | s | s_type abc | text | 42 | text 15 | integer | 7 | text
SELECT 0.1 + 0.2 AS result;▸ Gözlənilən nəticə
result 0.30000000000000004
Məhdudiyyətlər
Məhdudiyyət (constraint) VBİS-in hər INSERT və UPDATE-də yoxladığı qaydadır. Qayda pozulursa, əmr rədd edilir və cədvəl dəyişmir. Səhvi təkcə proqramda deyil, bazada da tutmaq etibarlıdır: məlumatı hansı proqram yazsa da, qayda işləyir.
PRIMARY KEY— hər sətrin unikal identifikatoru; təkrar ola bilməz.NOT NULL— sütun boş (NULL) qala bilməz.UNIQUE— iki sətirdə eyni qiymət ola bilməz (məsələn, e-poçt).DEFAULT— qiymət yazılmayanda istifadə olunan qiymət.CHECK (şərt)— şərt doğru olmalıdır, məsələn,price >= 0.FOREIGN KEY/REFERENCES— qiymət başqa cədvəldə mövcud olmalıdır.
CREATE TABLE clubs (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
INSERT INTO clubs (name) VALUES ('Chess club');
INSERT INTO clubs (name) VALUES ('Chess club'); -- same name again▸ Gözlənilən nəticə
Error: UNIQUE constraint failed: clubs.name
CREATE TABLE clubs (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
max_members INTEGER DEFAULT 20
CONSTRAINT positive_max CHECK (max_members > 0)
);
INSERT INTO clubs (name, max_members) VALUES ('Drama', 0);▸ Gözlənilən nəticə
Error: CHECK constraint failed: positive_max
CONSTRAINT positive_max qaydaya ad verir — xəta mesajında onu görmək rahatdır.FOREIGN KEY: cədvəllər arasında əlaqə
club_members cədvəli hansı şagirdin hansı dərnəkdə olduğunu saxlayır. REFERENCES clubs(id) deyir ki, club_id mövcud dərnəyə istinad etməlidir. UNIQUE (club_id, student_id) bir şagirdin eyni dərnəyə iki dəfə yazılmasına imkan vermir. Diqqət: SQLite köhnə proqramlarla uyğunluq üçün xarici açarları susmaya görə yoxlamır — PRAGMA foreign_keys = ON yazmaq lazımdır. MySQL (InnoDB), PostgreSQL və SQL Server isə onları susmaya görə yoxlayır.
PRAGMA foreign_keys = ON;
CREATE TABLE clubs (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE club_members (
id INTEGER PRIMARY KEY,
club_id INTEGER NOT NULL REFERENCES clubs(id),
student_id INTEGER NOT NULL REFERENCES students(id),
UNIQUE (club_id, student_id)
);
INSERT INTO clubs (name) VALUES ('Chess club'), ('Robotics');
INSERT INTO club_members (club_id, student_id) VALUES (1, 3), (1, 6), (2, 10);
SELECT c.name AS club, s.first_name
FROM club_members AS m
JOIN clubs AS c ON c.id = m.club_id
JOIN students AS s ON s.id = m.student_id
ORDER BY c.name, s.first_name;▸ Gözlənilən nəticə
club | first_name Chess club | Leyla Chess club | Rəşad Robotics | Kamran
PRAGMA foreign_keys = ON;
CREATE TABLE clubs (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
CREATE TABLE club_members (
id INTEGER PRIMARY KEY,
club_id INTEGER NOT NULL REFERENCES clubs(id),
student_id INTEGER NOT NULL REFERENCES students(id)
);
INSERT INTO clubs (name) VALUES ('Chess club');
-- there is no club 5 and no student 99
INSERT INTO club_members (club_id, student_id) VALUES (5, 99);▸ Gözlənilən nəticə
Error: FOREIGN KEY constraint failed
PRAGMA sətrini silsən, SQLite bu səhv sətri səssizcə qəbul edəcək.Cədvəli dəyişmək və silmək
ALTER TABLE ... ADD COLUMN mövcud cədvələ yeni sütun əlavə edir; köhnə sətirlər həmin sütunda DEFAULT qiymətini alır. Aşağıda məhsullara endirim sütunu əlavə edib oyunlara 15% endirim veririk.
ALTER TABLE products ADD COLUMN discount REAL DEFAULT 0;
UPDATE products SET discount = 0.15 WHERE category = 'Games';
SELECT name, price, discount,
ROUND(price * (1 - discount), 2) AS final_price
FROM products
WHERE category IN ('Games', 'Home')
ORDER BY id;▸ Gözlənilən nəticə
name | price | discount | final_price Desk lamp | 34.99 | 0 | 34.99 Chess set | 42 | 0.15 | 35.7
Sinif otaqları üçün rooms cədvəli yarat: id — əsas açar, name — boş ola bilməyən və təkrarlanmayan mətn, seats — susmaya görə 30 olan və 0-dan böyük olmalı tam ədəd. Sonra Lab 1 otağını 24 yerlə, Hall A otağını isə yer sayı göstərmədən əlavə et və name, seats sütunlarını id-yə görə sıralanmış göstər.
CREATE TABLE rooms (
id INTEGER PRIMARY KEY
-- name and seats with their constraints
);
-- insert the two rooms, then SELECT▸ Gözlənilən nəticə
name | seats Lab 1 | 24 Hall A | 30
courses cədvəlinə susmaya görə 0 olan tam ədəd tipli rating sütunu əlavə et. Informatics fənninin kursunun reytinqini 5 et. Sonra krediti 3 olan kursların adını (title) və reytinqini id-yə görə sıralanmış göstər.
-- 1) ALTER TABLE ...
-- 2) UPDATE ...
-- 3) SELECT ...▸ Gözlənilən nəticə
title | rating Geometry | 0 Organic Chemistry | 0 Python Basics | 5
Əsas fikirlər
CREATE TABLEsütunların adını, tipini və qaydalarını müəyyən edir.- Tip adları VBİS-lərdə fərqlidir; SQLite tiplərə sərbəst, digərləri ciddi yanaşır.
PRIMARY KEY,NOT NULL,UNIQUE,CHECK,DEFAULTsəhv məlumatı bazanın özündə dayandırır.REFERENCESmövcud olmayan sətrə istinadı qadağan edir; SQLite-daPRAGMA foreign_keys = ONlazımdır.ALTER TABLEcədvəli dəyişir,DROP TABLEisə onu birdəfəlik silir.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.