本記事では、SQLの
副問い合わせ(サブクエリ)の使い方を基礎から解説していく。
副問い合わせ(サブクエリ)とは
副問い合わせ(サブクエリ)とは、
SQL文の中に入れ子でSQL文を指定することを言う。
下記SQL文は副問い合わせの使用例だ。
SELECT
氏名
FROM
社員テーブル AS T1
WHERE
EXISTS(
SELECT 1
FROM 売上明細 AS S1
WHERE T1.社員CD = S1.社員CD
)
副問い合わせはWHERE句だけでなく、SELECT句やFROM句でも使用することが可能だ。
なので、本記事では、
それぞれの句での副問い合わせ毎に、基本的な使い方を紹介していく。
副問い合わせ(サブクエリ)の使い方
では早速、副問い合わせ(サブクエリ)の使い方を解説していく。
副問い合わせ(サブクエリ)は句毎に使えるが、句ごとに使い勝手が微妙に異なるので、
それぞれの句ごとに副問い合わせ(サブクエリ)の使い方を解説していく。
- SELECT句での副問い合わせ
- FROM句での副問い合わせ
- WHERE句での副問い合わせ
① SELECT句での副問い合わせ
SELECT句の副問い合わせは下記のような使い方をする。
SELECT
氏名
,(
SELECT
MAX(S1.売上金額)
FROM
売上明細 S1
WHERE
S1.社員コード = T1.社員コード
)
FROM
社員マスタ AS T1
SELECT句での副問い合わせのクエリでは、メインのクエリの値を使用することが可能だ。
上記SQLではT1.社員CDをWHERE句の条件に指定している。
また、
SELECT句で副問い合わせをするには基本的に副問い合わせの取得結果が1件である必要がある。SELECTした結果が2件以上の場合はエラーになってしまうので注意が必要だ。
- メインのクエリの値を使用することが可能
- 副問い合わせの取得結果が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句での副問い合わせは、副問い合わせの取得結果が複数件でも問題ない。
普通に一つのテーブルとして結果を取得して、メインクエリのテーブルと結合したりして使用する。
- メインのクエリの値を使用することができない
- 副問い合わせの取得結果が複数件でも問題ない
③ 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件である必要があるので注意が必要。
- メインのクエリの値を使用することが可能
- IN句を指定した場合は、副問い合わせの結果が複数件でも問題ない
- =を指定した場合は、副問い合わせの結果が1件である必要がある
関連記事
https://products.sint.co.jp/siob/blog/what-is-sql-subquery