SQLServer 副問合せ(サブクエリ)の使い方

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でいろんなデータが取得できるようになります。
初心者の方には難しいかもしれませんが、サブクエリは必ず使えるようになりましょう。

注意点としては、たくさんのサブクエリを繋げすぎると解析するのがとても大変になりますので、
欲しいデータを必要最低限のサブクエリで取得できるように、考えてから使いましょう。

 

SQLServerの記事一覧

 

 

 

おすすめの記事