別々に取得したデータを結合して取得する(UNION句)

UNION 句を使用することで、別々の SELECT 文によって取得したデータを結合して 1 つのデータとして取得することができます。ここでは MySQL で UNION 句を使っては別々に取得したデータを結合して取得する方法について解説します。

(Last modified: )

別々に取得したデータを結合して取得する

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

SELECT col_name1, ... FROM table_name1
  UNION [ALL | DISTINCT] SELECT col_name2, ... FROM table_name2
  [UNION [ALL | DISTINCT] ...]

最初の SELECT 文で取得したデータに、次の UNION のあとの SELECT 文で取得したデータを結合して取得します。 3 つ以上のテーブルを結合したい場合は UNION 以下をテーブルの数だけ記述してください。

取得したデータのカラム名は最初の SELECT 文のあとに記載されたカラム名となります。それぞれの SELECT 文で取得するデータのカラムの数は同じである必要があり、また同じ位置にあるカラムはデータ型が一致している必要があります(データ型が異なっている場合は、いずれかのデータ型に変換されます)。

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

-- --

それでは実際に試してみます。次のようなテーブルを作成しました。

create table addressnote (id int, name varchar(10), address varchar(10));

別々に取得したデータを結合して取得する(1)

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

insert into addressnote values (1, 'Yamada', 'Tokyo');
insert into addressnote values (2, 'Suzuki', 'Osaka');
insert into addressnote values (3, 'Nishi', 'Chiba');
insert into addressnote values (4, 'Horie', 'Tokyo');

別々に取得したデータを結合して取得する(2)

もう一つテーブルを作成しました。

create table friendlist (friendname varchar(10), address varchar(10), tel varchar(12));

別々に取得したデータを結合して取得する(3)

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

insert into friendlist values ('Kuroda', 'Sapporo', 'xx-xxxx-xxxx');
insert into friendlist values ('Suzuki', 'Osaka', 'xx-xxxx-xxxx');
insert into friendlist values ('Watanabe', 'Kyoto', 'xx-xxxx-xxxx');
insert into friendlist values ('Andou', 'Nagoya', 'xx-xxxx-xxxx');

別々に取得したデータを結合して取得する(4)

-- --

それでは addressnote からデータを取得し、friendlist から取得したデータと結合した上でデータを取得します。次のように実行してください。

select name, address from addressnote union select friendname, address from friendlist;

別々に取得したデータを結合して取得する(5)

重複したデータを除いてそれぞれの SELECT 文で取得したデータを結合して取得することができました。

今度は重複したデータも含めて取得してみます。次のように実行してください。

select name, address from addressnote union all select friendname, address from friendlist;

別々に取得したデータを結合して取得する(6)

重複したデータも含めてそれぞれの SELECT 文で取得したデータを結合して取得することができました。

結合したデータに対してソートや取得するデータの行数を制限する

UNION を使って取得したデータを結合する場合に、それぞれの SELECT 文に対して ORDER BY 句や LIMIT 句を設定する場合は SELECT 文を括弧で囲った上で各 SELECT 文に対して設定してください。

(SELECT ... FROM table_name1 LIMIT n)
UNION 
(SELECT ... FROM table_name2 ORDER BY col_name LIMIT n)

また結合が終わった後のデータに対して ORDER BY 句や LIMIT 句を設定する場合は SELECT 文を括弧で囲った上で次のように設定してください。

(SELECT ... FROM table_name1 LIMIT n)
UNION 
(SELECT ... FROM table_name2 ORDER BY col_name LIMIT n)
ORDER BY col_name LIMIT n

では実際に試してみます。先ほどのサンプルで使用したテーブルを使用して、結合したデータに対して address カラムの値を使って並び替えを行います。

(select name, address from addressnote) union (select friendname, address from friendlist) order by address;

結合したデータに対してソートや取得するデータの行数を制限する(1)

それぞれの SELECT 文で取得したデータを結合したあと、 address カラムの値を記述にソートを行ってからデータを取得することができました。

-- --

UNION 句を使っては別々に取得したデータを結合して取得する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。