SQLServer EXISTS 存在するデータを取得する

SQLServerのEXISTSとNOT EXISTSについて紹介していきます。
サブクエリでEXISTSを使用することで、2つのテーブルどちらにも、存在しているデータを取得することができます。
また、NOT EXISTSにすることで、片方のテーブルに存在していないデータを抽出することも可能です。

例を見ていきましょう。
今回は、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      |バレー

 

EXISTS 存在するデータ取得

まずは、EXISTSから見ていきます。
基本的な書き方を紹介します。

SELECT
  項目
FROM
  テーブル名
WHERE
  EXISTS(SELECT文)

 

UserMstを基準に、UserMstに存在しており、SportMstにも存在しているデータを取得してみましょう。

SELECT
  id
 ,personalName
 ,sportId
FROM 
  UserMst
WHERE
  EXISTS(SELECT
           *
         FROM
           SportMst
         WHERE
           SportMst.sportId = UserMst.sportId
        )

結果
id|personalName|sportId
--+------------+-------
1 |すずき      |3
2 |さとう      |1
3 |たなか      |2

結果を見ると、3件のデータが取得できていることが確認できました。
「SportId:3,1,2」のデータは、UserMstにもSportMstにも存在しているデータなので取得できました。
「SportId:6」のデータは、UserMstに存在しているが、SportMstに存在していないため取得されませんでした。

 

NOT EXISTS 存在しないデータ取得

次に、NOT EXISTSを見てみましょう。
EXISTSとは、真逆の結果が取得できるのですが、書き方は基本的には同じです。EXITSTのまえにNOTを付けるだけです。

SELECT
  項目
FROM
  テーブル名
WHERE
  NOT EXISTS(SELECT文)

 

UserMstを基準に、UserMstに存在しており、SportMstには存在していないデータを取得してみましょう。

SELECT
  id
 ,personalName
 ,sportId
FROM 
  UserMst
WHERE
  NOT EXISTS(SELECT
               *
             FROM
               SportMst
             WHERE
               SportMst.sportId = UserMst.sportId
            )

結果

id|personalName|sportId
--+------------+-------
4 |かとう      |6

 

結果を見ると、EXISTSの結果とは、逆のデータが取得できていると思います。
「SportId:6」のデータが取得できており、「SportId:3,1,2」のデータが取得できていませんでした。

まとめ

 

EXISTSは、必須ではありませんが、使いこなせるようになるととても便利ですので是非覚えてみてください。

EXISTS
  • EXISTS:2つのテーブルどちらにも存在するデータを取得する
  • NOT EXISTS:基準となるテーブルには存在するが、紐づけを行うテーブルには存在しないデータを取得する

 

SQLServerの記事一覧

 

おすすめの記事