← Back to list

Bölüm 10: Tablo Oluşturma ve Veri Manipülasyonu (DDL & DML)

Şimdiye kadar sadece var olan verileri sorguluyorduk. Şimdi kendi tablolarımızı oluşturmayı, verileri eklemeyi, güncellemeleri ve silmeyi…

Ahmet Elbüz · 2026-06-15 23:32 · 0 claps · 3.5 min read
#sql #create-table-in-sql #database-design #t-sql #türkçe
Open on Medium ↗
Wiki topics: 🛠️ · Crafts & DIY

Bölüm 10: Tablo Oluşturma ve Veri Manipülasyonu (DDL & DML)

Şimdiye kadar sadece var olan verileri sorguluyorduk. Şimdi kendi tablolarımızı oluşturmayı, verileri eklemeyi, güncellemeleri ve silmeyi öğreneceğiz.

Bu bölüm SQL’in iki ana kategorisine giriş yapacaktır:

  • DDL (Data Definition Language): CREATE, ALTER, DROP
  • DML (Data Manipulation Language): INSERT, UPDATE, DELETE

SQL’in Yapısı

SQL Komutları
├── DDL (Veri Tanımı)
│   ├── CREATE → Tablo oluştur
│   ├── ALTER → Tablo değiştir
│   └── DROP → Tablo sil
│
├── DML (Veri Manipülasyonu)
│   ├── INSERT → Veri ekle
│   ├── UPDATE → Veri güncelle
│   ├── DELETE → Veri sil
│   └── SELECT → Veri oku (zaten biliyoruz!)
│
└── DCL (Veri Kontrolü)
    ├── GRANT → İzin ver
    └── REVOKE → İzni geri al

1. CREATE TABLE: Tablo Oluşturma

Temel Yapı

CREATE TABLE TablıAdı
(
    SutunAdı1 VERITIPI KISITLAMALAR,
    SutunAdı2 VERITIPI KISITLAMALAR,
    ...
    CONSTRAINT KısıtlamaAdı KISITLAMA
)

Örnek: Sipariş Tablosu

CREATE TABLE dbo.Siparis
(
    SiparisID BIGINT NOT NULL PRIMARY KEY IDENTITY(1,1),
    Tutar DECIMAL(15,2) NOT NULL,
    SiparisTarihi DATETIME2,
    MusteriID INT NOT NULL FOREIGN KEY REFERENCES dbo.Musteri(MusteriID)
)

Bölüm Bölüm Açıklaması:

SiparisID Sütunu

SiparisID BIGINT NOT NULL PRIMARY KEY IDENTITY(1,1)
  • BIGINT: Veri tipi (-9.2Q ile +9.2Q)
  • NOT NULL: Boş olamaz (zorunlu)
  • PRIMARY KEY: Benzersiz tanımlayıcı (her satır farklı ID)
  • IDENTITY(1,1): Otomatik artış (başla:1, artış:1)

Sonuç: 1, 2, 3, 4, 5… otomatik olarak atanır

Tutar Sütunu

Tutar DECIMAL(15,2) NOT NULL
  • DECIMAL(15,2): 15 hane, 2 ondalık (para için ideal)
  • NOT NULL: Siparişin tutarı boş olamaz

SiparisTarihi Sütunu

SiparisTarihi DATETIME2
  • DATETIME2: Tarih + saat (yüksek hassasiyet)
  • Boş olabilir (NULL izinli)

MusteriID Sütunu

MusteriID INT NOT NULL FOREIGN KEY REFERENCES dbo.Musteri(MusteriID)
  • INT: Tamsayı
  • NOT NULL: Zorunlu
  • FOREIGN KEY: Başka tabloya bağlantı
  • REFERENCES dbo.Musteri(MusteriID): Müşteri tablosundaki MusteriID’ye referans

Anlamı: Her siparişin bir müşterisi olmalı, ve o müşteri Müşteri tablosunda var olmalı!

Tablo Oluşturulduktan Sonra Kontrol

SELECT * FROM dbo.Siparis

Boş bir tablo görürsün. Şimdi veri eklemeliyiz!

2. INSERT: Veri Ekleme

Tek Veri Ekleme

INSERT INTO dbo.Siparis (Tutar, SiparisTarihi, MusteriID)
VALUES (333.33, GETDATE(), 1)

Açıklama:

  • INSERT INTO → Tabloya veri ekle
  • (Tutar, SiparisTarihi, MusteriID) → Hangi sütunlara?
  • VALUES (...) → Hangi değerleri?
  • GETDATE() → Bugünün tarihi ve saati

Not: SiparisID otomatik atanacak (1)

Toplu Veri Ekleme

INSERT INTO dbo.Siparis (Tutar, SiparisTarihi, MusteriID)
VALUES 
    (1500, GETDATE(), 1),
    (777.77, GETDATE(), 1),
    (3599, GETDATE(), 1),
    (250, GETDATE(), 1)

Sonuç: 4 satır seçeçinde eklenir.

Tablo Durumu:

SiparisID    Tutar       SiparisTarihi           MusteriID
---------    --------    -------------------     ---------
1            333.33      2024-06-15 14:30:00     1
2            1500.00     2024-06-15 14:30:00     1
3            777.77      2024-06-15 14:30:00     1
4            3599.00     2024-06-15 14:30:00     1
5            250.00      2024-06-15 14:30:00     1

3. UPDATE: Veri Güncelleme

Koşullu Güncelleme

UPDATE dbo.Siparis
SET Tutar = Tutar * 1.1
WHERE Tutar < 1000

Açıklama:

  1. UPDATE → Hangi tablo?
  2. SET → Hangi sütunu ne yapacaksın?
  3. WHERE → Hangi satırları?

Mantığı:

  • Tutar < 1000 olan satırları bul
  • Onların tutarını %10 artır (Tutar × 1.1)

Sonuç:

ÖNCEKI:
SiparisID    Tutar
---------    --------
1            333.33     ← < 1000, güncellenecek
2            1500.00    ← > 1000, değişmeyecek
3            777.77     ← < 1000, güncellenecek
4            3599.00    ← > 1000, değişmeyecek
5            250.00     ← < 1000, güncellenecek

SONRA:
SiparisID    Tutar
---------    --------
1            366.66     (333.33 × 1.1)
2            1500.00    (değişmedi)
3            855.55     (777.77 × 1.1)
4            3599.00    (değişmedi)
5            275.00     (250 × 1.1)

Dikkat: WHERE Yazmamak Tehlikeli!

-- ⚠️ HATA! Tüm satırları güncelleyecek
UPDATE dbo.Siparis
SET Tutar = Tutar * 1.1

-- ✅ DOĞRU
UPDATE dbo.Siparis
SET Tutar = Tutar * 1.1
WHERE Tutar < 1000

4. DELETE: Veri Silme

Koşullu Silme

DELETE FROM dbo.Siparis
WHERE SiparisID = 3

Açıklama:

  • SiparisID = 3 olan satırı sil

Sonuç:

ÖNCEKI:
SiparisID    Tutar
---------    --------
1            366.66
2            1500.00
3            855.55     ← Silinecek
4            3599.00
5            275.00
SONRA:
SiparisID    Tutar
---------    --------
1            366.66
2            1500.00
4            3599.00
5            275.00

Not: SiparisID 3 kayboldu, ama SiparisID 4 ve 5 hala var!

Dikkat: WHERE Yazmamak Çok Tehlikeli!

-- ⚠️ HATA! Tüm satırları silecek
DELETE FROM dbo.Siparis
-- ✅ DOĞRU
DELETE FROM dbo.Siparis
WHERE SiparisID = 3

CONSTRAINT’ler (Kısıtlamalar)

PRIMARY KEY

PRIMARY KEY
  • Benzersiz tanımlayıcı
  • Boş olamaz (NOT NULL zorunlu)
  • Tablo başına sadece 1 PRIMARY KEY

FOREIGN KEY

FOREIGN KEY REFERENCES dbo.Musteri(MusteriID)
  • Başka tabloya bağlantı
  • Referans edilen değer var olmalı
  • Veri Bütünlüğü: Yetim kayıtlar oluşamaz

Örnek:

-- Bu HATA verir çünkü MusteriID 999 Müşteri tablosunda yok
INSERT INTO dbo.Siparis (Tutar, SiparisTarihi, MusteriID)
VALUES (1000, GETDATE(), 999)

NOT NULL

NOT NULL
  • Zorunlu alan
  • Boş değer kabul etmez

UNIQUE

Email NVARCHAR(100) UNIQUE
  • Her satırda farklı değer
  • NULL birden fazla olabilir

DEFAULT

SiparisTarihi DATETIME2 DEFAULT GETDATE()
  • Veri eklenmezse bu değeri kullan

Pratik Örnek: Müşteri Tablosu

CREATE TABLE dbo.Musteri
(
    MusteriID INT PRIMARY KEY IDENTITY(1,1),
    AdSoyad NVARCHAR(100) NOT NULL,
    Email NVARCHAR(100) UNIQUE,
    Telefon VARCHAR(15),
    KayitTarihi DATETIME2 DEFAULT GETDATE(),
    AktifMi BIT DEFAULT 1
)

-- Veri ekle
INSERT INTO dbo.Musteri (AdSoyad, Email, Telefon)
VALUES 
    ('Ahmet Yılmaz', 'ahmet@example.com', '5551234567'),
    ('Fatma Kara', 'fatma@example.com', '5559876543')
-- Kontrolü
SELECT * FROM dbo.Musteri
-- Güncelleme
UPDATE dbo.Musteri
SET AktifMi = 0
WHERE MusteriID = 1
-- Silme
DELETE FROM dbo.Musteri
WHERE MusteriID = 2

Güvenlik İpuçları ⚠️

1. WHERE Şartını Kontrol Et

-- Test et
SELECT * FROM dbo.Siparis WHERE Tutar < 1000
-- Sonra update/delete yap
UPDATE dbo.Siparis SET Tutar = Tutar * 1.1 WHERE Tutar < 1000

2. TRANSACTION Kullan

BEGIN TRANSACTION
UPDATE dbo.Siparis SET Tutar = Tutar * 1.1 WHERE Tutar < 1000
-- Kontrol et, sonra COMMIT ya da ROLLBACK
COMMIT
-- veya
ROLLBACK

3. Backup Al

Önemli operasyonlardan önce tablonun yedeğini al!


메타데이터
post_id
baef6ae55f48
slug
bölüm-10-tablo-oluşturma-ve-veri-manipülasyonu-ddl-dml-baef6ae55f48
url
https://medium.com/@elbuzahmet/b%C3%B6l%C3%BCm-10-tablo-olu%C5%9Fturma-ve-veri-manip%C3%BClasyonu-ddl-dml-baef6ae55f48
canonical_url
https://medium.com/@elbuzahmet/b%C3%B6l%C3%BCm-10-tablo-olu%C5%9Fturma-ve-veri-manip%C3%BClasyonu-ddl-dml-baef6ae55f48
author_url
https://medium.com/@elbuzahmet
status
ok
fetched_at
2026-07-10 00:10:16