Okunur SQL yazmak: dört sorgunun önce ve sonra hali

"Tek satıra sıkışmış bir sorguyu okunur hale getirirken anlamının değişmediğinden emin olmak."

4 6 dk. 29 Eylül 2026 03:22 / Çözümce / Web Araçları
SQL sorgusunun tek satırdan okunur satırlara ayrılmasını gösteren çizim
SQL Biçimlendirici'yi dört sorguyla denedik: 23 simgelik sorguda dizge ve yorum korundu, WHERE'siz DELETE uyarıldı. Önce ve sonra hali, sınırlar.

Rapor sorgusu yazan, koda bakan ve sorguları başka bir veritabanına taşıyanlar için: aracın neyi düzelttiği ve neyi düzeltmediği.

Bir rapor sorgusunu yönetim panelinden kopyaladınız ve tek satır geliyor: bir JOIN, bir GROUP BY, bir HAVING, sonunda sıralama. Nerede bittiğini görmek için yatay kaydırma çubuğunu sürüklüyorsunuz. Noktasız, virgülsüz yazılmış uzun bir cümleyi okumak gibi; anlam var ama her adımda durup kendiniz bölüyorsunuz.

Bu yazıda birkaç kurgusal sorguyu SQL Biçimlendirici'ye yapıştırdık: bir rapor sorgusu, içinde SQL sözcükleri geçen bir sorgu, WHERE'siz bir DELETE, bir MySQL sorgusu ve tek satıra indirilecek bir sorgu. Önce ve sonra halini, aracın uyardığı yerleri ve emin olamadığımız yerleri yazdık. Denemelerin hepsini tarayıcıda, gerçek veritabanına dokunmadan yaptık.

Kısaca

Araç sorguyu anahtar kelimelere göre satırlara bölüp girintiliyor. Sonra çıktıyı yeniden okuyup girdiyle simge simge karşılaştırıyor; sorgunun anlamı değişmişse bunu söylüyor. Sorguyu çalıştırmıyor ve hiçbir veritabanına bağlanmıyor.

Bir sorguda hata arayan kişi genelde bir yan cümleye bakar: WHERE doğru mu, HAVING neyi süzüyor, ORDER BY hangi sütuna göre? Sorgu tek satırsa her seferinde satırı zihninizde bölmeniz gerekir. Sorgunun her yan cümlesi kendi satırında dururken bunlar aynı anda gözünüze girer.

Bu okunurluk farkı yalnız görüntü meselesi değil. Sorguyu kod incelemesine koyduğunuzda, bir meslektaşınıza gönderdiğinizde ya da altı ay sonra kendiniz açtığınızda aynı sorguyu tekrar çözmeniz gerekmez. Değişiklik geçmişi de düzgün satırlarda çok daha temiz görünür, çünkü bir koşulu değiştirdiğinizde yalnız o satır değişir.

Araçta kaynak lehçe, hedef lehçe, işlem (Biçimlendir ya da Küçült), anahtar kelime büyüklüğü ve girinti boyutu seçiliyor. Biz PostgreSQL, BÜYÜK harf ve 2 boşluk girintiyle başladık.

Deneme 1: JOIN, GROUP BY ve HAVING

İlk sorgu, siparişi olan müşterilerin toplam tutarını veren bir rapor. Yapıştırdığımız hali:

select k.ad, count(o.id) as adet, sum(o.tutar) as toplam from musteriler k join siparisler o on o.musteri_id = k.id where o.durum = 1 group by k.ad having sum(o.tutar) > 1000 order by toplam desc

Biçimlendirilmiş hali:

SELECT
  k.ad,
  COUNT(o.id) AS adet,
  SUM(o.tutar) AS toplam
FROM
  musteriler k
  JOIN siparisler o ON o.musteri_id = k.id
WHERE
  o.durum = 1
GROUP BY
  k.ad
HAVING
  SUM(o.tutar) > 1000
ORDER BY
  toplam DESC

Yan cümleler ayrıldı, JOIN tablonun altında girintili durdu, küçük harfli anahtar kelimeler büyüdü. Sütun ve tablo adlarına dokunulmadı. Takma adlar (k, o, adet, toplam) olduğu gibi kaldı; araç adları güzelleştirmiyor, yalnızca yerleştiriyor. Bu, rapor sorgularını tekrar tekrar aynı biçimde yapıştıran biri için önemli: her seferinde aynı girdi aynı çıktıyı veriyor.

Deneme 2: dizge ve yorumun içindeki anahtar kelimeler

Biçimlendiricilerin sık düştüğü tuzak, metnin içinde SQL sözcüğü geçmesi. Sorguya bilerek şunları koyduk: bir tek satırlık yorum, tırnaklı bir metin olarak select this, süslü yorum içinde where ve LIKE deseninde from.

-- aktif musteriler
select id, ad, 'select this' as not_metni /* eski: where durum=0 */ from musteriler where aktif = true and ad like '%from%' order by ad

Çıktı:

-- aktif musteriler
SELECT
  id,
  ad,
  'select this' AS not_metni /* eski: where durum=0 */
FROM
  musteriler
WHERE
  aktif = TRUE
  AND ad LIKE '%from%'
ORDER BY
  ad

Dizgenin içindeki select this ve yorumun içindeki where durum=0 küçük harfli kaldı, yeni satıra bölünmedi. LIKE deseni de aynen duruyor. Araç "Sorgu aynen korundu, 23 simgenin hepsi yerinde" diye yazdı; yani çıktıyı girdiyle simge simge karşılaştırdı.

Bu karşılaştırmanın işe yaradığı yer şu: güzel görünen ama anlamı değişmiş bir sorgu, çalışan ve yanlış sonuç veren bir sorgudur. Bozuk JSON gözle görünür, bozuk SQL ise sessizce çalışır.

Deneme 3: WHERE'siz DELETE

Üçüncü denemede tek satır yazdık: DELETE FROM siparisler;. Araç sorguyu değiştirmedi ama kırmızı bir kutu açtı.

WHERE'siz DELETE sorgusunda SQL Biçimlendirici kırmızı tehlike kutusu gösteriyor: sorgu aynen korundu
WHERE'siz DELETE sorgusunda SQL Biçimlendirici kırmızı tehlike kutusu gösteriyor: sorgu aynen korundu

Kutuda "1 tehlikeli nokta var, sorgu aynen korundu" yazıyor. Denetim raporu da 1. satır, 1. sütunda DELETE olduğunu, WHERE olmadığını ve sorgunun tablodaki bütün satırları sileceğini söylüyor.

Bu uyarıyı yalnız bu sorguyla gördük. UPDATE gibi başka WHERE'siz yazımları ya da alt sorgu içindeki DELETE'i denemedik; yani "araç her tehlikeli sorguyu yakalar" diyemeyiz. Uyarı, bakışınızı bir kez daha sorguya çevirmek için iyi bir hatırlatma. Üretim veritabanına bağlı bir konsolda WHERE'siz sorguyu çalıştırmadan önce gözünüzün bir kez duraklaması yeterli olabilir; araç bunu sizin yerinize yapmıyor, size fırsat veriyor.

Deneme 4: MySQL sorgusunu SQL Server'a çevirmek

Kaynak lehçeyi MySQL, hedef lehçeyi SQL Server seçtik ve MySQL'e özgü üç yazımlı bir sorgu yapıştırdık:

select ad, ifnull(telefon, 'yok') as tel, now() as simdi from musteriler order by id limit 10

Çıktı:

SELECT
  TOP 10 ad,
  ISNULL(telefon, 'yok') AS tel,
  GETDATE() AS simdi
FROM
  musteriler
ORDER BY
  id
MySQL'den SQL Server'a çeviri: ifnull, now ve limit yazımlarının değiştiği yeşil kutu ve çıktı
MySQL'den SQL Server'a çeviri: ifnull, now ve limit yazımlarının değiştiği yeşil kutu ve çıktı
MySQL yazımı SQL Server yazımı Araç ne dedi?
ifnull(telefon, 'yok') ISNULL(telefon, 'yok') 1. satır: ifnull yerine ISNULL
now() GETDATE() 1. satır: NOW() yerine GETDATE()
limit 10 SELECT TOP 10 1. satır: LIMIT 10 yerine SELECT TOP 10

Araç her değişikliği listeledi ve "dizge sabitleri ve yorumlar birebir aynı kaldı, yalnızca lehçeye bağlı yazım değişti" dedi. Bu, çeviriyi gözle kontrol etmenizi kolaylaştırıyor: üç madde, üç değişiklik.

Yalnız bu üç yazımı denedik. Kendi sorgunuzda başka fonksiyon, saklı yordam ya da lehçeye özgü bir söz dizimi varsa çevirinin aynı sonucu verdiğini varsaymayın. Çeviriyi hedef veritabanında bir kez çalıştırıp sonucu karşılaştırın.

Deneme 5: Küçült ve çizgili yorum

İşlem listesindeki Küçült seçeneği sorguyu tek satıra indiriyor. Bunu, en üstte -- aktif musteriler diye çizgili yorumu olan çok satırlı bir sorguyla denedik. Çizgili yorum satırın sonuna kadar geçerli olduğu için, tek satıra inince kendinden sonraki her şeyi yutabilir. Çıktı şöyle geldi:

/* aktif musteriler */ SELECT id, ad FROM musteriler WHERE aktif = TRUE AND ad LIKE '%from%' ORDER BY ad

Araç çizgili yorumu blok yoruma çevirmiş; sayfa bunu "aksi halde yorum kendinden sonraki her şeyi yutardı" diye açıklıyor. Çıktı yine "aynen korundu, 18 simgenin hepsi yerinde" mesajını verdi. Yani tek satıra inerken sorgunun anlamı da yorumun yeri de bozulmadı.

Aynı ekranda anahtar kelimeleri küçük harfe çevirmeyi ve girintiyi 4 boşluğa çıkarmayı da denedik. Birinci sorgu küçük harfli ve 4 boşluk girintili geldi, sütun ve tablo adları yine değişmedi. Ekibinizin kod stili bunu istiyorsa ayar iki tıkla değişiyor.

Aracın yapmadıkları

  • Sorguyu çalıştırmıyor. Sayfa hiçbir veritabanına bağlanmadığını ve sorgunun tarayıcıdan çıkmadığını yazıyor.
  • Sorgunun mantığını denetlemiyor. Yanlış bir JOIN koşulunu ya da eksik bir HAVING'i düzeltmez; yalnız yazımı düzenler. Sonucun doğru olup olmadığını görmek için sorguyu kendi veritabanınızda çalıştırmanız gerekir.
  • Çeviri kesin değil. Bizim denediğimiz üç yazım doğru çıktı, ama tüm lehçe farklarını denemedik.
  • Tehlike uyarısı sınırlı olabilir. WHERE'siz DELETE'i yakaladı, diğer biçimleri denemedik.
  • Lehçeyi siz seçiyorsunuz. Araç sorgunun hangi veritabanından geldiğini kendisi bilmiyor; kaynak lehçe listesinden doğrusunu seçmeniz gerekiyor.

Kontrol listesi

  • Kaynak lehçe sorgunun yazıldığı veritabanına göre seçildi
  • Hedef lehçe yalnız çeviri gerekiyorsa değiştirildi
  • "Aynen korundu" mesajı görüldü
  • Kırmızı tehlike kutusu varsa maddeler okundu
  • Çevrilen sorgu hedef veritabanında çalıştırıldı ve sonuç karşılaştırıldı

Araç sorgunuzu daha akıllı yapmıyor; sorgunuzu okunur yapıyor ve okunur hale gelirken bir şeyin değişmediğini kanıtlıyor. Kendi sorgunuzla SQL Biçimlendirici'yi ücretsiz deneyebilirsiniz.

Bu denemeyi 29 Eylül 2026'da Chrome'da yaptık. Tablo ve sütun adları kurgusaldır.

Kaynaklar

Alıntı
Bahsedilen
  • Belirtilmemiş
Temel Alınan Çalışma
  • Belirtilmemiş

Puanla

Yazar Hakkında


Hüseyin Battal Fotoğraf

Meslek Lisesi Bilişim Teknolojileri Web Tasarımı bölümü mezunuyum. Balıkesir Üniversitesi Bilgisayar Programcılığı Ön Lisans programının son senesinde İzmir'e yatay geçiş yaptım. Dokuz Eylül Üniversitesi'nde yarım dönem eğitim aldıktan sonra çalışmaya karar verdim. Yarattığım ve/veya yamaladığım yazılım, eklenti, web uygulamaları ve modları yayınlamak için bir platform oluşturmaya karar verdim ve bu amaç doğrultusunda Çözümce projesini hayata geçirdim.