(SQL) 副問い合わせ(サブクエリ)を基礎から理解する【使い方・使える場所】

(SQL) 副問い合わせ(サブクエリ)を基礎から理解する【使い方・使える場所】

 

本記事では、SQLの
副問い合わせ(サブクエリ)の使い方を基礎から解説していく。

 

副問い合わせ(サブクエリ)とは

副問い合わせ(サブクエリ)とは、
SQL文の中に入れ子でSQL文を指定することを言う。

下記SQL文は副問い合わせの使用例だ。

SELECT
    氏名
FROM
    社員テーブル AS T1
WHERE
    EXISTS(
        SELECT 1
        FROM 売上明細 AS S1
        WHERE T1.社員CD = S1.社員CD
    )

 

副問い合わせはWHERE句だけでなく、SELECT句やFROM句でも使用することが可能だ。

なので、本記事では、
それぞれの句での副問い合わせ毎に、基本的な使い方を紹介していく。

 

副問い合わせ(サブクエリ)の使い方

では早速、副問い合わせ(サブクエリ)の使い方を解説していく。

副問い合わせ(サブクエリ)は句毎に使えるが、句ごとに使い勝手が微妙に異なるので、
それぞれの句ごとに副問い合わせ(サブクエリ)の使い方を解説していく。

 

副問い合わせ(サブクエリ)の使い方3パターン
  1. SELECT句での副問い合わせ
  2. FROM句での副問い合わせ
  3. WHERE句での副問い合わせ

 

① SELECT句での副問い合わせ

SELECT句の副問い合わせは下記のような使い方をする。

SELECT
    氏名
    ,(
        SELECT
            MAX(S1.売上金額)
        FROM
            売上明細 S1
        WHERE
            S1.社員コード = T1.社員コード
    )
FROM
    社員マスタ AS T1

 

SELECT句での副問い合わせのクエリでは、メインのクエリの値を使用することが可能だ。
上記SQLではT1.社員CDをWHERE句の条件に指定している。

また、
SELECT句で副問い合わせをするには基本的に副問い合わせの取得結果が1件である必要がある。SELECTした結果が2件以上の場合はエラーになってしまうので注意が必要だ。

 

SELECT句での副問い合わせ
  • メインのクエリの値を使用することが可能
  • 副問い合わせの取得結果が1件である必要がある

 

② FROM句での副問い合わせ

FROM句の副問い合わせは下記のような使い方をする。

SELECT
    MAX(T1.氏名) AS 氏名
    ,SUM(T2.売上金額) AS 売上金額合計
FROM 社員テーブル AS T1
LEFT JOIN
    (
        SELECT
            *
        FROM
            売上明細 S1
        WHERE
            STATUS = 0
    ) T2
ON T1.社員CD = T2.社員CD
GROUP BY T1.社員CD

 

SELECT句の副問い合わせとは違い、
FROM句では、メインのクエリの値を使用することができない
なので、上記SQLでは副問い合わせの中でT1.社員CDを使用することはできない。

また、
FROM句での副問い合わせは、副問い合わせの取得結果が複数件でも問題ない
普通に一つのテーブルとして結果を取得して、メインクエリのテーブルと結合したりして使用する。

 

FROM句での副問い合わせ
  • メインのクエリの値を使用することができない
  • 副問い合わせの取得結果が複数件でも問題ない

 




 

③ WHERE句での副問い合わせ

WHERE句の副問い合わせは下記のような使い方をする。

例①

SELECT
    氏名
FROM
    社員テーブル AS T1
WHERE
    EXISTS (
        SELECT 1
        FROM 売上明細 AS S1
        WHERE T1.社員CD = S1.社員CD
    )

例②

SELECT
    氏名
FROM
    社員テーブル AS T1
WHERE
    T1.社員CD IN
        (
            SELECT S1.社員CD
            FROM 売上明細 AS S1
        )

例③

SELECT
    氏名
FROM
    社員テーブル AS T1
WHERE
    T1.社員CD =
        (
            SELECT S1.社員CD
            FROM 売上明細 AS S1
            WHERE T1.社員CD = S1.社員CD
            GROUP BY S1.社員CD
        )

 

SELECT句と同様に、
WHERE句での副問い合わせのクエリではメインのクエリの値を使用することが可能だ。

また、
IN句を指定した場合は、副問い合わせの結果が複数件でも問題ない

※ =を指定した場合は、副問い合わせの結果が1件である必要があるので注意が必要。

 

WHERE句での副問い合わせ
  • メインのクエリの値を使用することが可能
  • IN句を指定した場合は、副問い合わせの結果が複数件でも問題ない
  • =を指定した場合は、副問い合わせの結果が1件である必要がある

 

関連記事

(SQL) EXISTS句【相関副問合せ】の使い方 〜存在チェックを実施する〜
(SQL) テーブル結合をちゃんと理解する【inner、outer、full、cross join の違い】

 

Oracle Subquery

 

https://products.sint.co.jp/siob/blog/what-is-sql-subquery

 

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。