- Home ›
- MySQLの使い方 ›
- テーブルとデータの結合
別々に取得したデータを結合して取得する(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));
テーブルには次のようなデータを格納してあります。
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');
もう一つテーブルを作成しました。
create table friendlist (friendname varchar(10), address varchar(10), tel varchar(12));
テーブルには次のようなデータを格納してあります。
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');
-- --
それでは addressnote からデータを取得し、friendlist から取得したデータと結合した上でデータを取得します。次のように実行してください。
select name, address from addressnote union select friendname, address from friendlist;
重複したデータを除いてそれぞれの SELECT 文で取得したデータを結合して取得することができました。
今度は重複したデータも含めて取得してみます。次のように実行してください。
select name, address from addressnote union all select friendname, address from friendlist;
重複したデータも含めてそれぞれの 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;
それぞれの SELECT 文で取得したデータを結合したあと、 address カラムの値を記述にソートを行ってからデータを取得することができました。
-- --
UNION 句を使っては別々に取得したデータを結合して取得する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。