Kural
SQL sorgularında SELECT * kullanmaktan kaçının.
Üretim (production) kodunda SELECT * kullanımı, uygulamaları şema değişikliklerine karşı kırılgan hale getirir ve veri bağımlılıklarını gizler.
Desteklenen diller: 45+Giriş
Üretim (production) sorgularında SELECT * ifadesini kullanmak, uygulamanızın kullanmadığı sütunlar dahil olmak üzere bir tablodaki her sütunu getirir. Veritabanı şemaları geliştikçe ve yeni sütunlar eklendiğinde (şifreler veya PII gibi hassas veriler dahil), SELECT * kullanan sorgular kod değişikliği gerektirmeden bunları otomatik olarak almaya başlar. Bu durum güvenlik açıklarına yol açar ve uygulama mantığınızdaki kabulleri bozar.
Neden önemli?
Performans etkisi: Gereksiz sütunları almak sorgu yürütme süresini, ağ aktarım boyutunu ve bellek tüketimini artırır. Yalnızca 5 sütuna ihtiyacınız varken 50 sütunlu bir tablo kullanmak, gerekenden 10 kat daha fazla veri aktardığınız anlamına gelir; bu da yanıt sürelerini düşürür ve altyapı maliyetlerini artırır.
Güvenlik etkileri: Tablolara eklenen yeni sütunlar (denetim alanları, dahili bayraklar, hassas kullanıcı verileri), SELECT * sorguları aracılığıyla otomatik olarak dışarı açılır. API'niz asla bu uç nokta (endpoint) için tasarlanmamış parola hash'lerini, TC kimlik numaralarını veya dahili iş verilerini sızdırmaya başlayabilir.
Kod sürdürülebilirliği: Şema değişikliklerinden sonra SELECT * sorguları bozulduğunda, hata derleme zamanında değil çalışma zamanında (runtime) gerçekleşir. Boş bırakılamayan (non-nullable) yeni bir sütun veya yeniden adlandırılmış bir alan üretim hatalarına neden olur. Açık sütun listeleri bağımlılıkları netleştirir ve şemalar uyumsuz şekilde değiştiğinde derlemeyi kesintiye uğratır.
Kod örnekleri
❌ Kural dışı:
async function getUserProfile(userId) {
const query = 'SELECT * FROM users WHERE id = ?';
const [user] = await db.execute(query, [userId]);
return {
name: user.name,
email: user.email,
createdAt: user.created_at
};
}
Neden yanlıştır?: Bu ifade; password_hash, ssn, internal_notes veya deleted_at gibi potansiyel olarak hassas alanlar dahil tüm sütunları getirir. Şema büyüdükçe bu sorgu yavaşlar ve daha fazla veri açığa çıkarır, oysa uygulama yalnızca üç alan kullanmaktadır.
✅ Kurallara uygun:
async function getUserProfile(userId) {
const query = `
SELECT name, email, created_at
FROM users
WHERE id = ?
`;
const [user] = await db.execute(query, [userId]);
return {
name: user.name,
email: user.email,
createdAt: user.created_at
};
}
Sonuç
SQL sorgularında her zaman açık sütun listeleri belirtin. Bu, veri sızıntılarını önler, performansı artırır ve kod ile şema arasındaki bağımlılıkları netleştirir. Sütun adlarını yazmanın küçük ön maliyeti, tüm güvenlik ve performans sorunları sınıfının önüne geçer.

