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

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

目次

副問合せとは

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

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句に売上の平均を求める副問合せがあります。

結果

結果は、以下のとおりです。

tokuisaki YYYYMM uriage
A社 201302 200

 

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句に売上の平均を求める副問合せがあります。
from句にある副問合せのselect文の結果は、テーブルとみなすことができます。

結果

結果は、以下のとおりです。

tokuisaki YYYYMM uriage
A社 201302 200

 

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で使用するテストデータです。

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

 

not inを使用したサンプル

上記SQLの否定としてnot inを使用することができます。

select * from tokuisaki 
where tokuisaki not in (select company from company_m);

結果

結果は、以下のとおりです。

tokuisaki YYYYMM uriage
B社 201303 100

 

=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でも同じ結果になります。=allは検索結果0になります。(mysql)
=だけでなく、<や<=などの比較演算子も使用できます。

 

<>allを使用したサンプル

<>allは、副問合せの結果が複数件でその否定を行うときに使用します。

select * from tokuisaki 
where tokuisaki <> all (select company from company_m);

2行目の副問合せのSQLは結果が複数件返ってきます(A社とC社)。
company_mテーブルにない会社を抽出するため条件に<>allを使用しています。

結果

結果は、以下のとおりです。

tokuisaki YYYYMM uriage
B社 201303 100

関連の記事

SQL INSERT文のサンプル
SQL UPDATE文とDELETE文のサンプル
SQL 重複行を表示しないサンプル(distinct)
SQL 複数の行をまとめる(集約関数/group by/having)
SQL 内部結合のサンプル(inner join)
SQL 外部結合のサンプル(left outer join/right outer join)
SQL 自己結合のサンプル
SQL UNIONとUNION ALLのサンプル
SQL 相関副問合せのサンプル

△上に戻る