集計関数ではない。集合演算だ。テーブル同士で足し算、掛け算、引き算する。イメージ的には集合演算の結果レコードが増減する。
一方テーブル同士は結合(Join)させることもできた。イメージとしては列の操作である。

集合演算イメージ:レコードが増減する。

集合演算

結合(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
* 積集合と差集合のコンビネーション。

参考:BigQuery で学ぶ非エンジニアのための SQL データ分析入門