SQLのEXISTS文は、CREATE・DELETE・UPDATE・SELECTなどのSQL文と比較して、なかなか「理解して使いこなしている」という方が少ないのではないでしょうか。
読者のみなさんの中には、「EXISTSステートメントのことを初めて耳にした」という人もいるかもしれません。CREATE・DELETE・UPDATE・SELECTなど主だったSQLステートメントをしっかりと駆使できているのであれば、EXISTSステートメントを使用しなくてもやりくりできることが多いため、見落としがちになることも仕方がありません。
このような状況からEXISTSステートメントを使用していないという方が多いのですが、使い方に慣れると意外にも簡単なステートメントなのです。
今回の記事ではSQL EXISTSステートメントの使い方を初心者の方でも理解できるように解説していきます。SQL文の中でも意外と知られていないEXISTSステートメントを駆使して、WEBアプリケーションを思ったように開発できるようにしていきましょう。
- SQLにおける「EXISTS」の概要
- SQL EXISTS文の使い方
SQLのステートメント「EXISTS」とは何か
SQLのステートメント「EXISTS」とは、指定した条件のレコードが存在するかどうかをテストするためのサブクエリを指定できるステートメントのことです。
普段、データベーステーブルのカラムから、複雑な条件付きでレコードを取り出そうとする際には、それぞれの条件に合わせて複数回selectステートメントを行なっているのではないでしょうか。しかし、膨大なテーブルデータを出力する際には条件付きのselectステートメントを使用したいもの。
条件付きの出力を行う際には、INNER JOINなどのステートメントを使用することもできますが、中でもEXISTSは比較的簡単に、条件付きのselectステートメントを記述できる手段なのです。
上記でも書きましたが、もう少しSQLのEXISTSステートメントを使用するシチュエーションを見ていきましょう。
- 社員データが格納されたテーブルから「所属IDが1の社員レコード」を出力したい
- 店舗データが格納されたテーブルから「カテゴリーが『カレー屋』の店舗レコード」を出力したい
- 社員データが格納されたテーブルと部署データが格納されたテーブルを合わせて確認し、「社員データのIDと部署データの『社員ID』が合致し、部署IDが2の社員レコード」を出力したい
このように「条件付きでテーブルデータを格納したい」という際にEXISTSを使用することができます。他にも手段がありますが、すでに述べた通りEXISTSは複雑な条件のクエリであっても簡潔に記述することができることが魅力だと言えるでしょう。
もしかするとEXISTSという英単語自体がそこまで一般的なものではないため、EXISTSステートメントの働きが想像しづらいかもしれません。「EXISTS」という英単語には「存在する」という意味があるため「テーブルデータから指定した条件のレコードが『存在するかどうか』を確認する」という働きをイメージしておくと、EXISTSを用いて書かれたクエリの働きを理解することがより簡単になるはずです。
【関連記事】
▶︎SQL if文のサンプルコード集 NULL判定や、Switch文のような分岐をする方法
▶︎sqlコードの意味がわからない…不思議なSQLコードサンプル集
SQLunionの使い方
ここまでSQLのEXISTSステートメントの概要について説明をしました。それではここからSQLのEXISTSステートメントを使用する方法について具体的なコードを用いて解説していきましょう。
本記事では、SQLのEXISTSステートメントを使用する環境としてMySQLというデータベース管理システムを使用します。MySQLに関する説明は割愛しますが、まだ使用したことがないという方はこれを機に導入してみてください。
前提条件
以下のようなデータが格納されているテーブルが2つあるという前提で、EXISTSステートメントの使い方をご説明していきます。
carsテーブル
+------+--------------------+ | id | name | +------+--------------------+ | 1 |ヴェルファイア | | 2 | エスクァイア | | 3 | ステップワゴン | | 4 | セレナ | +------+--------------------+
makersテーブル
+------+--------------------+ | id | maker | +------+--------------------+ | 1 |トヨタ | | 2 | トヨタ | | 3 | ホンダ | | 4 | 日産 | +------+--------------------+
2つのテーブルを確認して指定した条件に合致したレコードを取得する
SELECT * FROM cars WHERE EXISTS ( SELECT * FROM makers WHERE users.id = makers.id AND makers.maker = "トヨタ" );
出力結果:
+------+--------------------+ | id | name | +------+--------------------+ | 1 |ヴェルファイア | | 2 | エスクァイア | +------+--------------------+
SQL EXISTSステートメントの基礎的な使用方法の1つは2つのテーブルを確認して指定した条件に合致したレコードを取得するということです。上記のようなEXISTSステートメントをSQL文で宣言することによって複雑な条件付きの処理であっても簡単に記述することができるようになっています。
EXISTSを使用した先ほどのSQL文を日本語に直してみると…
「carsテーブルとmakersテーブルのidが合致し、makerカラムが『トヨタ』のcarsテーブルレコードを出力してください」
ということになります。
またEXISTSの後に出てくる条件の部分で「cars.id」や「makers.maker」といった記述の仕方が登場しました。これには「carsテーブルのidカラム」、「markersテーブルのmakerカラム」といった意味があります。
また、もう1点上記のコードには重要なポイントがあります。それは以下のコードです。
SELECT * FROM makers WHERE users.id = makers.id
もしこのコードが無ければ、以下のような出力結果となってしまいます。
+------+--------------------+ | id | maker | +------+--------------------+ | 1 |トヨタ | | 2 | トヨタ | | 3 | ホンダ | | 4 | 日産 | +------+--------------------+
EXISTSステートメントは本来「trueかfalse(存在するかしないか)」を返すためのものなので、上記のように「idが合致するかどうか」という条件を付け加えなければ出力結果を絞ることはできません。もし出力結果を絞りたいのであれば、忘れず設定をしましょう。
まとめ
今回の記事ではSQL EXISTSステートメントの使い方を初心者の方でも理解できるように解説していきました。SQL文の中でも意外と知られていないEXISTSステートメントを駆使して、WEBアプリケーションを思ったように開発できるようにしていきましょう。
【関連記事】
▶︎【意外と知らない?】SQL unionの使い方をわかりやすく説明
▶︎SQLのgroup byサンプルコード集 count、like、join等の組み合わせ例
▶︎【こんな使い方も?】SQL insertの使用方法を徹底的に解説
▶︎【初心者向け】SQLのDELETE文の使い方を現役SE目線で解説
ちなみに「サブクエリ」というのは、クエリ(問い合わせ)内にネスト(入れ子)されたもう1つのクエリのことです。IT用語として広く知られており、select文を使用する際に頻繁に用いられます。日本語では「副問い合わせ」と呼ばれており、メインの「クエリ」よりもサブ的な扱いをされていることが名前からも分かりますね。
上記の説明で「条件付きの出力」という言葉を使いましたが、膨大なテーブルデータ野中から指定した条件の出力を行うためには、この「サブクエリ」が有効です。
例えば100,000件の車に関するレコードが格納されているテーブルデータから「赤い色の車だけ出力して」と条件をつけることができるのが、「サブクエリ」のメリットでしょう。