
SQLSERVERのサブクエリについて紹介していきます。
サブクエリとは簡単に言うと、SELECT文を入れ子にして使用することです。
サブクエリは、SELECTの項目、FROM句、WHERE句の3か所で使用することができます。
順番に見ていきましょう。
2つテーブルを用意しました。
SELECT * FROM UserMst
id |personalName |sportId
-----+-------------+-------
1 |すずき |3
2 |さとう |1
3 |たなか |2
4 |かとう |6
SELECT * FROM SportMst
sportId|sportNm
-------+----------
1 |野球
2 |サッカー
3 |バスケット
4 |ラグビー
5 |バレー
WHERE句 サブクエリ
まずは、WHERE句で使用するサブクエリを見ていきましょう。
サブクエリの結果が1つの場合
SELECT
*
FROM
UserMst
WHERE
UserMst.sportId = (SELECT --サブクエリ
sportId
FROM
SportMst
WHERE
SportMst.sportId = 1
)
結果
id |personalName |sportId
-----+-------------+-------
2 |さとう |1
WHERE句でサブクエリを指定しています。サブクエリで取得した結果が1件の場合は、"=イコール"で条件を記載しましょう。
今回のサブクエリは、sportId:1 なので、下記のSQLと同じ結果が取得できていると思います。
SELECT
*
FROM
UserMst
WHERE
UserMst.sportId = '1'
サブクエリの結果が複数の場合
SELECT
*
FROM
UserMst
WHERE
UserMst.sportId IN (SELECT --サブクエリ
sportId
FROM
SportMst
)
結果
id |personalName |sportId
-----+-------------+-------
1 |すずき |3
2 |さとう |1
3 |たなか |2
WHERE句でサブクエリを指定しています。サブクエリで取得した結果が複数件の場合は、"IN"で条件を記載しましょう。
今回のサブクエリは、sportId:1,2,3,4,5なので、下記のSQLと同じ結果が取得できていると思います。
SELECT
*
FROM
UserMst
WHERE
UserMst.sportId IN ('1','2','3','4','5')
FROM句 サブクエリ
次はFROM句でのサブクエリを見てみましょう。
SELECT
SUB.id
,SUB.personalName
FROM
(
SELECT
id
,personalName
FROM
UserMst
WHERE
UserMst.personalName IN ('さとう','たなか')
) SUB
結果
id |personalName
-----+-------------
2 |さとう
3 |たなか
FROM句でサブクエリを使用する際は、WHERE句やGROUP BYなどで取得した結果を一時的なテーブルとして使うイメージです。
サブクエリで作成した一時的なテーブルを結合して使うこともできます。
SELECT項目 サブクエリ
最後にSELECT項目で使用するサブクエリについてみてみましょう。
SELECT
id
,personalName
,sportId
,(
SELECT
COUNT(sportId)
FROM
SportMst
) AS サブクエリ
FROM
UserMst
結果
id |personalName |sportId|サブクエリ
-----+-------------+-------+----------
1 |すずき |3 |5
2 |さとう |1 |5
3 |たなか |2 |5
4 |かとう |6 |5
このように、サブクエリで取得した結果をSELECT項目に追加することができます。
このサブクエリは、sportMstのデータ件数:5を単純にSELECT項目に追加しています。
サブクエリのWHEREで親テーブルと紐づけを行うことでこんなこともできます。sportIdで紐づけてみましょう。
SELECT
id
,personalName
,sportId
,(
SELECT
COUNT(sportId)
FROM
SportMst
WHERE
UserMst.sportId = SportMst.sportId
) AS サブクエリ
FROM
UserMst
結果
id |personalName |sportId|サブクエリ
-----+-------------+-------+----------
1 |すずき |3 |1
2 |さとう |1 |1
3 |たなか |2 |1
4 |かとう |6 |0
親テーブル(UserMst)のsportIdと子テーブル(SportMst)のsportIdを紐づけることで、
親テーブル(UserMst)の各行のsoprtIdに紐づく、SportMstの件数を見ることができます。
なので、sportId:6だけ0になっています。
まとめ
サブクエリを使えるようになると、1つSQLでいろんなデータが取得できるようになります。
初心者の方には難しいかもしれませんが、サブクエリは必ず使えるようになりましょう。
注意点としては、たくさんのサブクエリを繋げすぎると解析するのがとても大変になりますので、
欲しいデータを必要最低限のサブクエリで取得できるように、考えてから使いましょう。