目次
01. 副問合せ
02. 種類
03. 結果が複数
04. 一致
05. 不一致
副問合せとは
副問い合わせとは、あるselect文の結果を別のSQL文で利用することです。
サブクエリとも呼ばれます。クエリ(query)は、問い合わせという意味です。
(サブのクエリ≒副の問い合わせ)
select文使用時の副問合せがある場所は以下です。
1.where句にある副問合せ
2.from句にある副問合せ
3.select句にある副問合せ
4.having句にある副問合せ
副問合せは、insert文、update文、delete文でも使用できます。
テストデータ
次のテーブルは、以降のSQLで使用するテストデータです。
tokuisaki | YYYYMM | uriage |
---|---|---|
A社 | 201302 | 200 |
A社 | 201303 | 150 |
B社 | 201303 | 100 |
1.where句にある副問合せ
where句にある副問合せのサンプルです。
select * from tokuisaki
where uriage > (select AVG(uriage) from tokuisaki);
2行目は、where句に売上の平均を求める副問合せがあります。
2行目の副問合せのSQLを実行してから1行目の主問い合わせのSQLが実行されます。
結果は、以下のとおりです。
tokuisaki | YYYYMM | uriage |
---|---|---|
A社 | 201302 | 200 |
EXISTS句
where句にEXISTSをつけることで相関副問合せを書けます。
相関副問合せは、主問合せのSQLを実行してから副問い合わせのSQLを実行します。
2.from句にある副問合せ
from句にある副問合せのサンプルです。
select b.tokuisaki,b.uriage,b.YYYYMM
from (select AVG(uriage) as heikin from tokuisaki) a,tokuisaki b
where a.heikin < b.uriage;
2行目は、from句に売上の平均を求める副問合せがあります。
副問合せの結果をテーブルのように使用しています。
結果は、以下のとおりです。
tokuisaki | YYYYMM | uriage |
---|---|---|
A社 | 201302 | 200 |
WITH句
from句にある副問合せのSQLは、WITH句を使用して書けます。
3.select句にある副問合せ
select句にある副問合せのサンプルです。
select tokuisaki,
YYYYMM,
uriage,
uriage > (select AVG(uriage) from tokuisaki ) as hantei
from tokuisaki;
4行目は、select句に売上の平均を求める副問合せがあります。
項目の「hantei」には、売上の平均を超えていたら1,それ以外の場合は0が入っています。
結果は、以下のとおりです。
tokuisaki | YYYYMM | uriage | hantei |
---|---|---|---|
A社 | 201302 | 200 | 1 |
A社 | 201303 | 150 | 0 |
B社 | 201303 | 100 | 0 |
4.having句にある副問合せ
having句にある副問合せのサンプルです。
SELECT tokuisaki,MAX(uriage)
FROM `tokuisaki`
group by tokuisaki
having MAX(uriage) > (SELECT AVG(uriage) FROM `tokuisaki`);
4行目は、having句に売上の平均を求める副問合せがあります。
結果は、以下のとおりです。
tokuisaki | MAX(uriage) |
---|---|
A社 | 200 |
SQL 複数の行をまとめる(集約関数/group by/having)
副問合せの結果が複数件のとき
以降は、副問合せの結果が複数件のときのサンプルです。
テストデータ
次のテーブルは、以降のSQLで使用するテストデータです。
tokuisaki | YYYYMM | uriage |
---|---|---|
A社 | 201302 | 200 |
A社 | 201303 | 150 |
B社 | 201303 | 100 |
company |
---|
A社 |
C社 |
inを使用したサンプル
inは、副問合せの結果が複数件の時に使用します。
select * from tokuisaki
where tokuisaki in (select company from company_m);
2行目の副問合せのSQLは、結果が複数件返ってきます(A社とC社)。
そのため条件は、イコール(=)ではなくinを使用します。
結果は、以下のとおりです。
tokuisaki | YYYYMM | uriage |
---|---|---|
A社 | 201302 | 200 |
A社 | 201303 | 150 |
=anyを使用したサンプル
=anyは、副問合せの結果が複数件の時に使用します。
select * from tokuisaki
where tokuisaki = any (select company from company_m);
2行目の副問合せのSQLは、結果が複数件返ってきます(A社とC社)。
結果は、以下のとおりです。
tokuisaki | YYYYMM | uriage |
---|---|---|
A社 | 201302 | 200 |
A社 | 201303 | 150 |
※上記のSQLの=anyは、inや=someでも同じ結果になります。(mysql)
not inを使用したサンプル
not inは、副問合せの結果が複数件でその否定を行うときに使用します。
select * from tokuisaki
where tokuisaki not in (select company from company_m);
2行目の副問合せのSQLは結果が複数件返ってきます(A社とC社)。
not inで、A社とC社以外を抽出します。
結果は、以下のとおりです。
tokuisaki | YYYYMM | uriage |
---|---|---|
B社 | 201303 | 100 |
<>allを使用したサンプル
<>allは、副問合せの結果が複数件でその否定を行うときに使用します。
select * from tokuisaki
where tokuisaki <> all (select company from company_m);
2行目の副問合せのSQLは結果が複数件返ってきます(A社とC社)。
<>allで、A社とC社以外を抽出します。
結果は、以下のとおりです。
tokuisaki | YYYYMM | uriage |
---|---|---|
B社 | 201303 | 100 |
関連の記事
SQL INNER JOIN 内部結合のサンプル
SQL LEFT JOIN 外部結合のサンプル
SQL 自己結合のサンプル
SQL UNIONとUNION ALLのサンプル(結合して抽出)
SQL 相関副問合せのサンプル(相関サブクエリ)