抽出、ソート、結合、制限複数のSELECT文の結果を結合
- 複数のSELECT文を1つの結果にまとめて取得(重複なし)〔UNION〕
- 複数のSELECT文を1つの結果にまとめて取得〔UNION ALL〕
- このページで使用しているサンプルデータ
複数の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);