Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Veri İşlemleri (DML)

INSERT — Veri Ekleme

Strict Mod (Varsayılan)

Aynı birincil anahtarla tekrar INSERT yapılırsa hata döner. Birincil anahtar ilk sütun değeridir.

INSERT INTO urunler VALUES (1, 'Klavye', 450.00, true)
INSERT INTO urunler VALUES (2, 'Mouse', 250.00, true)
INSERT INTO urunler VALUES (3, 'Monitör', 3500.00, true)

-- Aynı anahtar tekrar eklenirse hata:
INSERT INTO urunler VALUES (1, 'Kulaklık', 200.00, true)
-- Hata: Anahtar zaten mevcut: '1'

Upsert Mod (INSERT OR REPLACE)

Mevcut anahtarı sessizce günceller:

INSERT OR REPLACE INTO urunler VALUES (1, 'Kulaklık', 200.00, true)
-- OK: id=1 satırı 'Kulaklık' olarak güncellendi

Veri Akışı

INSERT → WAL (günlüe yaz) → Bellek tamponu
       → Tampon doldu mu?
          → Evet → Diske flush (sıkıştırılmış dosya)
          → Hayır → Bellekte bekle

SELECT — Veri Sorgulama

Temel Sorgular

-- Tüm satırları getir
SELECT * FROM urunler

-- Belirli sütunlar
SELECT urun_adi, fiyat FROM urunler

-- Koşullu sorgu
SELECT * FROM urunler WHERE fiyat > 100

-- Sıralama
SELECT urun_adi, fiyat FROM urunler ORDER BY fiyat DESC

-- Limit
SELECT * FROM urunler ORDER BY fiyat DESC LIMIT 10

Birden Fazla Koşul

-- AND / OR
SELECT * FROM siparisler WHERE musteri_id = 5 AND durum = 'tamamlandi'
SELECT * FROM urunler WHERE fiyat < 100 OR aktif = false

-- IN listesi
SELECT * FROM urunler WHERE id IN (1, 3, 5, 7)

-- BETWEEN
SELECT * FROM urunler WHERE fiyat BETWEEN 100 AND 500

-- LIKE kalıp eşlemesi
SELECT * FROM urunler WHERE urun_adi LIKE '%Klavye%'

-- IS NULL / IS NOT NULL
SELECT * FROM urunler WHERE fiyat IS NOT NULL

Gruplama ve Toplama

-- Basit gruplama
SELECT musteri_id, COUNT(*) AS siparis_sayisi
FROM siparisler
GROUP BY musteri_id
ORDER BY siparis_sayisi DESC

-- Birden fazla aggregate
SELECT musteri_id,
       COUNT(*) AS siparis_sayisi,
       SUM(tutar) AS toplam,
       AVG(tutar) AS ortalama
FROM siparisler
GROUP BY musteri_id

-- HAVING filtresi
SELECT musteri_id, COUNT(*) AS siparis_sayisi
FROM siparisler
GROUP BY musteri_id
HAVING COUNT(*) > 5

DISTINCT

SELECT DISTINCT musteri_id FROM siparisler
SELECT DISTINCT sehir FROM musteriler ORDER BY collate(sehir)

CASE İfadesi

SELECT urun_adi, fiyat,
    CASE
        WHEN fiyat < 100 THEN 'ucuz'
        WHEN fiyat < 1000 THEN 'orta'
        ELSE 'pahalı'
    END AS fiyat_grubu
FROM urunler

Alt Sorgu (Subquery)

-- WHERE'de alt sorgu
SELECT * FROM urunler
WHERE fiyat > (SELECT AVG(fiyat) FROM urunler)

-- IN ile alt sorgu
SELECT * FROM musteriler
WHERE id IN (SELECT musteri_id FROM siparisler WHERE tutar > 1000)

CTE (Common Table Expression)

WITH aylik_satis AS (
    SELECT date_part('month', tarih) AS ay,
           SUM(tutar) AS toplam
    FROM siparisler
    GROUP BY date_part('month', tarih)
)
SELECT ay, toplam
FROM aylik_satis
WHERE toplam > 10000
ORDER BY ay

UNION

SELECT urun_adi FROM urunler WHERE fiyat < 100
UNION ALL
SELECT urun_adi FROM urunler WHERE aktif = false

-- UNION (tekrarlıları kaldırır)
SELECT sehir FROM musteriler
UNION
SELECT sehir FROM tedarikciler

Dil Duyarlı Sıralama

-- Türkçe alfabetik sıralama (ı, i, ö, ü, ç, ş, ğ düzgün sıralanır)
SELECT isim FROM musteriler ORDER BY collate(isim)

-- Azalan sırada
SELECT urun_adi, fiyat FROM urunler ORDER BY collate(urun_adi) DESC

-- Birden fazla kriter
SELECT isim, sehir FROM musteriler ORDER BY collate(sehir), collate(isim)

collate() fonksiyonu locale-duyarlı sıralama anahtarı üretir. Varsayılan locale menzelet.toml dosyasındaki [collation] default_locale ayarıyla belirlenir.

Türkçe sıralama kuralları:

KuralAçıklama
ç, c’den sonra gelircay < çay < dağ
ğ, g’den sonra gelirgaz < ğül < hal
ı ve i farklı harflerdirışık < istanbul
ö, o’dan sonra gelirordu < öğle < para
ş, s’den sonra gelirsal < şal < tal
ü, u’dan sonra geliruzay < üzüm < vadi

Not: collate() olmadan ORDER BY isim Unicode byte sıralaması kullanır; Türkçe için yanlış sonuç verebilir.

JOIN Sorguları

SELECT s.siparis_id, u.urun_adi, s.miktar
FROM siparisler s
JOIN urunler u ON s.urun_id = u.id

Tüm JOIN türleri ve detaylı örnekler için bkz: JOIN Türleri

UPDATE — Veri Güncelleme

-- Tek sütun güncelle
UPDATE urunler SET fiyat = 500.00 WHERE id = 1

-- Birden fazla sütun
UPDATE urunler SET fiyat = 600.00, aktif = false WHERE id = 2

-- Koşullu güncelleme
UPDATE siparisler SET durum = 'iptal' WHERE toplam_tutar = 0

DELETE — Veri Silme

-- Koşullu silme
DELETE FROM urunler WHERE id = 3

-- Birden fazla koşul
DELETE FROM siparisler WHERE durum = 'iptal' AND tarih < '2024-01-01'