【楽しく学ぶSQL入門】第14章:システム開発現場で差がつくSQL応用構文とインデックスの仕組み
システム開発において、基本となるデータ操作を習得した後に重要となるのが、より実戦的で高度なクエリ構文やパフォーマンスの最適化。効率的なコーディングと検索速度の向上を両立させることは、大規模なデータを扱う上での必須要件です。本章では、覚えておくと表現の幅が劇的に広がる応用テクニックについて詳しく見ていきましょう。 システム開発現場で差がつくSQL応用構文 EXISTS構文 複数のSELECT文を組み合わせるアプローチとして「副問い合わせ(サブクエリ)」や「テーブル結合(JOIN)」が挙げられる。しかし、特定のデータが存在するかどうか判定する場合、EXISTS句を使うことで、よりシンプルかつ高速にSQLを記述できる局面があります。 コピー SELECT 列名 FROM テーブル名 WHERE EXISTS ( 入れ子にするSELECT文 ); EXISTSは、主にWHERE句の中でデータの存在チェックを行う条件式として使用されます。条件に合致するレコードが「1件でも見つかった時点で判定を終了する」という性質があるため、データ量が多い場合に処理を大幅に効率化できるのが特徴。 具体的な動きをシミュレーションしてみましょう。例えば、以下のような「userテーブル」と「jobテーブル」が定義されているとします。それぞれのidは互いに対応関係を持っています。(例.id = 1の山田さんは営業職) 【userテーブル】 id name 1 山田 2 佐藤 3 小西 4 吉村 5 田中 【jobテーブル】 id job_name 1 営業 2 営業 3 技術 4 技術 5 事務 上記の状態から、EXISTSを用いて職種が「営業」であるユーザーのid and nameを抽出する場合、SQL文は以下のように組み立てます。 コピー SELECT id, name FROM user WHERE EXISTS ( SELECT * FROM job WHERE user.id = job.id AND job.job_name = ‘営業’ ); クエリの実行結果を確認しましょう。条件に合致したユーザーのみが出力されます。 id name 1 山田 2 佐藤 入れ子構造の内部にある 「user.id = job.id」 によって2つのテーブルの紐づきを制御し、かつ 「job.job_name = ‘営業’」 で絞り込み条件を表現する仕組みです。 なお、EXISTS句には存在しないことを条件とする否定形、すなわちNOT EXISTSも存在します。上記のSQLをNOT EXISTSに置き換えた場合、出力結果が反転してどのように変化するか、ぜひ考えてみてください。 参考サイト:MySQL 公式サイト(EXISTSサブクエリ) CASE WHEN構文 CASE WHEN構文を使用することで、SQLのデータ参照領域において、JavaプログラムのIF文やSWITCH文のような条件分岐をシミュレートすることが可能になります。2パターンの表記法を用途に応じて使い分けるのを意識すること。 Ⅰ.特定の値を直接評価して分岐する場合 特定の列の値をそのまま比較対象としてマッピングしていくシンプルな記述方法です。 コピー CASE 評価対象の列や式 WHEN 値1 THEN 値1の時に返す値 [WHEN 値2 THEN 値2の時に返す値] [ELSE デフォルト値] END 例として、収支テーブルの全データから日付、費目、および独自の「固定変動チェック」列を生成して取得してみましょう。費目が「定期代」であれば『固定費』、費目が「交通費」「飲食費」「娯楽費」なら『変動費』、それ以外の費目はすべて『不明』と明示して出力を試みます。 コピー SELECT income_and_expenditure_date, expense, CASE expense WHEN ‘定期代’ THEN ‘固定費’ WHEN ‘交通費’ THEN ‘変動費’ WHEN ‘飲食費’ THEN ‘変動費’ WHEN ‘娯楽費’ THEN ‘変動費’ ELSE ‘不明’ END AS 固定変動チェック FROM income_and_expenditure; Ⅱ.複雑な比較条件で判定・分岐する場合 WHENの直後に個別の不等号判定や論理式を記述できる、極めて汎用性の高いアプローチです。 コピー CASE WHEN 条件1 THEN 条件1の時に返す値 [WHEN 条件2 THEN 条件2の時に返す値] [ELSE デフォルト値] END 例として、出費額の多寡に応じたラベル判定(出費が30,000円ちょうどなら『定期代』、1,000円以下なら『小出費』、3,000円以下なら『中出費』、値が未入力(NULL)の場合は『出費ではない』、それ以外は一律『大出費』とする)を行うSQLを組み立てます。 コピー SELECT income_and_expenditure_date, expenditure, CASE WHEN expenditure = 30000 THEN ‘定期代’ WHEN expenditure

