CREATE TABLEile tablo oluşturmak,ALTER TABLEveDROP TABLEile değiştirmek- Farklı VTYS'lerde veri tiplerini seçmek
- Kısıtlamalarla verinin doğruluğunu korumak
Şimdiye kadar hazır tablolarla çalıştık. Peki onları kim, nasıl kurar? İyi bir tablo yalnızca bir sütun listesi değil, aynı zamanda bir kurallar bütünüdür: soyadı olmayan bir öğrenci, eksi bir fiyat ya da aynı e-postaya sahip iki kullanıcı veritabanına hiç girmemelidir. Bu derste okul kulüpleri için kendi tablolarımızı oluşturacağız.
CREATE TABLE
CREATE TABLE ad (...) parantez içinde her sütunun adını, tipini ve kurallarını sıralar. Aşağıda clubs (kulüpler) tablosu oluşturuluyor: id birincil anahtardır, name boş olamaz ve tekrar edemez, max_members yazılmazsa 20 olur ve pozitif 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;▸ Beklenen çıktı
id | name | room | max_members 1 | Chess club | 201 | 20 2 | Robotics | Lab 2 | 20 3 | Debate | 105 | 12
max_members yazılmadığından DEFAULT değeri olan 20 kullanıldı.Veri tipleri
Her sütunun bir tipi vardır: tam sayı, ondalıklı sayı, metin, tarih. MySQL, PostgreSQL ve SQL Server tiplere sıkı sıkıya uyar: tam sayı sütununa metin yazılamaz. Tiplerin adları ise VTYS'den VTYS'ye değişir.
| Veri | SQLite | MySQL | PostgreSQL | SQL Server |
|---|---|---|---|---|
| Tam sayı | INTEGER | INT | INTEGER | INT |
| Kesin ondalık (para) | yok: kuruş cinsinden INTEGER | DECIMAL(10, 2) | NUMERIC(10, 2) | DECIMAL(10, 2) |
| Metin | TEXT | VARCHAR(100) | VARCHAR(100), TEXT | NVARCHAR(100) |
| Tarih | TEXT ('2025-09-15') | DATE | DATE | DATE |
| Doğru / yanlış | INTEGER (0/1) | BOOLEAN | BOOLEAN | BIT |
| Otomatik numara | INTEGER PRIMARY KEY | INT AUTO_INCREMENT | INTEGER GENERATED ALWAYS AS IDENTITY | INT IDENTITY(1, 1) |
VARCHAR(100) en fazla 100 karakterlik metindir; DECIMAL(10, 2) ise 10 basamaklı, 2 basamağı virgülden sonra olan bir sayıdır.SQLite'ta ise tip yalnızca bir öneridir (type affinity). SQLite değeri sütun tipine çevirmeye çalışır: '15' metni tam sayı sütununda 15 sayısına dönüşür, 'abc' ise çevrilemediği için metin olarak kalır. TYPEOF() fonksiyonu bir değerin gerçekte hangi tipte saklandığını gösterir.
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;▸ Beklenen çıktı
n | n_type | s | s_type abc | text | 42 | text 15 | integer | 7 | text
SELECT 0.1 + 0.2 AS result;▸ Beklenen çıktı
result 0.30000000000000004
Kısıtlamalar
Kısıtlama (constraint), VTYS'nin her INSERT ve UPDATE sırasında denetlediği bir kuraldır. Kural çiğnenirse komut reddedilir ve tablo değişmez. Hataları yalnızca uygulamada değil, veritabanında yakalamak güvenilirdir: veriyi hangi program yazarsa yazsın kural çalışır.
PRIMARY KEY— her satırın benzersiz kimliği; tekrar edemez.NOT NULL— sütun boş (NULL) kalamaz.UNIQUE— iki satırda aynı değer olamaz (örneğin e-posta).DEFAULT— değer yazılmadığında kullanılan değer.CHECK (koşul)— koşul sağlanmalıdır, örneğinprice >= 0.FOREIGN KEY/REFERENCES— değer başka bir tabloda bulunmalı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▸ Beklenen çıktı
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);▸ Beklenen çıktı
Error: CHECK constraint failed: positive_max
CONSTRAINT positive_max kurala bir ad verir; böylece hata iletisinde kolayca tanınır.FOREIGN KEY: tablolar arası bağlantı
club_members tablosu hangi öğrencinin hangi kulüpte olduğunu tutar. REFERENCES clubs(id), club_id sütununun var olan bir kulübe başvurması gerektiğini söyler. UNIQUE (club_id, student_id) bir öğrencinin aynı kulübe iki kez yazılmasını engeller. Dikkat: SQLite eski programlarla uyumluluk için yabancı anahtarları varsayılan olarak denetlemez; PRAGMA foreign_keys = ON yazmak gerekir. MySQL (InnoDB), PostgreSQL ve SQL Server ise onları varsayılan olarak denetler.
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;▸ Beklenen çıktı
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);▸ Beklenen çıktı
Error: FOREIGN KEY constraint failed
PRAGMA satırını silersen SQLite bu hatalı satırı sessizce kabul eder.Tabloyu değiştirme ve silme
ALTER TABLE ... ADD COLUMN var olan bir tabloya yeni bir sütun ekler; eski satırlar bu sütunda DEFAULT değerini alır. Aşağıda ürünlere bir indirim sütunu ekleyip oyunlara %15 indirim veriyoruz.
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;▸ Beklenen çıktı
name | price | discount | final_price Desk lamp | 34.99 | 0 | 34.99 Chess set | 42 | 0.15 | 35.7
Sınıflar için bir rooms tablosu oluştur: id birincil anahtar, name boş olamayan ve tekrar edemeyen bir metin, seats ise varsayılan değeri 30 olan ve 0'dan büyük olması gereken bir tam sayı olsun. Sonra Lab 1 odasını 24 kişilik, Hall A odasını ise kişi sayısı vermeden ekle ve name, seats sütunlarını id değerine göre sıralı göster.
CREATE TABLE rooms (
id INTEGER PRIMARY KEY
-- name and seats with their constraints
);
-- insert the two rooms, then SELECT▸ Beklenen çıktı
name | seats Lab 1 | 24 Hall A | 30
courses tablosuna varsayılan değeri 0 olan tam sayı tipinde bir rating sütunu ekle. Informatics branşındaki derse 5 puan ver. Sonra kredisi 3 olan derslerin adını (title) ve puanını id değerine göre sıralı göster.
-- 1) ALTER TABLE ...
-- 2) UPDATE ...
-- 3) SELECT ...▸ Beklenen çıktı
title | rating Geometry | 0 Organic Chemistry | 0 Python Basics | 5
Önemli noktalar
CREATE TABLEsütunların adlarını, tiplerini ve kurallarını belirler.- Tip adları VTYS'lere göre değişir; SQLite tiplere esnek, diğerleri katı yaklaşır.
PRIMARY KEY,NOT NULL,UNIQUE,CHECKveDEFAULThatalı veriyi veritabanının kendisinde durdurur.REFERENCESvar olmayan bir satıra başvurmayı yasaklar; SQLite'taPRAGMA foreign_keys = ONgerekir.ALTER TABLEtabloyu değiştirir,DROP TABLEise onu kalıcı olarak siler.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.