Kural
Kaçınılması gerekenler SELECT * içinde SQL sorgularında *'yi kullanmayın.
SELECT * içinde üretim kodunda uygulamaları uygulamaları
kırılgan şemaya şema değişikliklere ve gizler verilerin bağımlılıklarını gizler.
Desteklenen diller: 45+Giriş
Kullanım SELECT * Üretim ortamındaki sorgular, uygulamanızın kullanmadığı sütunlar da dahil olmak üzere bir tablodaki tüm sütunları alır. Veritabanı şemaları değişip yeni sütunlar eklendiğinde (şifreler veya kişisel kimlik bilgileri gibi hassas veriler dahil), SELECT * kod değişikliği yapmadan otomatik olarak bunları almaya başlar. Bu durum güvenlik açıklarına yol açar ve uygulama mantığınızdaki varsayımları bozar.
Neden önemli?
Performans üzerindeki etkisi: Gereksiz sütunların alınması, sorgu yürütme süresini, ağ aktarım boyutunu ve bellek tüketimini artırır. Aslında sadece 5 sütuna ihtiyacınız varken 50 sütun içeren bir tablo, gereğinden 10 kat daha fazla veri aktardığınız anlamına gelir; bu da yanıt sürelerini uzatır ve altyapı maliyetlerini artırır.
Güvenlikle ilgili hususlar: Tablolara eklenen yeni sütunlar (denetim alanları, dahili işaretleyiciler, hassas kullanıcı verileri) otomatik olarak şu yol üzerinden erişime açılır: SELECT * sorgular. API’niz, o uç nokta için asla amaçlanmamış şifre karma değerlerini, sosyal güvenlik numaralarını veya şirket içi verileri sızdırmaya başlayabilir.
Kodun bakım kolaylığı: Ne zaman SELECT * Şema değişikliklerinin ardından sorgular çalışmaz hale gelir; bu hata derleme aşamasında değil, çalışma zamanında ortaya çıkar. Null değeri kabul etmeyen yeni bir sütun veya yeniden adlandırılmış bir alan, üretim ortamında hatalara neden olur. Açıkça belirtilen sütun listeleri, bağımlılıkları netleştirir ve şemalar uyumsuz şekilde değiştiğinde derleme işlemlerini durdurur.
Kod örnekleri
❌ Uygun değil:
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ış: Bu sorgu, password_hash, ssn, internal_notes veya deleted_at gibi potansiyel olarak hassas alanlar da dahil olmak üzere tüm sütunları getirir. Şema büyüdükçe bu sorgu yavaşlar ve daha fazla veriyi açığa çıkarır; oysa uygulama sadece üç alanı kullanmaktadır.
✅ Uygunluk:
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ça 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 getirdiği küçük bir ön maliyet, güvenlik ve performans sorunlarının tüm türlerini önler.

