sql-best-practices
効率的・安全・保守しやすいデータベースクエリを実現するSQL開発のベストプラクティスを提供します。クエリのパフォーマンス最適化やSQLインジェクション対策など、実務で即使える指針をカバーします。
description の原文を見る
SQL development best practices for writing efficient, secure, and maintainable database queries
SKILL.md 本文
SQL ベストプラクティス
コア原則
- 一貫したフォーマットと意味のあるエイリアスを使用した、明確で読みやすい SQL を書く
- 適切なインデックスと最適化を通じてクエリパフォーマンスを優先する
- SQL インジェクションを防ぐためのセキュリティベストプラクティスを実装する
- データの整合性のためにトランザクションを適切に使用する
- 複雑なクエリにはインラインコメントを付ける
クエリ記述標準
フォーマットとスタイル
- SQL キーワード (SELECT、FROM、WHERE、JOIN) は大文字を使用する
- 読みやすさのため、各主要句を新しい行に配置する
- 意味のあるテーブルエイリアスを使用する (例:
customers AS cではなくcustomers AS x) - サブクエリとネストされた条件は一貫してインデントする
- カラムリストと条件をそろえて視覚的な明確性を実現する
SELECT
c.customer_id,
c.customer_name,
o.order_date,
o.total_amount
FROM customers AS c
INNER JOIN orders AS o ON c.customer_id = o.customer_id
WHERE o.order_date >= '2024-01-01'
AND o.status = 'completed'
ORDER BY o.order_date DESC;
カラム選択
- 本番環境では
SELECT *を避け、必要なカラムを明示的にリストアップする - カラムエイリアスを使用して出力を明確にする:
SELECT first_name AS "First Name" - SELECT のカラム順序を論理的グループ分けのため検討する
フィルタリングと条件
- WHERE 句では最も制限的な条件を最初に配置する
- 適切な演算子を使用する: 複数の
OR条件よりINを優先する - 存在をチェックする場合はサブクエリの
INよりEXISTSを使用する - WHERE 句では可能な限りインデックス付きカラムに関数を適用しない
- SQL インジェクションを防ぐためにパラメータ化クエリを使用する
-- 推奨: 存在チェックに EXISTS を使用
SELECT c.customer_name
FROM customers AS c
WHERE EXISTS (
SELECT 1 FROM orders AS o
WHERE o.customer_id = c.customer_id
AND o.order_date > '2024-01-01'
);
-- 避ける: インデックス付きカラムの関数
WHERE YEAR(order_date) = 2024
-- 推奨: 範囲比較
WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01'
JOIN ベストプラクティス
- WHERE での暗黙的な結合の代わりに、常に明示的な JOIN 構文を使用する
- JOIN タイプを明示的に指定する (INNER、LEFT、RIGHT、FULL OUTER)
- 可能な場合は最大から最小のテーブル順に結合する
- データ要件に基づいて適切な JOIN タイプを使用する
- CROSS JOIN は慎重に扱い、意図的であることを確認する
-- 明示的な結合 (推奨)
SELECT c.name, o.order_id
FROM customers AS c
INNER JOIN orders AS o ON c.customer_id = o.customer_id;
-- 避ける: 暗黙的な結合
SELECT c.name, o.order_id
FROM customers c, orders o
WHERE c.customer_id = o.customer_id;
パフォーマンス最適化
インデックス設計ガイドライン
- WHERE、JOIN、ORDER BY 句で使用されるカラムにインデックスを作成する
- 複数カラムのクエリについて複合インデックスを検討する
- 過度なインデックス作成を避ける。各インデックスは書き込みオーバーヘッドを追加する
- 定期的にインデックスを分析および保守する
- 頻繁に実行されるクエリにはカバリングインデックスを使用する
クエリ最適化
- EXPLAIN/EXPLAIN ANALYZE を使用してクエリ実行プランを理解する
- 全結果が必要でない場合は TOP/LIMIT で結果セットを制限する
- 大規模な結果セットにはページネーションを使用する
- 相関サブクエリは可能な限り避け、JOIN を使用する
- 頻繁に実行されるクエリについてはクエリキャッシュを検討する
-- ページネーション例
SELECT product_id, product_name, price
FROM products
ORDER BY product_id
LIMIT 20 OFFSET 40;
集約ベストプラクティス
- 可能な場合は GROUP BY の前にフィルタリングを行う (WHERE と HAVING の比較)
- 適切な集約関数を使用する (COUNT、SUM、AVG など)
- 累計合計とランキングのためウィンドウ関数を検討する
-- 効率的: 集約前にフィルタリング
SELECT category_id, COUNT(*) AS product_count
FROM products
WHERE active = true
GROUP BY category_id
HAVING COUNT(*) > 10;
トランザクション管理
- トランザクションはできるだけ短く保つ
- ユースケースに適切な分離レベルを使用する
- ROLLBACK を含めたエラーハンドリングを常に含める
- オープンなトランザクション中のユーザーインタラクションを避ける
- 複雑なマルチステップ操作にはセーブポイントを使用する
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
IF @@ERROR <> 0
ROLLBACK TRANSACTION;
ELSE
COMMIT TRANSACTION;
セキュリティベストプラクティス
- 常にパラメータ化クエリまたはプリペアドステートメントを使用する
- ユーザー入力を SQL 文字列に直接連結しない
- データベースユーザーに最小権限の原則を適用する
- 機密データアクセスを監査およびログに記録する
- 機密データを保存時および転送中に暗号化する
-- パラメータ化クエリの使用 (疑似コード)
PREPARE stmt FROM 'SELECT * FROM users WHERE username = ?';
EXECUTE stmt USING @username;
データ修正ベストプラクティス
INSERT 操作
- カラム名を常に明示的に指定する
- 可能な場合は複数行に対してバルク挿入を使用する
- insert-or-update シナリオについて MERGE/UPSERT の使用を検討する
INSERT INTO customers (customer_name, email, created_at)
VALUES
('John Doe', 'john@example.com', CURRENT_TIMESTAMP),
('Jane Smith', 'jane@example.com', CURRENT_TIMESTAMP);
UPDATE 操作
- WHERE 句を常に含める (すべての行を意図的に更新する場合を除く)
- UPDATE クエリは SELECT で先にテストする
- 重要な更新についてはトランザクションの使用を検討する
DELETE 操作
- WHERE 句を常に含める
- 復元可能なデータに対してはソフトデリート (ステータスフラグ) を使用する
- 関連テーブルへの CASCADE の影響を検討する
ネーミング規則
- テーブルとカラム名には snake_case を使用する
- テーブル名には単数形を使用する (customers ではなく customer)
- プライマリキーにテーブル名をプレフィックスとする:
customer_id - 説明的な名前を使用する:
otではなくorder_total - ブール値カラムに適切にプレフィックスを付ける:
is_active、has_shipped
ドキュメント
- クエリ内の複雑なビジネスロジックにコメントを付ける
- ストアドプロシージャを目的、パラメータ、例でドキュメント化する
- テーブルとカラムの説明のためデータディクショナリを保守する
- データベーススキーマの変更をバージョン管理する
エラーハンドリング
- ストアドプロシージャに適切なエラーハンドリングを実装する
- デバッグに十分なコンテキストを含めてエラーをログに記録する
- 呼び出し側のアプリケーションに意味のあるエラーメッセージを返す
- サポートされている場所では TRY-CATCH ブロックを使用する
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- mindrally
- リポジトリ
- mindrally/skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/mindrally/skills / ライセンス: Apache-2.0
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。