MySQLのUNION演算子とは?
MySQLのUNION演算子とは?
MySQLを操作するために集合演算子というものがあります。集合演算子を使用することで複数の問い合わせの結果を1つにまとめることが出来ます。
MySQLのUNION演算子は集合演算子のひとつです。また、MySQLにはUNION ALL演算子というものがあります。
ここではMySQLのUNION演算子、UNION ALL演算子に説明します。
UNION演算子の使用方法
基本構文
SWLECT文1
UNION
SELECT文2
上記コードがMySQLのUNION演算子の基本構文となります。
UNION演算子は2つの問い合わせ結果を連結し、重複した行を排除して戻します。
2つの問い合わせに同一の行がある場合は1度しか表示されません。
注意点があり、一つ目と二つ目の問い合わせでSELECT文に指定する列の個数は同数にする必要があります。
また、2つ目の問い合わせのSELECT文に指定する列のデータ型は、一つ目の問い合わせのSELECT文に指定されている列のデータ型と同じか、同じデータ型グループである必要があります。
列の名前は異なってもいいですが、その場合問い合わせの列見出しは一つ目の問い合わせに指定される列名が表示されます。
mysql> SELECT ID,NAME
-> FROM sample1
UNION
-> SELECT ID,NAME
-> FROM sample2
また、このように最初のSELECT文の表と次のSELECT文の表が違うものでも使用することが出来ます。
サンプルコード
+----+--------+
| ID | NAME |
+----+--------+
| 10 | 山田 |
| 20 | 田中 |
| 30 | 山内 |
| 20 | 山中 |
| 10 | 花田 |
| 20 | 川田 |
| 10 | 上杉 |
| 20 | 伊達 |
| 30 | 川原 |
| 20 | 小田 |
| 10 | 豊臣 |
| 30 | 山口 |
+----+--------+
上記はsample1という名前の表です。
この表からUNION演算子を使用し、IDが10と20、20と30の複数の問い合わせをするには以下のコードを実行します。
mysql> SELECT ID,NAME
-> FROM sample1
-> WHERE ID IN (10,20)
-> UNION
-> SELECT ID,NAME
-> FROM sample1
-> WHERE ID IN (20,30);
実行結果
+----+--------+
| ID | NAME |
+----+--------+
| 10 | 山田 |
| 20 | 田中 |
| 20 | 山中 |
| 10 | 花田 |
| 20 | 川田 |
| 10 | 上杉 |
| 20 | 伊達 |
| 20 | 小田 |
| 10 | 豊臣 |
| 30 | 山内 |
| 30 | 川原 |
| 30 | 山口 |
+----+--------+
実行結果のようにIDが10と20、IDが20と30の複数の問い合わせした結果が表示されています。
またIDの20が重複していますが重複した行は排除されています。
サンプルコードではWHERE句を使っていますが、GROUP BY句、HAVING句なども通常のSELECT文と同様に使うことができます。
ですが、複合問い合わせ後にソートする時に使われるORDER BY句を使用したい時は最後のSELECT文にのみ指定が可能です。
UNION ALL演算子
基本構文
SWLECT文1
UNION ALL
SELECT文2
UNION演算子の使用方法と一緒ですが、UNION ALL演算子の場合重複した行は排除されずそのまま表示されます。
注意点や、GROUP BY句、HAVING句などの使用方法もUNION演算子の時に紹介したものと一緒です。
サンプルコード
+----+--------+
| ID | NAME |
+----+--------+
| 10 | 山田 |
| 20 | 田中 |
| 30 | 山内 |
| 20 | 山中 |
| 10 | 花田 |
| 20 | 川田 |
| 10 | 上杉 |
| 20 | 伊達 |
| 30 | 川原 |
| 20 | 小田 |
| 10 | 豊臣 |
| 30 | 山口 |
+----+--------+
上記はsample1という名前の表です。
この表からUNION ALL演算子を使用しIDが10と20、20と30の複数の問い合わせをするには以下のコードを実行します。
mysql> SELECT ID,NAME
-> FROM sample1
-> WHERE ID IN (10,20)
-> UNION
-> SELECT ID,NAME
-> FROM sample1
-> WHERE ID IN (20,30);
実行結果
+----+--------+
| ID | NAME |
+----+--------+
| 10 | 山田 |
| 20 | 田中 |
| 20 | 山中 |
| 10 | 花田 |
| 20 | 川田 |
| 10 | 上杉 |
| 20 | 伊達 |
| 20 | 小田 |
| 10 | 豊臣 |
| 20 | 田中 |
| 30 | 山内 |
| 20 | 山中 |
| 20 | 川田 |
| 20 | 伊達 |
| 30 | 川原 |
| 20 | 小田 |
| 30 | 山口 |
+----+--------+
実行結果をみてのとおり重複した行も表示されています。
まとめ
MySQLのUNION演算子、UNION ALL演算子について説明しました。
MySQLのUNION ALL演算子とUNION ALL演算子は複数の問い合わせの結果を1つにまとめることができるものですが、少し違いがあるため注意が必要です。