0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

今さら解説するSQL「副問合せ」

Posted at

副問合せとは

SQLにおいて「副問合わせ」とは、メインのSQLに別の問合わせを入れ子で挿入すること。

SELECT 列名
FROM テーブル名
WHERE 列名 比較演算子 ( 
  SELECT 列名
  FROM テーブル名 
  )

()で囲まれた文を副問合わせという。
逆に囲まれていない文は主問合わせという。

副問合わせ内では通常のSQL文と同様にWHERE句やGROUP BY句など使える。
また、主問合わせのWHERE句やFROM句に使用できる。
ただ、主問合せのGROUP BY句には使用できない

副問合せの注意点

  1. 副問合せの実行結果が0件の場合でも主問合せはエラーにならない。
    ⇨ただし、主問合せの結果も0件になる。

  2. 単一行副問合せでは、単一行演算子が使える。
    ⇨単一行副問合わせとは実行結果が1件となる副問合せ
    ⇨単一行演算子とは「=」、「<」、「>」など

  3. 複数行問合わせでは、複数行演算子が使える。
    ⇨複数行問合わせとは実行結果が複数件の副問合せ
    ⇨複数行演算子とは「IN」、「=ANY」、「>ALL」など
    複数行問合せでは複数行演算子は使えない。

複数行演算子について

ANY

単一行演算子と組み合わせる必要がある。

SELECT 列名
FROM テーブル名
WHERE 列名 =ANY ( 
  SELECT 列名
  FROM テーブル名 
  )

上記の場合、副問合せの実行結果のいずれかに該当する値を主問合せのWHERE句で比較対象としている。
つまり、「IN」と同じように使用できる。
ただし、「NOT IN」と「<>ALL」にはで注意(後述)

ALL

同じく、単一行演算子と組み合わせる必要がある。

SELECT 列名
FROM テーブル名
WHERE 列名 <ALL ( 
  SELECT 列名
  FROM テーブル名 
  )

上記の場合、副問合せの実行結果の全ての値よりも小さい値を主問合せのWHERE句で比較対象としている。

「NOT IN」と「<>ALL」は同じもので、副問合せの実行結果の全ての値と等しくないとTRUEを返す。
ただ、実行結果にNULLが含まれる場合は常にFALSEを返す。
そのため、NULLを除外して比較するには副問合せのWHERE句等で「IS NOT NULL」を指定する必要がある。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?