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ı:
| Kural | Açıklama |
|---|---|
| ç, c’den sonra gelir | cay < çay < dağ |
| ğ, g’den sonra gelir | gaz < ğül < hal |
| ı ve i farklı harflerdir | ışık < istanbul |
| ö, o’dan sonra gelir | ordu < öğle < para |
| ş, s’den sonra gelir | sal < şal < tal |
| ü, u’dan sonra gelir | uzay < üzüm < vadi |
Not:
collate()olmadanORDER BY isimUnicode 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'