Biçimlendirilmiş Sorgu
Biçimlendirici yukarıdaki girdiye uygulandığında şunu üretir:
SELECT
u.id,
u.name,
u.email,
o.total,
o.created_at
FROM users u
INNER JOIN orders o
ON u.id = o.user_id
WHERE
o.created_at >= '2024-01-01'
AND o.status = 'completed'
GROUP BY
u.id,
u.name,
u.email,
o.total,
o.created_at
HAVING COUNT(o.id) > 5
ORDER BY o.total DESC
LIMIT 100;
Her yan tümce kendi satırında başlar. Sütun listeleri satır başına bir öğe olacak şekilde düzenlenir. ON koşulu JOIN anahtar kelimesinin altında hizalanır. Bu düzen, her yan tümceyi bir bakışta taranabilir kılar.
SQL Biçimlendirme Neden Önemlidir
Tek satırlık bir sorgu, yazdığınızda iyi çalışır. Ancak başka birinin okuması gerektiğinde veya üç ay sonra hata ayıklamak için geri döndüğünüzde bakım sorunu haline gelir.
Biçimlendirilmiş SQL birkaç şeyi hızlandırır:
- Kod incelemesi. İnceleyen kişi, her biri kendi satırındayken JOIN koşullarını, WHERE yüklemlerini ve GROUP BY sütunlarını bağımsız olarak kontrol edebilir. Tek satırlık bir sorgu, herhangi bir bölümünü doğrulamak için tüm stringi ayrıştırmayı gerektirir.
- Hata ayıklama. Bir sorgu yanlış sonuçlar döndürdüğünde, sorunu genellikle yan tümceleri tek tek yorumlayarak izole edersiniz. Düzgün girintilenmiş SQL bu süreci basitleştirir.
- Mantık hatalarını bulma. Yanlış hizalanmış GROUP BY sütunları ve SELECT sütunları, toplama hatalarının yaygın bir kaynağıdır. Her iki liste de dikey olarak biçimlendirildiğinde, uyumsuzluklar hemen görünür.
- Pull request diff’leri. Bir WHERE koşulundaki değişiklik, diff’te tek bir değiştirilmiş satır olarak görünmelidir. Tek satırlık bir sorguda, herhangi bir değişiklik tüm satırı etkiler ve diff’i inceleme için kullanışsız hale getirir.
SQL Biçimlendirme Kuralları
Çoğu SQL stil kılavuzunda görünen kurallar:
Anahtar kelimeler büyük harf: SELECT, FROM, WHERE, JOIN, ON, GROUP BY, HAVING, ORDER BY, LIMIT. Bu, SQL yapısını tanımlayıcılardan ayırır.
SELECT listelerinde sütun başına bir satır. Bu, sorgu sürüm kontrolüne gönderiliyorsa kısa sorgular için bile geçerlidir, çünkü SELECT listesine gelecekte yapılacak eklemeler yeniden biçimlendirme gerektirmez.
JOIN koşulları yeni bir satırda, JOIN anahtar kelimesinin altında girintili olarak. ON yan tümcesi görsel olarak JOIN’e aittir, WHERE yan tümcesine değil.
WHERE koşullarının her biri kendi satırında, AND veya OR devam satırının başında (sonunda değil). Devam satırlarına AND ile başlamak, bitişik satırları düzenlemeden bir koşulu yorumlamayı kolaylaştırır.
CTE Biçimlendirme
CTE’ler, aynı türetilmiş veri kümesine birden çok kez referans veren sorgularda veya ara sonuçları adlandırmanın okunabilirliği artırdığı durumlarda alt sorguların yerini alır. Standart biçimlendirme deseni:
WITH
active_users AS (
SELECT id, name, email
FROM users
WHERE status = 'active'
),
recent_orders AS (
SELECT user_id, SUM(total) AS total_spend
FROM orders
WHERE created_at >= '2024-01-01'
GROUP BY user_id
)
SELECT
u.name,
u.email,
r.total_spend
FROM active_users u
INNER JOIN recent_orders r
ON u.id = r.user_id
ORDER BY r.total_spend DESC;
Her CTE, WITH bloğu içinde bir seviye girintilenir. Son SELECT, iç içe alt sorgu duvarı yerine adlandırılmış veri kümelerine karşı normal bir sorgu olarak okunur.
Pencere Fonksiyonları
Pencere fonksiyonları, OVER yan tümceleri uzun olabileceğinden kendi biçimlendirme işlemlerini gerektirir:
SELECT
user_id,
order_date,
total,
SUM(total) OVER (
PARTITION BY user_id
ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total,
RANK() OVER (
PARTITION BY user_id
ORDER BY total DESC
) AS order_rank
FROM orders;
OVER yan tümcesi fonksiyonla aynı satırda açılır. PARTITION BY, ORDER BY ve çerçeve yan tümceleri parantez içinde girintili olarak ayrı satırlara gider.
Komut Satırı ve IDE Alternatifleri
CI boru hatlarında otomatik biçimlendirme için SQLFluff en yetenekli seçenektir. SQL dosyalarını lint’ler ve düzeltir, birden çok lehçeyi destekler ve pre-commit hooks ile entegre olur:
pip install sqlfluff
sqlfluff fix --dialect postgres query.sql
PostgreSQL’e özel olarak pg_format, SQL’i PostgreSQL sözdizimi bilinciyle biçimlendirir:
brew install pgformatter
pg_format query.sql
IDE entegrasyonu için VS Code’daki SQL Tools uzantısı ve DataGrip’in yerleşik biçimlendiricisi standart SQL’i iyi işler. Pratik denge: IDE biçimlendiricileri geçici sorgular için kullanışlıdır, ancak bir CI linter’ı ekip genelinde tutarlı biçimlendirmeyi uygulamanın tek yoludur. İkisini de kullanın: yazarken yerel olarak biçimlendirin, kaçanları yakalamak için CI’da uygulayın.