【SQL】EXISTSの使い方をサンプルコードで解説

  • 2024.01.29
       
【SQL】EXISTSの使い方をサンプルコードで解説

本記事ではSQLがよくわからないという人に向けて、SQL文法のなかでも難易度の高い「EXISTS」の基礎から使い方、類似文法との違いまで解説します。今後のSQL学習の参考にしてみてください。

EXISTSを学ぶ上での予備知識

すでにわかってるよ~という人は読み飛ばして問題ありません。

データベースは集約・整理したデータを保管・管理する、いわば「箱」のようなシステムです。SQLはそのデータベースにアクセスしてデータを操作するための言語で、データの取得・追加・更新・削除ができます。MySQLやPostgreSQLなど、さまざまなデータベースが存在しますが、SQL言語は共通しています。SQLには多くのコマンドがありますが、主要なコマンドの一つに「SELECT」という、データベース内のデータを検索・取得するコマンドがあります。データベース管理システムに対する命令文をクエリ(問合せ)といいます。そして、EXISTS句を学ぶ上で重要になってくるのが「サブクエリ」です。

サブクエリとは?

「サブクエリ」はメインクエリ内にネスト(入れ子)されたクエリのことです。SQL文の一部として内部で実行され、その実行結果をメインクエリに提供します。SELECT句を使用する際によく用いられ、日本語では「副問い合わせ」とも呼ばれます。条件を指定したデータの出力を行うには「サブクエリ」が有効です。たとえば、3000件の社員データが格納されているテーブルから「平均年齢よりも高い社員だけを出力する」といった条件をつけることができます。サブクエリを含んだクエリは先にサブクエリから実行され、その実行結果を一つのテーブルと見なしてメインクエリが実行されます。

【where句のサブクエリイメージ】

select * from テーブルA
where 項目 > (select 項目 from テーブルB where 条件);

サブクエリの使用例

【売り上げテーブル】

氏名社員コード売上額
佐藤 太郎10001200
鈴木 次郎10002150
高橋 三郎10003100

【サブクエリコード】

select 氏名,売上額 from 売り上げ
where 売上額 > (select AVG(売上額) from 売り上げ);

【結果】

氏名売上額
佐藤 太郎200

まず、(select AVG(売上額) from 売り上げ)の部分で社内全員の売上額の平均値を計算します。

この部分がサブクエリです。

そしてメインクエリで平均値よりも高い売上額を出している社員を表示します。

ここまでがEXISTS句を学ぶ上での前提知識となります。次項からはいよいよEXISTS句について解説していきます。

あなたのご希望に沿った案件が必ず見つかります
【フリーランス向け】高収入好待遇の案件をご紹介

TECH MANIA フリーランス

≫まずは簡単60秒で無料お問い合わせから≪

EXISTSとは?

「EXISTS」とは、指定された条件にあてはまるレコードが存在するか否かを調べるのに使用される構文です。EXISTS句は必ずサブクエリと併用され、サブクエリで1つ以上あてはまるレコードが存在した場合は「TRUE」を返し、そうでない場合は「FALSE」を返します。

データベーステーブルのカラムから、複雑な条件を付けてレコードを取り出す場合、それぞれの条件に合わせてSELECT句を複数回行うという方法をとる人も多いでしょう。しかし、膨大な量のテーブルデータのなかから特定のデータを出力する場合は条件付きのSELECT句を使いたいですよね。

なお、条件付きで出力を行う場合はIN句やJOIN句などを使うことも可能ですが、EXISTSを使えばより簡単に条件付きのSELECT句を記述できます。

EXISTS句は理解しづらいと感じる人も多いですが、そんな人は英単語の意味を知ることでEXISTS句の役割が想像しやすくなり、理解し易くなるかと思います。「EXISTS」という英単語には「存在する」という意味があります。「テーブルデータのうち、指定した条件のレコードが『存在するか否か』を確認する」という働きをイメージするといいでしょう。

【使用イメージ】

select * from テーブルA  //外側のSQL
where exists (
	select * from テーブルB  //EXISTS内のSQL
)

EXISTS句は、特定の条件にあてはまるレコードが存在するか否かを調べるのに使用されます。そのため、サブクエリで具体的な値を返す必要はなく、少なくとも1行のレコードがあてはまるかどうかで「TRUE」または「FALSE」を返すだけです。

そのため、サブクエリのSELECT句では、具体的な値ではなく、単に「SELECT *」や「SELECT 1」と書くのが一般的です。

「select 1」や「select *」の意味

重複しますが、サブクエリでは具体的な値ではなく、1つ以上のレコードが存在するか否かを返します。そのため、何かしらの値(引数)を入れる必要はありますが、任意の値でいいので、とりあえず「*」や「1」を使うのが一般的です。ただ、データ読み込みの観点から「*」よりも「1」などの文字が好ましいです。

EXISTSの使用例

例として、1つ以上の商品を購入したユーザを出力します。

【ユーザテーブル】

ユーザ名ユーザID
佐藤 太郎100001
鈴木 次郎100002
高橋 三郎100003

【注文テーブル】

ユーザID注文数
1000012
1000031

【EXISTSのサンプルコード】

select * from ユーザ
where exists (select 1 from 注文 where ユーザ.ユーザID = 注文.ユーザID);

ポイント①

「ユーザ.ユーザID」「注文.ユーザID」という表記ですが、こちらは「テーブル名.要素名」という意味で、どのテーブルの、どの項目なのかを指定しています。

ポイント②

上記2つのテーブルには、どちらにも「ユーザID」が記入されています。メインクエリで参照したテーブル上の値がサブクエリで参照したテーブル上の値と一致する場合に「TRUE」を返します。テーブル同士の紐づけをしないと、すべてのユーザが表示されてしまいます。

【結果】

ユーザ名ユーザID
佐藤 太郎100001
高橋 三郎100003

WHERE以下の条件が「TRUE」になるユーザのレコードを抽出します。

先述のポイント②でも紹介しましたが、テーブル同士を紐づけるか否かで出力されるデータが異なります。

紐づけを行わない場合は、サブクエリ(EXISTS内のSQL)で条件にあてはまる値が存在した場合に、メインクエリ(外側のSQL)が実行されます。値が存在しない場合は、メインクエリは実行されません。これを「存在判定」といいます。

一方で、紐づけを行う場合は、メインクエリが実行されてからサブクエリがメインクエリを参照して実行されます。これを「相関副問合せ」といいます。

EXISTS句はどういうときに使うと便利?

  • 「ユーザ」のうち少なくとも1つの商品を購入した「ユーザ」を出力したい
  • 「社員データ」のうち「部署コード」が「2」の「社員レコード」を出力したい
  • 「企業データ」のうち「カテゴリー」が「IT」の「企業レコード」を出力したい
  • 「社員データ」と「部署データ」のうち、「社員データ」の「ID」と「部署データ」の「社員ID」が一致し、且つ、「部署コード」が「3」の「社員レコード」を出力したい

実際の利用例

在庫管理システム

在庫管理システムでは、EXISTS句を用いることで、サブクエリで「在庫テーブル」のうち、該当する商品在庫が1つ以上あるかどうかを確認できます。

データ分析

データ分析では、特定の条件を満たすデータがあるかどうかを調べるのにEXISTS句が利用されます。たとえば、「商品購入テーブル」対象の期間で特定の商品を購入したユーザを調べるといったこともできます。

NOT EXISTS句とは?

NOT EXISTS句とは、EXISTS句と反対の機能を持ち、特定の条件にあてはまるレコードが存在しない場合に「TRUE」を返し、存在する場合に「FALSE」を返します。

NOT EXISTSの使用例

【ユーザテーブル】

ユーザ名ユーザID
佐藤 太郎100001
鈴木 次郎100002
高橋 三郎100003

【注文テーブル】

ユーザID注文数
1000012
1000031

【EXISTSコード】

select * from ユーザ
where not exists (select 1 from 注文 where ユーザ.ユーザID = 注文.ユーザID);

【結果】

ユーザ名ユーザID
鈴木 次郎100002

EXISTS句と類似文法の比較

EXISTSとINの比較

EXISTS句とIN句はどちらもサブクエリを扱いますが、EXISTS句が存在の有無のみを出力するのに対し、IN句は条件にあてはまるコードをすべて出力し、メインクエリで値を比較します。また、IN句はカラム名を指定する必要がありますが、EXISTS句では不要です。EXISTS句は条件にあてはまるレコードが存在した時点で検索を打ち切るため、IN句よりもパフォーマンスが優れているといわれています。そのため、具体的な値を比較する場合はIN句、特定の条件にあてはまるレコードの有無のみを確認するにEXISTS句を使いましょう。

EXISTSとJOINの比較

JOIN句は複数のテーブルを結合して1つの結果を出力しますが、EXISTS句はテーブルの結合をしません。よって、結合結果全体を出力させる場合はJOIN句、特定の条件にあてはまるレコードの有無のみを知りたい場合はEXISTS句を使いましょう。

EXISTSと通常の比較演算子の比較

比較演算子は2つの値を比較して出力を行います。そのため、値同士を比較する必要がある場合は比較演算子、特定の条件にあてはまるレコードの有無のみを知りたい場合はEXISTS句を使いましょう。

UPDATE句との組み合わせ

実は、EXISTSを使うのは、SELECT文だけではありません。メインクエリにUPDATE句を用いることで、該当したデータのみを更新することもできます。

SQLの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事