Skip to main content

SQL Formatlayıcı

SQL sorgularınızı okunabilir hale getirin: anahtar kelime yazımı ve girintili yan tümceler. Metin sabitlerinin ve yorumların içine dokunmaz.

Veriler tarayıcınızdan çıkmazGüncelleme: Temmuz 2026
Anahtar kelimeler
Girinti

Soldaki alana bir sorgu yapıştırın, biçimlendirilmiş hali burada görünecek.

Özet (TL;DR)

  • Biçimlendirme bir regex işi değil, tokenizasyon işidir: WHERE baslik = 'select' sorgusunda regex tabanlı araçlar string içindeki kelimeyi de büyütür.
  • Bu araç string literal, tırnaklı tanımlayıcı ve her iki yorum biçimini (-- ve /* */) dokunulmaz atom olarak taşır.
  • Biçimlendirme sorgu planını değiştirmez; boşluk ve satır sonu veritabanı için anlamsızdır, kazanç tamamen okuyan insandadır.
  • Her SELECT kolonunu ayrı satıra almak diff gürültüsünü düşürür: tek kolon eklendiğinde tek satır değişir.

Code review'a düşen 200 karakterlik tek satır

Pull request'te tek satırlık bir değişiklik var ve o satır 200 karakter. İçinde üç JOIN, dört koşul ve bir alt sorgu geçiyor. Yorum yazacaksınız ama önce sorguyu kafanızda parçalamanız gerekiyor, çünkü nerede bittiğini görmek için yatay kaydırmanız lazım. İnceleme burada fiilen duruyor: kimse o satırı okumuyor, herkes onaylıyor. Biçimlendirme meselesi estetik değil, gözden geçirilebilirlik meselesi.

Neden regex ile SQL biçimlendirilmez

İnternetteki biçimlendiricilerin çoğu ham metin üzerinde arama değiştirme yapıyor ve bu üç ayrı yerden sızdırıyor. Birincisi: string literal içindeki bir kelime anahtar kelime sanılıp büyütülür, sorgu artık farklı bir satırı sorgular. İkincisi: -- yorumunun ortasına satır sonu eklenirse yorumun devamı gerçek SQL haline gelir ya da tersi olur. Üçüncüsü: tek tırnak içinde geçen '' kaçış dizisi naif bir tarayıcının senkronunu bozar, o noktadan sonra bütün belge yanlış sınıflandırılır.

sql
-- Girdiselect * from posts where title = 'select' and note = 'it''s fine' -- Regex tabanlı biçimlendirici (bozuk)SELECT * FROM posts WHERE title = 'SELECT' AND note = 'it''S FINE' -- Tokenize eden biçimlendirici (doğru)SELECT  *FROM  postsWHERE  title = 'select'  AND note = 'it''s fine'

Çözüm üç sorun için de aynı: metni bir kez düzgün tokenize edip string literalleri, tırnaklı tanımlayıcıları ve yorumları bayt bayt geçen opak parçalar olarak ele almak. Bu araçta yalnızca anahtar kelime olarak sınıflandırılan tokenlerin büyük küçük harfi değişiyor, yerleşim kararları da yalnızca token sınırlarına bakıyor. Çıktının bir başka özelliği idempotent olması: biçimlendirilmiş çıktıyı tekrar biçimlendirdiğinizde aynı metin çıkıyor, bu da tokenizer'ın kendi çıktısını okuyabildiğinin kanıtı.

Okunabilir clause yapısı ve diff kalitesi

Araç SELECT, FROM, WHERE, JOIN türevleri, GROUP BY, ORDER BY gibi clause başlangıçlarını tanıyıp her birini yeni satıra alıyor, gövdelerini de bir seviye içeri kaydırıyor. UNION bu kuralın dışında: iki sorguyu aynı seviyede ayırdığı için gövdesi içeri alınmıyor, aksi halde olmayan bir iç içelik ima edilirdi. LEFT OUTER JOIN gibi çok kelimeli açılışlar LEFT JOIN'den önce sınanıyor, yoksa kısa eşleşme kazanır ve artakalan kelimeler yanlış satırda kalır.

Her SELECT kolonunu ayrı satıra almanın somut faydası versiyon kontrolünde ortaya çıkıyor. Tek satırdaki elli kolonluk listeye bir kolon eklediğinizde diff o satırın tamamını değişmiş gösterir ve gözden geçiren kişi farkı gözüyle aramak zorunda kalır. Kolonlar ayrı satırlardaysa eklenen kolon tek bir yeşil satır olarak görünür. Aynı mantık AND ile ayrılan koşullar için de geçerli.

Anahtar kelime yazımı ve dialekt farkları

Anahtar kelimeleri büyük harfle yazmak yaygın gelenek, çünkü tablo ve kolon adlarından görsel olarak ayrılıyor. Küçük harf tercih eden ekipler de var ve teknik olarak ikisi de doğru: hiçbir veritabanı anahtar kelimelerde büyük küçük harfe duyarlı değil. Seçimin kendisinden çok tutarlılık önemli, çünkü karışık yazım gereksiz diff üretiyor. Araç yalnızca tanıdığı anahtar kelime listesindeki sözcükleri dönüştürüyor; status adlı bir kolon ya da public adlı bir şema yazdığınız gibi kalıyor.

VeritabanıTanımlayıcı tırnağıÖrnek
PostgreSQLÇift tırnak"order"
MySQL / MariaDBTers tırnakorder
SQL ServerKöşeli parantez[order]
SQLiteÜçü de kabul edilir"order" veya order
OracleÇift tırnak"ORDER"
Tokenizer üç biçimi de tanımlayıcı olarak tanır ve içeriğine dokunmaz.

Bilgi

Tanımlayıcı tırnakları büyük küçük harf duyarlılığını da değiştirir. PostgreSQL tırnaksız tanımlayıcıları küçük harfe indirger, tırnak içine aldığınızda ise yazdığınız hali korur; bu yüzden "Users" ile users farklı iki tablodur. Biçimlendirici bu yüzden tırnaklı tanımlayıcıların içine hiç dokunmaz.

Biçimlendirme performansı etkilemez

Sık gelen bir endişe, girintili sorgunun daha yavaş çalışacağı. Öyle bir şey yok. Veritabanı sorguyu kendi ayrıştırıcısından geçirip bir plana çeviriyor ve boşluklar o ayrıştırmanın ilk adımında düşüyor. Tek satırlık sorgu ile yirmi satırlık biçimlendirilmiş hali aynı planı üretir, aynı sürede çalışır. Ağ üzerinden birkaç yüz bayt fazla metin gider, ölçülebilir bir farkı yoktur. Kazanç tamamen sorguyu okuyacak insanda.

Sıkça Sorulan Sorular

Biçimlendirmek sorgu performansını etkiler mi?
Etkilemez. Boşluk ve satır sonu SQL ayrıştırıcısı için anlamsızdır, sorgu planı birebir aynı çıkar. Tek fark ağ üzerinden giden birkaç yüz baytlık metin ve bu hiçbir ölçümde görünmez.
Anahtar kelimeleri büyük mü küçük mü yazmalıyım?
İkisi de doğru, veritabanı ayrım yapmıyor. Büyük harf daha yaygın çünkü anahtar kelimeleri tablo ve kolon adlarından ayırıyor. Asıl mesele ekip içinde tek bir seçime bağlı kalmak; karışık yazım depoda gereksiz diff gürültüsü çıkarır.
Araç SQL'imin doğruluğunu kontrol ediyor mu?
Hayır, bu bir biçimlendirici, doğrulayıcı değil. Sözdizimi hatası olan bir sorguyu da elinden geldiğince biçimlendirir. Sorgunun geçerli olup olmadığını ancak hedef veritabanı söyleyebilir, çünkü her dialektin dilbilgisi farklı.
Çok uzun sorgularda ne oluyor?
Yüzlerce satırlık sorgular sorunsuz işlenir, işlem tarayıcınızda ve tek geçişte yapılır. Çok derin iç içe alt sorgularda girinti seviyesi sağa doğru büyür; bu noktada asıl çözüm biçimlendirme değil, sorguyu CTE'lere (WITH blokları) bölmektir.
String literallerimi bozar mı?
Bozmaz. Tek tırnaklı literaller, tırnaklı tanımlayıcılar ve yorumlar tokenizer tarafından opak parça olarak alınır ve çıktıya birebir yazılır. '' kaçış dizisi de aynı literalin parçası olarak tüketilir, o yüzden tarayıcı senkronunu kaybetmez.

Mustafa Kürşad BAŞER

Yazılım Mühendisi

Karmaşık sorunları zarif çözümlerle buluşturan, öğrendiklerini paylaşarak değer katmayı seven bir yazılım mühendisi.

Hızlı Erişim

Bağlantı

© 2026 Mustafa Kürşad BAŞER. Tüm hakları saklıdır.