本項は和集合の演算子ついて説明していきます。
UNION演算子
集合演算子のUNIONを使用すると、それぞれの検索結果を足し合わせた和集合を求めることが来ます。
集合演算子で最も代表的な演算子で、MySQLではUNIONのみサポートしています。
書式は下記になります。
1 2 3 | SELECT 文 UNION SELECT 文 |
では、さっそく実際に使ってみましょう。
今回は以下のテーブルを使用します。
1 2 3 4 5 6 7 | SELECT * FROM teachers WHERE address = "東京都" UNION SELECT * FROM teachers WHERE age < 30; |
このように、二つの検索結果を足し合わせたものにすることができます。
注意点としては、住所が東京都と、30歳未満両方で当てはまるタロウが一つしか表示されていないことからわかるように
重複したものは1行にまとめられます。
重複したものも表示したい場合は、以下のように「UNION ALL」としてあげる必要があります。
1 2 3 4 5 6 7 | SELECT * FROM teachers WHERE address = "東京都" UNION ALL SELECT * FROM teachers WHERE age < 30; |
注意点
集合演算をするにあたっては以下のような注意点があります。
今回はteachersテーブルに加えて、下記のようなstudentsテーブルも使用します。
1.列数が同じでなければならない。
例えば、下記のようにするとエラーとなります。
teachersテーブルの検索結果のカラムは5つで、studentsテーブルの検索結果のカラムが4なのでエラーとなります。
1 2 3 | SELECT * FROM teachers UNION SELECT * FROM students; |
このように結果列の数が違うもの同士を演算したい場合は、以下のようにstudentsテーブルの検索結果に
null列を追加してあげるなど列数をそろえてあげればエラーを回避できます。
1 2 3 | SELECT * FROM teachers UNION SELECT *, null FROM students; |
2.各列のデータ型が同じでなければならない
MySQLでは、暗黙の型変換をしてくれるのでエラーとはなりませんが、DBMSによってはデータ型が異なるとエラーとなります。
例えば、下記のように、teachersテーブルの検索結果の一番左のbirthdayカラムは日付型で、studentsテーブルの一番左のidカラムは数値型となり、データ型不一致の為エラーとなります。
1 2 3 | SELECT birthday, id, name , address, age FROM teachers UNION SELECT id, name , address, age, null FROM students; |
このようにデータ型が不ぞろいで暗黙の型変換が行われない場合であっても、CASTするなどして明示的に型変換をすることでエラーを回避することができます。
1 2 3 | SELECT CAST (birthday AS CHAR ), name , address, age FROM teachers UNION SELECT CAST (id AS CHAR ), name , address, age FROM students; |
3.ORDER BYは最後につける
ORDER BYは、基本的に以下のようにUNION演算後に対するものしか有効ではありません。それぞれのSELECT句で使用してもエラーとなります。
1 2 3 4 | SELECT * FROM teachers UNION SELECT *, null FROM students ORDER BY id DESC ; |
以下のように、SELECT文をカッコで囲みサブクエリとすると各SELECT文に対して使用してもエラーとはなりませんが無視されます。
1 2 3 | ( SELECT * FROM teachers ORDER BY id DESC ) UNION ( SELECT *, null FROM students ORDER BY id DESC ); |
ただし、以下のようにLIMIT句も併せて使用すると並べ替えは無視されません。
1 2 3 | ( SELECT * FROM teachers ORDER BY id DESC LIMIT 2) UNION SELECT *, null FROM students; |
今回の学習ポイント
・UNION演算子は、重複業は1行にまとめられる、
・重複行を1行にまとめなくてもいい場合は、UNION ALLとする。
・ORDER BY は基本的に、全体にかかるものしか有効ではない
練習問題
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。 [sql] CREATE DATABASE worldcup2014;
use worldcup2014
source C:\worldcup2014.sql
[/sql]