Search

複数のSELECT文を1つの結果にまとめて取得(重複なし)
UNION

unknown

複数のSELECT文の実行結果を1つの結果として結合します。 SELECT文で検索対象に指定するカラム名のリストには、同じ型のカラムを指定する必要があります。 最初のSELECT文で指定したカラムが、結果のカラム名として使用されます。

UNIONにキーワードALLを指定しない場合は、DISTINCTを指定した時と同様、重複なしのレコードが返されます。

UNION文の使用例
# tmp_EmployeeAテーブルの内容
mysql> SELECT * FROM tbl_EmployeeA; Enter
+-------+------------+-----+
| EmpID | FullName   | Age |
+-------+------------+-----+
| A001  | 田中 太郎 |  31 | ←tbl_EmployeeBのFullNameフィールドとデータ重複
| A002  | 鈴木 花子 |  23 |
| A003  | 山田 一郎 |  56 | ←tbl_EmployeeBのFullNameフィールドとデータ重複
| A004  | 佐藤 和也 |  24 |
+-------+------------+-----+
4 rows in set (0.00 sec)

# tmp_EmployeeBテーブルの内容
mysql> SELECT * FROM tbl_EmployeeB; Enter
+-------+--------------+-----+
| EmpID | FullName     | Age |
+-------+--------------+-----+
| B001  | 田中 太郎   |  31 |
| B002  | 山口 智子   |  35 |
| B003  | 山田 一郎   |  56 |
| B004  | 真野 あずさ |  22 |
+-------+--------------+-----+
4 rows in set (0.00 sec)

# tmp_EmployeeA と tmp_EmployeeB テーブルの FullNameフィールドのデータを
# 重複なしで表示
mysql> SELECT FullName FROM tbl_EmployeeA Enter
    -> UNION Enter
    -> SELECT FullName FROM tbl_EmployeeB; Enter
+--------------+
| FullName     |
+--------------+
| 田中 太郎   |
| 鈴木 花子   |
| 山田 一郎   |
| 佐藤 和也   |
| 山口 智子   |
| 真野 あずさ |
+--------------+
6 rows in set (0.00 sec)

UNIONの結果に対して、ORDER BY節を使用する場合は、SELECT文全体を括弧で括ります

UNION文の使用例(SELECT文にORDER BY節を使用する場合)
# 各SELECT文毎にORDER BY節が適用されるため、
# 結果全体をまとめてソートされる訳ではありません
mysql> (SELECT FullName,Age FROM tbl_EmployeeA ORDER BY Age) Enter
    -> UNION
    -> (SELECT FullName,Age FROM tbl_EmployeeB ORDER BY Age); Enter
+--------------+-----+
| FullName     | Age |
+--------------+-----+
| 鈴木 花子   |  23 |
| 佐藤 和也   |  24 |
| 田中 太郎   |  31 |
| 山田 一郎   |  56 |
| 真野 あずさ |  22 |
| 山口 智子   |  35 |
+--------------+-----+
6 rows in set (0.00 sec)

複数のSELECT文を1つの結果にまとめて取得
UNION ALL

unknown

UNIONにキーワードALLを指定した場合は、実行された全てのSQL文から、条件に一致する全てのレコードが返されます。 重複レコードも含まれます。

UNION文の使用例
# tmp_EmployeeAテーブルの内容
mysql> SELECT * FROM tbl_EmployeeA; Enter
+-------+------------+-----+
| EmpID | FullName   | Age |
+-------+------------+-----+
| A001  | 田中 太郎 |  31 | ←tbl_EmployeeBのFullNameフィールドとデータ重複
| A002  | 鈴木 花子 |  23 |
| A003  | 山田 一郎 |  56 | ←tbl_EmployeeBのFullNameフィールドとデータ重複
| A004  | 佐藤 和也 |  24 |
+-------+------------+-----+
4 rows in set (0.00 sec)

# tmp_EmployeeBテーブルの内容
mysql> SELECT * FROM tbl_EmployeeB; Enter
+-------+--------------+-----+
| EmpID | FullName     | Age |
+-------+--------------+-----+
| B001  | 田中 太郎   |  31 |
| B002  | 山口 智子   |  35 |
| B003  | 山田 一郎   |  56 |
| B004  | 真野 あずさ |  22 |
+-------+--------------+-----+
4 rows in set (0.00 sec)

# tmp_EmployeeA と tmp_EmployeeB テーブルの FullNameフィールドの
# データを全て表示(重複データも含まれる)
mysql> SELECT FullName FROM tbl_EmployeeA Enter
    -> UNION ALL Enter
    -> SELECT FullName FROM tbl_EmployeeB; Enter
+--------------+
| FullName     |
+--------------+
| 田中 太郎   |
| 鈴木 花子   |
| 山田 一郎   |
| 佐藤 和也   |
| 田中 太郎   |
| 山口 智子   |
| 山田 一郎   |
| 真野 あずさ |
+--------------+
8 rows in set (0.00 sec)

このページで使用しているサンプルデータ

unknown

サンプルデータ
# データベース(db_Employee)作成
CREATE DATABASE IF NOT EXISTS db_Employee;

# データベース(db_Employee)選択
USE db_Employee

# テーブル(tbl_EmployeeA)作成
CREATE TABLE tbl_EmployeeA (
EmpID VARCHAR(4) NOT NULL PRIMARY KEY,
FullName VARCHAR(32) NOT NULL,
Age INTEGER NOT NULL
);

# テーブル(tbl_EmployeeB)作成
CREATE TABLE tbl_EmployeeB (
EmpID VARCHAR(4) NOT NULL PRIMARY KEY,
FullName VARCHAR(32) NOT NULL,
Age INTEGER NOT NULL
);

#データ挿入
INSERT INTO tbl_EmployeeA (EmpID,FullName,Age) VALUES
('A001','田中 太郎',31),
('A002','鈴木 花子',23),
('A003','山田 一郎',56),
('A004','佐藤 和也',24);

INSERT INTO tbl_EmployeeB (EmpID,FullName,Age) VALUES
('B001','田中 太郎',31),
('B002','山口 智子',35),
('B003','山田 一郎',56),
('B004','真野 あずさ',22);

関連コンテンツ

Q. このサイトの情報はお役に立ちましたでしょうか?

投票する 投票結果を見る

管理人に【web拍手】を送るweb拍手(1行メッセージも送れます♪)

pagetop

polarized women