İletişim

SQL Nedir?

Kısa tanım

SQL (Structured Query Language), ilişkisel veritabanlarında veriyi tanımlamak, sorgulamak ve değiştirmek için kullanılan standart ve bildirimsel bir dildir. SQL ile yazılan bir veritabanı sorgusu hangi verinin istendiğini tarif eder; o veriye hangi yoldan ulaşılacağına veritabanı karar verir. PostgreSQL, MySQL, SQL Server ve SQLite aynı ISO standardına dayanır, ancak her birinin kendine özgü sözdizimi farkları vardır.

Diğer adları: Structured Query Language, Yapılandırılmış Sorgu Dili, veritabanı sorgusu, SQL sorgusu, sequel

Terminalde müşteri tablosundan şehre göre filtrelenen ve isme göre sıralanan kayıtları getiren bir SQL SELECT sorgusu ve sonucu

“Nasıl” değil, “ne” istediğinizi yazarsınız

SQL bildirimsel (declarative) bir dildir. Bir sorguda verinin hangi diskten, hangi sırayla ve hangi yapı üzerinden okunacağını söylemezsiniz; yalnızca sonucun neye benzemesi gerektiğini tarif edersiniz. Gerisini veritabanının sorgu planlayıcısı (query planner) üstlenir: tabloların birleştirme sırasını, kullanılacak indeksi ve okuma yöntemini istatistiklere bakarak seçer. Bu yüzden aynı sorgu, tek karakteri değişmeden, tabloya uygun bir veritabanı indeksi eklendiği anda saniyelerden milisaniyelere inebilir.

SQL 1980'lerin sonunda ANSI ve ISO standardı hâline geldi (ISO/IEC 9075) ve o tarihten bu yana düzenli olarak genişletildi. Pratikte ise her sistem kendi “lehçesini” konuşur. Satır sayısını sınırlamak PostgreSQL, MySQL ve SQLite'ta LIMIT, SQL Server'da TOP, standartta FETCH FIRST n ROWS ONLY ile yapılır. Temel sorgular sistemler arasında taşınabilir; otomatik artan kimlikler, tarih fonksiyonları ve JSON işlemleri ise genellikle taşınmaz.

Komut grupları

GrupÖrnek komutlarNe işe yarar?
DDL (Data Definition)CREATE, ALTER, DROPTabloları, sütunları ve kısıtları, yani veritabanı şemasını tanımlar
DML (Data Manipulation)SELECT, INSERT, UPDATE, DELETESatırları okur, ekler, günceller ve siler
DCL (Data Control)GRANT, REVOKEHangi kullanıcının neye erişebileceğini belirler
TCL (Transaction Control)BEGIN, COMMIT, ROLLBACKBirden fazla komutu tek bir veritabanı işlemi olarak yönetir

Bir SELECT sorgusunu okumak

Aşağıdaki sorgu, aktif ürün sayısı beşin altında kalan kategorileri listeler; hiç ürünü olmayan kategoriler de sonuçta yer alır:

SELECT c.name AS category, COUNT(p.id) AS product_count
FROM categories c
LEFT JOIN products p
  ON p.category_id = c.id AND p.is_active = true
GROUP BY c.name
HAVING COUNT(p.id) < 5
ORDER BY product_count;

INNER JOIN yalnızca iki tarafta da eşleşmesi olan satırları döndürürdü; boş kategoriler sessizce kaybolurdu. LEFT JOIN soldaki tablonun tüm satırlarını korur ve eşleşme yoksa sağ taraftaki sütunları NULL ile doldurur. Burada COUNT(*) yerine COUNT(p.id) yazılması da bilinçli bir tercihtir: COUNT(*) boş bir kategori için bile 1 sayardı, çünkü birleştirme sonucunda o kategori için tek bir satır oluşur. Ürünün aktif olma koşulunun WHERE yerine ON içinde durması da aynı nedenle önemlidir; WHERE'e taşınsaydı NULL satırları elenir ve sorgu fiilen bir INNER JOIN'e dönüşürdü.

Sorgu yazıldığı sırayla çalışmaz

SQL'de cümle SELECT ile başlar, ama mantıksal değerlendirme sırası farklıdır: FROM ve JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. Bu sıra birçok kafa karıştırıcı hatayı açıklar. SELECT içinde verilen bir takma ad (alias) çoğu veritabanında WHERE'de kullanılamaz, çünkü o aşamada henüz hesaplanmamıştır; ORDER BY'da ise kullanılabilir. Gruplanmış veriye koşul koymak için de WHERE değil HAVING gerekir.

Sık yapılan hatalar

  • = NULL ile karşılaştırmak: NULL “bilinmeyen” anlamına gelir ve hiçbir şeye, kendisine bile eşit değildir. Doğru yazım IS NULL ve IS NOT NULL'dır.
  • Kullanıcı girdisini sorgu metnine eklemek: Metin birleştirerek kurulan sorgular SQL enjeksiyonuna kapı açar. Değerler her zaman parametreli sorgu (prepared statement) ile gönderilmelidir.
  • WHERE'siz UPDATE veya DELETE: Tablodaki tüm satırları etkiler. Üretimde elle yapılan değişiklikleri bir işlem içinde çalıştırıp etkilenen satır sayısını kontrol etmek ve ancak ondan sonra COMMIT etmek iyi bir alışkanlıktır.
  • Uygulama kodunda SELECT *: Gereksiz sütunları ağ üzerinden taşır ve tabloya sütun eklendiğinde beklenmedik davranışlara yol açabilir.

SQL, ilişkisel veritabanlarının ortak dilidir; ama bugün bazı NoSQL sistemleri ve veri ambarları da SQL'e benzeyen sorgu dilleri sunar. Dili iyi bilmek, bir ORM kullanılsa bile, üretilen sorguların neden yavaş olduğunu anlamanın en kısa yoludur.

İlgili terimler

← Sözlüğe dön