SQL 副問合せのサンプル(サブクエリ)

目次

副問合せとは

副問い合わせとは、あるselect文の結果を別のSQL文で利用することです。
サブクエリとも呼ばれます。クエリ(query)は、問い合わせという意味です。
(サブのクエリ≒副の問い合わせ)



select文使用時の副問合せがある場所は以下です。
1.where句にある副問合せ
2.from句にある副問合せ
3.select句にある副問合せ
4.having句にある副問合せ

 

副問合せは、insert文、update文、delete文でも使用できます。

 

テストデータ

次のテーブルは、以降のSQLで使用するテストデータです。

tokuisakiテーブル
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を実行します。

SQL EXISTS句のサンプル(存在判定/相関副問合せ)

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句を使用して書けます。

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テーブル
tokuisaki YYYYMM uriage
A社 201302 200
A社 201303 150
B社 201303 100
company_mテーブル
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 相関副問合せのサンプル(相関サブクエリ)

△上に戻る