SQL PROGRAMLAMA NEDİR?
SQL'i ilk öğrenen biri şu soruyu sıkça duyar: "SQL gerçekten bir programlama dili mi, yoksa sadece veritabanına soru soran bir araç mı?" Cevap ikisi de — ve aradaki çizgi, SELECT yazmakla stored procedure yazmak arasındaki farkta gizli. Bu ayrımı görmeden SQL'i öğrenmek, dilin sadece yarısını kullanmak demektir.
SQL Aslında Ne Söyler?
SQL, 1970'lerde IBM laboratuvarlarında SEQUEL adıyla doğdu. Amaç, ilişkisel veritabanlarına insan diline yakın bir arayüz sunmaktı. Bugün hâlâ aynı felsefeyle çalışır: siz ne istediğinizi söylersiniz, motor nasıl getireceğine karar verir.
Klasik bir programlama dilinde "müşterileri filtrele, sırala, ilk on tanesini al" diye adım adım kod yazarsınız. SQL'de aynı işi tek cümlede ifade edersiniz: Konunun ayrıntılarına inmek isteyenler kapsamlı dokümanları üzerinden ek bilgi edinebilir.
- Imperatif yaklaşım: Döngü kur, koşulu kontrol et, sonucu biriktir, sırala, kes.
- Declarative yaklaşım: SELECT TOP 10 * FROM musteri WHERE sehir = 'Ankara' ORDER BY ciro DESC;
İkinci satır bir tarif değil, bir istektir. İşin nasıl yapılacağına query optimizer karar verir. İşte tam burada bir tartışma başlar.
Declarative Bir Dil Programlama Dili Sayılır mı?
Akademik literatürde programlama dili tanımının iki temel kriteri vardır: Turing-tam olmak ve hesaplanabilir herhangi bir problemi ifade edebilmek. Saf SQL (yani SELECT, INSERT, UPDATE, DELETE temelli kısmı) tek başına Turing-tam değildir. Bu yüzden bazı geliştiriciler SQL'i "domain-specific query language" olarak sınıflandırır.
Ancak iş burada bitmiyor. SQL'in yıllar içinde kazandığı uzantılar, dili tamamen başka bir yere taşıdı. T-SQL (Microsoft), PL/SQL (Oracle), PL/pgSQL (PostgreSQL) gibi dialect'ler döngü, koşul, değişken, hata yakalama ve fonksiyon tanımlama yetenekleri ekledi. Bu uzantılarla SQL artık Turing-tam bir programlama dilidir.
Stored Procedure: SQL'in Prosedürel Yüzü
Stored procedure, veritabanı motoruna gömülmüş, parametre alan, döngü kuran, koşul işleten kod bloklarıdır. Bir uygulamadan tek bir EXEC çağrısıyla tetiklenir ve karmaşık iş mantığını veritabanı tarafında çalıştırır.

Tipik bir stored procedure içinde şunları görürsünüz:
- Giriş parametreleri (örneğin müşteri ID veya tarih aralığı)
- Yerel değişken tanımları ve atamalar
- IF / ELSE koşul blokları
- WHILE veya cursor tabanlı döngüler
- TRY / CATCH ile hata yönetimi
- Çıkış parametreleri veya RETURN değeri
Bu yapı, SQL'i salt sorgu dilinin ötesine taşır. Tek bir prosedür içinde onlarca SELECT, hesaplama ve koşullu UPDATE çalıştırılabilir; üstelik tüm bunlar veriye en yakın katmanda, ağ gecikmesi olmadan gerçekleşir.
Trigger: Olaya Tepki Veren SQL
Trigger, belirli bir tabloda INSERT, UPDATE veya DELETE olduğunda otomatik tetiklenen kod parçasıdır. Bir kullanıcı maaş güncellediğinde otomatik log atılması, fiyat değiştiğinde önceki değerin tarihçe tablosuna yazılması — hepsi trigger'ın işidir.
Trigger'lar event-driven mantıkla çalışır. Yani siz "şu olduğunda şunu yap" dersiniz; motor olayı yakaladığında ilgili kodu çalıştırır. Bu davranış, SQL'i sadece "veri çeken" değil, "veriye tepki veren" bir dile dönüştürür. Trigger içinde de tıpkı stored procedure'da olduğu gibi IF, döngü ve değişken kullanabilirsiniz.
İki Yüzü Birlikte Düşünmek
SQL'i tek bir kalıba sokmak yanıltıcı olur. Pratikte üç katmanlı bir tablo görürsünüz:
- Declarative SQL: SELECT, JOIN, GROUP BY, window function — veriyi tarif eden katman.
- DDL: CREATE, ALTER, DROP — yapıyı tanımlayan katman.
- Prosedürel uzantılar: Stored procedure, function, trigger, package — iş mantığını kodlayan katman.
İyi bir SQL geliştiricisi bu üç katmanı birbirine karıştırmadan kullanır. Basit veri çekimi için karmaşık prosedür yazmak gereksiz; karmaşık iş kuralını uygulama katmanına itmek ise gereksiz ağ trafiği yaratır. Konuyu derinlemesine öğrenmek isteyenler kapsamlı bir SQL programlama eğitimi içeriğinden yararlanabilir.
Uygulama Dili mi, Veritabanı Dili mi?
Modern mimarilerde tartışma genellikle "mantık nerede dursun" sorusu etrafında döner. Bazı ekipler tüm iş mantığını uygulama tarafında (C#, Java, Python) tutar ve veritabanını sadece depo olarak kullanır. Bazı ekipler kritik mantığı stored procedure'larda tutarak veri yakınlığından yararlanır.

Doğru cevap genellikle ikisinin arasındadır: küme tabanlı işlemler (toplu güncelleme, raporlama, ETL) SQL'e bırakılır; kullanıcı arayüzü mantığı ve dış servis entegrasyonları uygulama katmanında kalır. SQL'in prosedürel uzantılarını öğrenmek için yapısal bir SQL programlama eğitimi izlemek, bu sınırı sezgisel olarak çizmenize yardımcı olur.
Özetle SQL Nedir?
SQL hem bir sorgu dilidir hem de programlama dilidir — hangisini gördüğünüz, hangi katmanına baktığınıza bağlıdır. SELECT yazarken declarative bir dilin sadeliğinden yararlanırsınız; stored procedure içinde döngü kurarken prosedürel bir dilin esnekliğini kullanırsınız. Bu iki yüzü ayırt edebilmek, SQL'i ezbere değil, mimari bir araç olarak kullanmanın ilk adımıdır.



