取得データの結合

広告

UNIONは複数のSELECT文によってデータをそれぞれ取得し、その結果を結合した上で1つのデータとして取得する場合に使います。書式は次の通りです。

SELECT col_name1, ... FROM tbl_name1
  UNION [ALL | DISTINCT] SELECT col_name2, ... FROM tbl_name2
  UNION [ALL | DISTINCT] SELECT col_name3, ... FROM tbl_name3;

ベースとなるSELECT文の結果に、UNIONの後に記載したSELECT文の結果を結合します。結果として取得されるカラムは最初のSELECT文で指定したカラムとなります。

各SELECT文は同じ数のカラムの値を取得する必要があり、同じ位置にあるカラムのデータ型は一致している必要があります。

データが結合されるとデフォルトでは重複行は削除されます。重複行も削除せずに取得したい場合にはUNIONの後にALLを指定して下さい。(DISTINCTを指定すると重複行が削除されます。これはデフォルトの動作なのでDISTINCTは指定する必要はありません)。

サンプル

実際に試してみます。まず次のようなテーブルを作成します。

mysql> create table user (username varchar(10), address varchar(10));
mysql> create table request (name varchar(10), address varchar(10), d date);
mysql> create table seminar (sid int, name varchar(10), address varchar(10));

テーブルには次のようなデータを追加してあります。

p18-1

p18-2

p18-3

では3つのテーブルから名前と住所に関するカラムのデータをそれぞれ取得し、結合した上で取得します。次のように入力します。

mysql> select username, address from user
    -> union select name, address from request
    -> union select name, address from seminar;

p18-4

今回はALLを指定していませんので結合されたデータの重複行は削除されています。

では重複行も削除せずに取得してみます。次のように入力します。

mysql> select username, address from user
    -> union all select name, address from request
    -> union all select name, address from seminar;

p18-5

データの重複行を削除せずに結合されたデータを取得しました。

( Written by Tatsuo Ikura )