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

広告
eyecatch

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

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

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 句を使っては別々に取得したデータを結合して取得する方法について解説しました。

MySQLの使い方の他の記事を見てみる

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。