ルール
避ける セレクト * で SQL クエリを避ける。
SELECT * で プロダクション コード を作成する アプリケーションは
アプリケーションを に スキーマ 変更 そして データ データ に依存する。
対応言語 45+はじめに
使用 セレクト を使用したクエリは、アプリケーションが使用しないカラムも含めて、テーブルからすべてのカラムを取得します。データベーススキーマが進化し、新しいカラム(パスワードやPIIのような機密データを含む)が追加されると、クエリで セレクト は、コードを変更することなく、それらを自動的に取得し始める。これはセキュリティの脆弱性を生み出し、アプリケーション・ロジックの前提を崩すことになる。
なぜそれが重要なのか
パフォーマンスへの影響:不要なカラムを検索すると、クエリの実行時間、ネットワーク転送サイズ、メモリ消費量が増加します。5カラムしか必要ない50カラムのテーブルは、必要以上に10倍のデータを転送することになり、レスポンスタイムを低下させ、インフラコストを増加させます。
セキュリティーへの影響: テーブルに追加された新しいカラム(監査フィールド、内部フラグ、センシティブなユーザーデータ)は、以下の方法で自動的に公開されます。 セレクト クエリ。あなたのAPIは、パスワードハッシュ、SSN、またはそのエンドポイント用に意図されていなかった内部ビジネスデータをリークし始めるかもしれない。
コードの保守性: いつ セレクト スキーマの変更後にクエリが壊れる場合、コンパイル時ではなく実行時にエラーが発生します。NULLでない新しいカラムやリネームされたフィールドはプロダクション・エラーを引き起こす。明示的な列リストは依存関係を明確にし、スキーマが非互換に変更された場合にビルドを中断させます。
コード例
非準拠:
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
};
}
なぜ間違っているのか:これはpassword_hash、ssn、internal_notes、deleted_atのような潜在的にセンシティブなフィールドを含むすべてのカラムを取得します。スキーマが大きくなるにつれて、このクエリは遅くなり、より多くのデータが公開されます。
✅ 準拠:
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
};
}
結論
SQLクエリでは常に明示的なカラムリストを指定する。これにより、データ漏洩を防ぎ、パフォーマンスを向上させ、コードとスキーマの依存関係を明確にすることができる。カラム名を入力するためのわずかな先行コストで、セキュリティやパフォーマンスの問題全体を防ぐことができる。
.avif)
