【DB入門】UNIONとUNION ALL

2019年10月8日

スポンサーリンク

UNIONとは

二つ以上のSELECTの結果を結合してくれるものです。

SQLではこのような形になります。

--上の例の場合のSQL(UNION)
select a , b , c from テーブル1
union
select d , e , f from テーブル2;

 

取得した結果は、下の図のように「SQL1で取得した結果」+「SQL2で取得した結果」を取得する形になります。

UNIONを使うにあたっての注意点は次のとおり。

注意点

・SQL1とSQL2で取得する列の数が一致すること

・それぞれの列の型が一致すること。(下の例の場合 a = d , b = e , c = f )

 

UNIONとUNION ALL

「UNION」には「UNION」と書くケースと「UNION ALL」と書くケースがあります。

--UNION
select a , b , c from テーブル1
union
select d , e , f from テーブル2;

--UNION ALL
select a , b , c from テーブル1
union all
select d , e , f from テーブル2;

二つの違いは、SQL1とSQL2で全く同じ値の行があった時、

重複している分をまとめて1行で表示する(UNION)か、重複した行もすべて表示するか(UNION ALL)の違いです。

 

文字だけでもわかりづらいのでやってみましょう。

UNIONの例

これまでで作ったテーブルに対してのSQLを発行してみます。

下記ではstu01という生徒の教科ごとの点数に、合計行を加えて取得してみます。

--SQL1 生徒(stu01)の教科ごとの点数を取得する
select  school_code , student_code , subject_code , score
from t_student_score 
where school_code = 'sch001' and student_code = 'stu01'

union

--SQL2 生徒(stu01)の合計点を取得する
select  school_code , student_code , '合計' , sum(score)
from t_student_score 
where school_code = 'sch001' and student_code = 'stu01'
group by school_code , student_code
order by 1,2,3;

 

SQL1だけの結果はこうなります。(生徒(stu01)の教科ごとの点数)

 

SQL2だけの結果はこうなります。(生徒(stu01)の合計点を取得する)

 

UNIONした結果はこうなります。教科ごとの点数と最後に合計行を取得できました。

 

ちなみに『order by 1,2,3』の『1,2,3』はSelectに出てくる列の順番です。

『select school_code , student_code , subject_code』となっているので、

1 = school_code , 2 = student_code , 3 = subject_codeと同じです。

つまり『order by 1,2,3』=『school_code , student_code , subject_code』と同じです。

 

UNION ALL

別のSQLでUNIONとUNION ALLの挙動の違いを確認してみます。

まずはUNIONで取得してみます。

※以下のSQL1とSQL2ではscoreが45~50で重複したデータを取得しています。

--SQL1 : 点数が40~50をリストを取得
select  school_code , student_code , subject_code , score
from t_student_score 
where score between 40 and 50

union --unionは重複分が1行になる(45~50の行)

--SQL1 : 点数が45~70をリストを取得
select  school_code , student_code , subject_code , score
from t_student_score 
where score between 45 and 60

order by 4; --score順に

結果はこうなります。

 

次にUNION ALLにして取得してみます。

--SQL1 : 点数が40~50をリストを取得
select  school_code , student_code , subject_code , score
from t_student_score 
where score between 40 and 50

union all --union allは重複分もそのまま表示される

--SQL1 : 点数が45~70をリストを取得
select  school_code , student_code , subject_code , score
from t_student_score 
where score between 45 and 60

order by 4; --score順に

結果はこうなります。

重複している行(赤い箇所)が複数行でていることが確認できました。

以上で、UNIONとUNION ALLの紹介と実行テストになります。

 

次に

SELECT文はここまでです。次からはデータの更新・削除について紹介します。

【DB入門】データを更新する(UPDATE文)

 

一つ前の説明はこちらです。

【DB入門】抽出条件を指定する(HAVING)