Developer

【SQL基礎】和集合
2021.03.31
Lv1

【SQL基礎】和集合

本項は和集合の演算子ついて説明していきます。


UNION演算子

集合演算子のUNIONを使用すると、それぞれの検索結果を足し合わせた和集合を求めることが来ます。
集合演算子で最も代表的な演算子で、MySQLではUNIONのみサポートしています。

書式は下記になります。

SELECT文
UNION
SELECT文

では、さっそく実際に使ってみましょう。
今回は以下のテーブルを使用します。

SELECT *
FROM teachers
WHERE address = "東京都"
UNION
SELECT *
FROM teachers
WHERE age < 30;

このように、二つの検索結果を足し合わせたものにすることができます。
注意点としては、住所が東京都と、30歳未満両方で当てはまるタロウが一つしか表示されていないことからわかるように
重複したものは1行にまとめられます。
重複したものも表示したい場合は、以下のように「UNION ALL」としてあげる必要があります。

SELECT *
FROM teachers
WHERE address = "東京都"
UNION ALL
SELECT *
FROM teachers
WHERE age < 30;


注意点

集合演算をするにあたっては以下のような注意点があります。
今回はteachersテーブルに加えて、下記のようなstudentsテーブルも使用します。

1.列数が同じでなければならない。

例えば、下記のようにするとエラーとなります。
teachersテーブルの検索結果のカラムは5つで、studentsテーブルの検索結果のカラムが4なのでエラーとなります。

SELECT * FROM teachers
UNION
SELECT * FROM students;

このように結果列の数が違うもの同士を演算したい場合は、以下のようにstudentsテーブルの検索結果に
null列を追加してあげるなど列数をそろえてあげればエラーを回避できます。

SELECT * FROM teachers
UNION
SELECT *, null FROM students;

 

2.各列のデータ型が同じでなければならない

MySQLでは、暗黙の型変換をしてくれるのでエラーとはなりませんが、DBMSによってはデータ型が異なるとエラーとなります。
例えば、下記のように、teachersテーブルの検索結果の一番左のbirthdayカラムは日付型で、studentsテーブルの一番左のidカラムは数値型となり、データ型不一致の為エラーとなります。

SELECT birthday, id, name, address, age FROM teachers
UNION
SELECT id, name, address, age, null FROM students;

このようにデータ型が不ぞろいで暗黙の型変換が行われない場合であっても、CASTするなどして明示的に型変換をすることでエラーを回避することができます。

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句で使用してもエラーとなります。

SELECT * FROM teachers
UNION
SELECT *, null FROM students
ORDER BY id DESC;

以下のように、SELECT文をカッコで囲みサブクエリとすると各SELECT文に対して使用してもエラーとはなりませんが無視されます。

(SELECT * FROM teachers ORDER BY id DESC)
UNION
(SELECT *, null FROM students ORDER BY id DESC);

ただし、以下のようにLIMIT句も併せて使用すると並べ替えは無視されません。

(SELECT * FROM teachers ORDER BY id DESC LIMIT 2)
UNION
SELECT *, null FROM students;


今回の学習ポイント

・UNION演算子は、重複業は1行にまとめられる、
・重複行を1行にまとめなくてもいい場合は、UNION ALLとする。
・ORDER BY は基本的に、全体にかかるものしか有効ではない


練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.zip

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

1.身長(players.height)が190cm以上の検索結果と、体重(players.weight)が70kg未満の選手の検索結果をUNION結合してください。

答え
[sql] SELECT *
FROM players
WHERE height >= 190
UNION
SELECT *
FROM
players
WHERE weight < 70;
[/sql]


※検索結果は一部分のみ表示しています。

UNIONで結合しているので重複している「id = 354」の選手のレコードは1行しか表示されていません。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ