SQLの副問合せ(サブクエリ)のサンプルです。
目次
- 副問合せとは
- 1.where句にある副問合せ
- 2.from句にある副問合せ
- 3.select句にある副問合せ
- 4.having句にある副問合せ
- 副問合せの結果が複数件のとき
- inを使用したサンプル
- not inを使用したサンプル
- =anyを使用したサンプル
- <>allを使用したサンプル
副問合せとは
副問い合わせとは、あるselect文の結果を別のSQL文で利用することです。
サブクエリとも呼ばれます。サブのクエリ≒副の問い合わせ。
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句に売上の平均を求める副問合せがあります。
結果
結果は、以下のとおりです。
| 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 | 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 |
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 相関副問合せのサンプル