SQLのunion文は、selectやdelete、createなどのステートメントと比べるとあまり使用していないという方が多いのではないでしょうか。中には「unionステートメントなんて聞いたことがない…」という方もいらっしゃるはず。たしかにCREATE・SELECT・UPLOAD・DELETEのSQLステートメントを使いこなせていれば、unionステートメントを必要に感じることは少ないかもしれません。
このように一見、初心者の方が見落としがちなunionステートメントなのですが、実はその使い方はとても簡単。そして使いこなすことができれば非常に便利なステートメントなのです。
そこで今回の記事ではSQL unionの使用方法を徹底的に解説していきます。SQL文の中でも意外と知られていないunionステートメントを駆使して、WEBアプリケーションを思ったように開発できるようにしていきましょう。
- SQLにおける「union」の概要
- SQL union文の使い方
SQLのステートメント「union」とは何か
SQLのステートメント「union」とは、複数個に渡るselectステートメントの結果を結合して表示してくれるSQLステートメントのことです。
普段、データベーステーブルのカラムから、複雑な条件付きでレコードを取り出そうとする際には、それぞれの条件に合わせて複数回selectステートメントを行なっているのではないでしょうか。unionステートメントは、そのようなわずらわしいselectステートメントの繰り返しを解消し、出力結果の可読性を向上するためのSQL文です。
「複雑な条件付きでのレコード出力」にはどのようなものがありますか?
例えば、1つ目の出力では「colorカラムからredのレコード」を出力し、2つ目の出力では「sizeカラムからbigのレコード」を出力したいという場合がそれに当たります。このような場合、selectステートメントを2回繰り返して使用している方が多く見受けられます。
「可読性」とは何ですか?
「プログラムのコードを読んだ際、コードの目的や処理の理解度」を指しています。
例えば以下のようなシチュエーションでSQLのunionステートメントを使用しています。
- ニュースサイトで各カテゴリーごとの最新記事を1つずつ表示するとき
- さまざまな部署のスタッフの年齢を指定した数だけ表示するとき
- ECサイトでおすすめ商品をそれぞれのジャンルごとにいくつか表示するとき
このような例を見ていくとSQLのunionステートメントの特徴や使いどころがわかってきたのではないでしょうか。SQLのunionステートメントは主にカテゴリーや異なるテーブルからまとめてレコードデータを出力したいという場面で使用されることが多いのです。
unionという英単語自体、あまり聞いたことがないため、unionステートメントの働きが想像しづらいかもしれません。「union」という言葉には「結合」という言葉の意味があるので「SQLステートメントを結合して出力する」という働きを想像しておくと、unionが使用された際に処理の目的や流れを目で追いやすいはずです。
【関連記事】
▶︎SQL if文のサンプルコード集 NULL判定や、Switch文のような分岐をする方法
▶︎sqlコードの意味がわからない…不思議なSQLコードサンプル集
SQLunionの使い方
ここまでSQLのunionステートメントについてのあらましを把握していただきました。それではいよいよSQLのunionステートメントを具体的に使用する方法について詳しく解説していきましょう。
本記事では、SQLのunionステートメントを使用する環境としてMySQLというデータベース管理システムを使用します。MySQLに関する説明は割愛しますが、まだ使用したことがないという方はこれを機に導入してみてください。
2つのselectステートメントの結合
SELECT color, size FROM fruits UNION SELECT color, size FROM foods;
SQL unionステートメントの最も基礎的な使用方法としては2つのselectステートメントを結合するというものがあります。上記のようなunionステートメントをSQL文で宣言することによってfruitsテーブルのcolorカラムとsizeカラム、foodsテーブルのcolorカラムとsizeカラムから重複しないレコードのみを出力することができます。
「重複しない」という点がunionステートメントのポイントです。unionステートメントでは、複数のselectステートメントの出力結果を1度、「結合」してしまうため、同様の結果が得られたレコード同士に関しては1つに結合することになるのです。では、重複したレコードもそれぞれ表示するためにはどのようにunionステートメントを扱えばいいのでしょうか。
【select文についてはこちらをチェック】
▶︎SQLの役割と基本文法は?データベース操作の基本を確認
重複したレコードも全て表示するためのunion文
SELECT color, size FROM fruits UNION ALL SELECT color, size FROM foods;
重複したレコードも全て表示するためのunion文には、UNIONの後に「ALL」という言葉を付け加えます。英単語「ALL(全て)」という意味の通りですが、このようにSQL文を宣言することによって、重複したレコードも含めて全て出力するようになります。
結果としては同じデータではあるものの、全てのレコードを閲覧したいというシチュエーションも必ず出てくるはずです。そのような時には「UNION ALL」を使用して、重複するレコードも全て出力するようにしましょう。
指定した数だけレコードを出力するためのunion文
SELECT color, size FROM fruits LIMIT 10 UNION SELECT color, size FROM foods LIMIT 5;
膨大なテーブルデータを扱う際、全てのレコードを出力するとコンピュータの処理に大きな負担をかけてしまう場合もあります。そのような際には指定した数だけレコードを出力するためのunion文を使用しましょう。
具体例は上記に指し示した通りで、テーブル名の後にLIMIT 値を付け加えます。上記の例では「fruitsテーブルのcolorカラムとsizeカラムから10レコード、foodsテーブルのcolorカラムとsizeカラムから5レコードを出力」することができます。他にも以下のような方法でソートを行うことも可能となっています。
SELECT color, size FROM fruits ORDER BY color UNION SELECT color, size FROM foods ORDER BY size;
基本的にはアルファベットの昇順に並び替えされた結果が返ってくることになります。出力結果をソートしたい場合にはとても便利ですね。
まとめ
今回の記事ではSQL unionの使用方法を徹底的に解説していきました。SQL文の中でも意外と知られていないunionステートメントを駆使して、WEBアプリケーションを思ったように開発できるようにしていきましょう。
【関連記事】
▶︎【初心者向け】SQLのDELETE文の使い方を現役SE目線で解説
▶︎【こんな使い方も?】SQL insertの使用方法を徹底的に解説
▶︎エンジニア必携!SQLインジェクション対策スキルをプロが解説
ちなみに「ステートメント」というのは、プログラミングにおいてコンピュータに対して行う命令・宣言のことです。IT用語として広く知られており、英単語としても命令、宣言という意味はもちろんのこと、「声明」「提示」といった意味を持っているのが「ステートメント」です。
また、いくつかのステートメントをまとめて使用するための複文を「ブロック」と言いますので、こちらも合わせて覚えておくとよいでしょう。