|
副問い合わせ(サブクエリ)
SELECT、INSERT、UPDATE、DELETEなどのSQL文内に、
入れ子としてSELECT句を記述することができます。
この入れ子のクエリを副問い合わせ(サブクエリ)と呼びます。
サブクエリはSELECT句の抽出項目やテーブル名、WHEREの条件部分など
様々な場所に記述することができます。
なお、副問い合わせのSELECT文で主問い合わせのテーブルの列を参照する
「相関副問い合わせ」については別項で説明します。
***例(SELECTの抽出項目として利用)***
[売上表]
商品名 |
売上数量 |
売上金額 |
りんご |
3 |
300 |
みかん |
8 |
960 |
ぶどう |
10 |
500 |
[実行SQL]
SELECT
商品名,
売上数量,
(SELECT
SUM(売上数量)
FROM
売上表
) AS 総売上数
FROM
売上表
|
*※抽出項目として利用する場合、複数行を取得する副問い合わせはエラーとなります
[結果]
商品名 |
売上数量 |
総売上数 |
りんご |
3 |
21 |
みかん |
8 |
21 |
ぶどう |
10 |
21 |
***例(テーブルとして利用)***
[売上表]
売上日 |
商品名 |
売上数量 |
売上金額 |
2013/01/01 |
りんご |
3 |
300 |
2013/01/01 |
みかん |
8 |
960 |
2013/01/01 |
ぶどう |
10 |
500 |
2013/01/02 |
りんご |
5 |
500 |
2013/01/02 |
みかん |
2 |
240 |
2013/01/02 |
ぶどう |
4 |
200 |
[実行SQL]
SELECT
MAX(集計.売上計) AS 最大売上計
FROM
(SELECT
商品名,
SUM(売上数量) AS 売上計,
FROM
売上表
GROUP BY
商品名
) 集計
|
[結果]
***例(条件として利用)***
[売上表]
売上日 |
商品名 |
売上数量 |
売上金額 |
2013/01/01 |
りんご |
3 |
300 |
2013/01/01 |
みかん |
8 |
960 |
2013/01/01 |
ぶどう |
10 |
500 |
2013/01/02 |
りんご |
5 |
500 |
2013/01/02 |
みかん |
2 |
240 |
2013/01/02 |
ぶどう |
4 |
200 |
[実行SQL]
SELECT
*
FROM
売上表
WHERE
売上金額 = (SELECT
MAX(売上金額)
FROM
売上表
)
|
*等号や不等号などの演算子を用いた条件として利用する場合、
複数行を取得する副問い合わせはエラーとなります
[結果]
売上日 |
商品名 |
売上数量 |
売上金額 |
2013/01/01 |
みかん |
8 |
960 |
***例(エラーとなる例)***
[売上表]
売上日 |
商品名 |
売上数量 |
売上金額 |
2013/01/01 |
りんご |
3 |
300 |
2013/01/01 |
みかん |
8 |
960 |
2013/01/01 |
ぶどう |
10 |
500 |
2013/01/02 |
りんご |
5 |
500 |
2013/01/02 |
みかん |
2 |
240 |
2013/01/02 |
ぶどう |
4 |
200 |
上記の表に対し、以下のようなSQL文を発行した場合はエラーとなります。
[抽出項目として利用される場合で、副問い合わせが複数行を返す]
SELECT
商品名, 売上数量,
(SELECT 売上数量 FROM 売上表) AS 総売上数
FROM
売上表
|
[抽出項目として利用される場合で、副問い合わせが複数列を返す]
SELECT
商品名, 売上数量,
(SELECT SUM(売上数量), SUM(売上金額) FROM 売上表)
FROM
売上表
|
[等号や不等号などの演算子を用いた条件として利用する場合で、副問い合わせが複数列を返す]
SELECT
*
FROM
売上表
WHERE
売上金額 = (SELECT 売上金額 FROM 売上表)
|
*上記のように一致を条件とする場合であれば、IN句を利用するとよい
SELECT
*
FROM
売上表
WHERE
売上金額 IN (SELECT 売上金額 FROM 売上表)
|
|
<<PR>>
価格:300円
価格:300円
|