集計関数ではない。集合演算だ。テーブル同士で足し算、掛け算、引き算する。イメージ的には集合演算の結果レコードが増減する。
一方テーブル同士は結合(Join)させることもできた。イメージとしては列の操作である。
集合演算イメージ:レコードが増減する。
結合(Join) イメージ:列を操作する。
集計演算
列名と列数がそろったテーブル同士で+(加算)、*(乗算)、-(除算)を行う。
テーブルの加算( 和集合 ):
包含したデータが含まれるテーブル
例:10行+10行=20行のテーブル
*重複分は取り除く重複分2行の場合「18行」も設定可(union distinct)
テーブルの乗算( 積集合 ):
重なったデータだけ含まれるテーブル
例: 10行、10行で「2行」重なりがあるテーブル
メモ:積集合における乗算イメージ
0(ゼロ or 無)* 1(有)=0(ゼロ・重なりが無)。
1(有)*1(有)=1(有・重なりが有)
テーブルの除算( 差集合 ):
テーブルからもう片方テーブルの重複分を除く
例:10行、10行のテーブルで2行重なりがあるテーブル
例:10行+2行=8行のテーブル
和集合:union句
select 列
from
1つ目のテーブル
union ( all or distinct)
select 列
from
2つ目のテーブル
union する際に確認
同じ列数
列の順序同じにする
*生成されたテーブルは1つ目のテーブルの列名が使われる。
重複有
union all
重複無
union distinct
和集合 例
1
select *
from event_a
union all
select *
from event_
b
2
select *
from event_
a
union all
select *
from event_b
union all
select *
from event_c
order by id asc
3
select * from
(
select *
from event_a
union all
select *
from event_b
union all
select *
from event_c
)
where gender = '男性'
order by age asc
*子クエリの結果テーブルからレコードを絞り(where)、ageで昇順させる。
4
select * except(date,place)
from event_a
union distinct
select last_name,gender,age
from event_b
* last_name,gender,age 列指定がdate,place列以外と合致の場合の設定
5
select count(*)
from(
select * except(date,place)
from event_a
union distinct
select last_name,gender,age
from event_b
union distinct
select last_name,gender,age
from event_c
)
*行数取得。サブクエリで和集合。親にカウントさせる。
積集合: intersect 句
select 列
from
1つ目の テーブル
intersect distinct
select 列
from
2つ目の テーブル
intersect する際に確認
同じ列数
列の順序同じ
積集合 例
1
select last_name,gender,age from event_a
intersect distinct
select last_name,gender,age from event_b
2
select last_name,gender,age from event_a
intersect distinct
select last_name,gender,age from event_b
intersect distinct
select last_name,gender,age from event_c
3
(select last_name,first_name,gender,age from event_a
union distinct
select last_name,first_name,gender,age from event_b
)
intersect distinct
select last_name,first_name,gender,age from event_c
*和集合と積集合のコンビネーション。
差集合:except 句
デーブル同士で重複したレコードを除いた結果を取り出す。
select 列
from
1つ目のテーブル
except distinct
select 列
from
2つ目のテーブル
except する際に確認
同じ列数
列の順序同じ
*テーブルA - テーブルB と テーブルB - テーブルA では結果が異なる。
*重複している部分が左テーブルから差し引かれる。
差集合 例
1
select last_name,first_name,gender,age from event_b
except distinct
select last_name,first_name,gender,age from event_a
2
select last_name,first_name,gender,age from event_c
except distinct
(
select last_name,first_name,gender,age from sample.event_a
union distinct
select last_name,first_name,gender,age from sample.event_b
)
* 和集合と差集合のコンビネーション。
3
(
select last_name,first_name,gender,age from event_a
intersect distinct
select last_name,first_name,gender,age from event_c
)
except distinct
select last_name,first_name,gender,age from event_b
* 積集合と差集合のコンビネーション。