茨の道も一歩から

インフラ構築からプログラミング(Python・JavaScript)までITに関するブログです。

データベース:副問合せ

■ 副問合せ

SQL文の中にSQL文を書き、内側のSQL文の結果を外側のSQL文で利用することが出来る。 この場合、外側のSQL文を、主問合せ、内側のSQL文を、副問合せという。 また副問合せの中に外側のSQL文の列を指定することを、相関副問合せという。


副問合せ

  • 副問合せの結果が1つの場合は、関係演算子、複数の場合は、IN演算子を使用する。

以下の商品テーブルを参考に説明する。

[商品]

商品番号 商品名 単価
0001 うまっ棒 10
0002 チロリチョコ 20
0003 月見大福 90
0004 おむすび煎餅 100

関係演算子を使った副問合せSQL

SELECT * FROM 商品
WHERE 単価 >= (SELECT AVG(単価) FROM 商品);

副問合せの結果は、

[副問合せ結果]

AVG(単価)
55

となり、WHERE句の条件が、 単価 >= 55 になる。

[SQL文実行結果]

商品番号 商品名 単価
0003 月見大福 90
0004 おむすび煎餅 100

IN演算子を使った副問合せSQL

SELECT * FROM 商品
WHERE 商品番号 IN (SELECT 商品番号 FROM 商品 WHERE 単価 >= 20);

副問合せの結果は、

[副問合せ結果] |:-:| |商品番号| |0002| |0003| |0004|

となり、WHERE句の条件が、 商品番号 IN ('00002','00003','00004') になる。

[SQL文実行結果]

商品番号 商品名 単価
0002 チロリチョコ 20
0003 月見大福 90
0004 おむすび煎餅 100

相関副問合せ

  • 相関副問合せは、EXISTS演算子を使用する。

以下の商品、在庫テーブルを参考に説明する。

[商品]

商品番号 商品名 単価
0001 うまっ棒 10
0002 チロリチョコ 20
0003 月見大福 90
0004 おむすび煎餅 100

[在庫]

倉庫番 商品番号 在庫数
01 0001 150
01 0002 40
01 0004 20
02 0001 50
02 0003 80

EXISTS演算子を使った相関副問合せSQL

SELECT * FROM 商品
WHERE EXISTS (SELECT * FROM 在庫 WHERE 在庫数 >= 50 AND 商品番号 = 商品.商品番号);

相関副問合せの結果は、

[相関副問合せ結果]

商品番号 EXISTS評価
0001 TRUE
0002 FALSE
0003 TRUE
0004 FALSE

となり、

[SQL文実行結果]

商品番号 商品名 単価
0001 うまっ棒 10
0003 月見大福 90

NOT EXISTS演算子を使った相関副問合せSQL

SELECT * FROM 商品
WHERE NOT EXISTS (SELECT * FROM 在庫 WHERE 在庫数 >= 50 AND 商品番号 = 商品.商品番号);

相関副問合せの結果は、

[相関副問合せ結果]

商品番号 EXISTS評価
0001 FALSE
0002 TRUE
0003 FALSE
0004 TRUE

となり、

[SQL文実行結果]

商品番号 商品名 単価
0002 チロリチョコ 20
0004 おむすび煎餅 100

【試験対策】

  • 副問合せの結果が複数になる場合は、IN演算子を使用する。
  • 相関副問合せには、EXISTS演算子を使用する。

目次へ戻る