1から始めるPythonデータ分析 - やりたいこと逆引きリスト ▶︎▶︎

【SQL】サブクエリ|SQLの可能性を圧倒的に広げる手法

サブクエリとは?

サブクエリとは日本語では「副問い合わせ」や「入れ子」と呼ばれていますが、

日本語での表現が非常に分かりにくい…

英語の「Sub-Query(サブクエリ)」の方が理解しやすいのではないでしょうか

Sub(サブ)

《substituteの略》補欠。補充員。

多く複合語の形で用い、下位の、補助の、副の、の意を表す。

Weblio英和辞書

英語の意味通り、補欠というイメージです

SQLでは「主力のクエリー」に対し「補欠のクエリー」が存在しています

スポーツの試合と同じように、「総力戦」でデータを抽出しましょう

チームスポーツのイメージ

サブクエリの使い方

サブクエリの使い方はずばり…

「SQLの中に、別のSQLを組み込む」

SQLで抽出した結果を、別のSQLのFROM句やWHERE句で使うことができます

ルールはたった1つで、クエリを()カッコで括ります

まずは「FROM句」でサブクエリを使うパターン

SELECT ***

FROM ( サブクエリ )

WHERE ***

そして「WHERE句」でサブクエリを使うパターン

SELECT ***

FROM ***

WHERE 列名 論理式 ( サブクエリ )

今までWHERE句では、「具体的な条件値」を指定してきましたが

サブクエリでは条件値自体をSQLで抽出することができます

名前 IN ( ‘佐藤’ , ‘鈴木’ , ‘高橋’ )

条件値が10個以内であれば、IN句で並べて記述することができますが

数が増える場合はサブクエリで代用しましょう

名前 IN ( SELECT 名前 FROM *** WHERE *** )

サブクエリはインデントで目立たせろ

サブクエリを使うと1つのSQLの中に複数のSELECTやWHEREが出てきます

可読性を高めるために、インデント(空白)を上手に使いましょう

サブクエリを使うメリット

サブクエリを使うことで、SQLの可能性を何倍にも広げることができます

  1. 複数の抽出を1回のSQLにまとめることができる
  2. 抽出するデータ量を減らして、高速化することができる
  3. JOINやWITHと組み合わせて、可読性を上げることができる

サブクエリを使う理由は様々ですが、

複雑な集計になればなるほど「使わざるを得ない状況」が出てきます

サブクエリに苦手意識を持っている初心者は多くいますが、

利用イメージをしっかり持てってSQLを書きましょう

サブクエリのイメージ

ここでサブクエリの利用イメージをしっかりと理解しましょう

まずは「FROM句でサブクエリ」を使うイメージです

サブクエリをFROM句で利用する

続いて「WHERE句でサブクエリ」使うイメージです

サブクエリをWHERE句で利用する

サブクエリは「複数重ねる」ことができます

「クエリの中にクエリの中にクエリ…」と記述していくと複雑になってしまうので

頭の中で「1つ目のサブクエリでは●●を抽出する」と計画を立てましょう

実践

最後にサブクエリの抽出を実践で使ってみましょう

お題

「野球部の生徒に絞ってテストの点数と名前を抽出し、点数の高い順に並び替える」SQLを記述する

テーブルイメージ
SELECT
    名前, 点数
FROM
    テスト点数テーブル
WHERE
    名前 IN ( -- ここからサブクエリ
             SELECT 名前
             FROM 部活テーブル
             WHERE 部活 = '野球'
       ) -- ここまで
ORDER BY
    点数 DESC

注目ポイントは「最初のWHERE句でサブクエリ」を使っているところです

サブクエリで「野球部の名前を抽出」してWHERE句の名前条件として利用

そして点数テーブルから名前と点数を抽出して、点数の高い順に並び替えます

サブクエリをWHERE句で利用する

サブクエリを取り出して確認してみる

複雑なSQLになってしまったら、サブクエリを取り出して考えます

( -- ここからサブクエリ
SELECT 名前
FROM 部活テーブル
WHERE 部活 = '野球'
) -- ここまで
LIMIT 10

サブクエリ内の「野球部の名前を抽出するクエリ」だけを抽出してみましょう

※LIMIT句を使わないと大量にデータが出てしまうので要注意です

まとめ

今回は基本的な「サブクエリ」の使い方についてご紹介してきました

サブクエリを使うことで、あなたのSQLの可能性を広げることができます

しっかりと頭の中で「イメージ」を立て、SQLを書いてみましょう

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です