Q1: 復習
Q. populationテーブルにあるレコードのうち,
⼤学学⽣数が7万以上かつ⼩学校児童数が30万
以上の都道府県名を表⽰するSQL⽂を書け.
表⽰の際には都道府県名の重複は除く.
SELECT DISTINCT
都道府県
FROM
population
WHERE
⼤学学⽣数 ≧ 70000
AND ⼩学校児童数 ≧ 300000;
A.
和集合
SELECT * FROM elderly_population_top10
UNION
SELECT * FROM university_student_population_top10;
UNION句はテーブルAとテーブルBのいずれかに
含まれるレコードを返す
地域コード 都道府県 総人口
R01000 北海道 5183000
R11000 埼玉県 7340000
…
R04000 福岡県 5124000
11件
Slide 17
Slide 17 text
関係データモデルにおける集合演算の注意点 (1/2)
SELECT ⽂1
UNION
SELECT ⽂2;
ここだけ取り出しても
実⾏可能なSQL⽂にする
WHERE句なども
混ぜることが可能
SELECT * FROM elderly_population_top10
WHERE 総⼈⼝ ≧ 7000000
UNION
SELECT * FROM university_student_population_top10
WHERE 総⼈⼝ ≧ 7000000;
Q2: 集合演算
Q. populationテーブルにあるレコードのうち,
⼤学学⽣数が7万以上かつ⼩学校児童数が30万
以上の都道府県名を表⽰するSQL⽂を書け.
ただしINTERSECT句を使って書くこと.
SELECT DISTINCT 都道府県
FROM population
WHERE ⼤学学⽣数 ≧ 70000
INTERSECT
SELECT DISTINCT 都道府県
FROM population
WHERE ⼩学校児童数 ≧ 300000;
A.
Q3: 直積
Q. populationテーブルとactivityテーブルの
直積を求めるSQL⽂を書け.
SELECT
*
FROM
population, activity;
A.
Slide 34
Slide 34 text
直積(交差結合; CROSS JOIN)(2/2)
SELECT
*
FROM
university_student_population_top10 AS u,
activity AS a
WHERE
u.都道府県 = a.都道府県;
WHERE句と組み合わせれば直積結果を絞り込める
名前が⻑いので
AS修飾句で別名をつける
特定のテーブルの要素を
明⽰的に参照するときはドットを使う
Slide 35
Slide 35 text
内部結合(INNER JOIN)(1/3)
日時 顧客ID 商品ID 個数
2019/1/1 い A 2
2019/1/1 い B 3
2022/3/7 に D 8
購買履歴
商品ID 商品名 単価
A 伊左衛門 130
B 午前の紅茶 150
C おいしい牛乳 250
商品
日時 顧客ID 商品ID 個数 商品名 単価
2019/1/1 い A 2 伊左衛門 130
2019/1/1 い B 3 午前の紅茶 150
商品マスタに商品Dに関するデータがないので無視される
指定した列が指定条件を満たす行を探して
2つの表の行を結合
商品IDが同じ⾏を探して結合
Slide 36
Slide 36 text
内部結合(INNER JOIN)(2/3)
SELECT 購買履歴.*, 商品.*
FROM 購買履歴
INNER JOIN 商品 ON 購買履歴.商品ID = 商品.商品ID;
日時 顧客ID 商品ID 個数
2019/1/1 い A 2
2019/1/1 い B 3
2022/3/7 に D 8
購買履歴
商品ID 商品名 単価
A 伊左衛門 130
B 午前の紅茶 150
C おいしい牛乳 250
商品
日時 顧客ID 商品ID 個数 商品名 単価
2019/1/1 い A 2 伊左衛門 130
2019/1/1 い B 3 午前の紅茶 150
結合条件
商品IDが同じ⾏を探して結合
Slide 37
Slide 37 text
内部結合(INNER JOIN)(3/3)
SELECT 購買履歴.*, 商品.*
FROM 購買履歴
INNER JOIN 商品 USING (商品ID);
日時 顧客ID 商品ID 個数
2019/1/1 い A 2
2019/1/1 い B 3
2022/3/7 に D 8
購買履歴
商品ID 商品名 単価
A 伊左衛門 130
B 午前の紅茶 150
C おいしい牛乳 250
商品
日時 顧客ID 商品ID 個数 商品名 単価
2019/1/1 い A 2 伊左衛門 130
2019/1/1 い B 3 午前の紅茶 150
結合に使う列名が
2つの表で同じであれば
USINGで条件を短く書ける
商品IDが同じ⾏を探して結合
Q5: 直積再び
Q. populationテーブルとactivityテーブルを列
「地域コード」が等しいという条件で内部
結合を⾏うSQL⽂をINNER JOINを⽤いず,
直積演算を⽤いて書け.
SELECT
*
FROM
population, activity
WHERE
population.地域コード
= activity.地域コード;
A.
Slide 42
Slide 42 text
直積に対する絞り込み vs. 内部結合
SELECT
*
FROM
university_student_population_top10 AS u,
activity AS a
WHERE
u.都道府県 = a.都道府県;
直積の場合
直積集合をすべて生成した後,WHERE句で絞り込む
①ここで直積集合を作った後
②直積集合から該当レコードを絞り込む
Slide 43
Slide 43 text
直積に対する絞り込み vs. 内部結合
SELECT
*
FROM
university_student_population_top10 AS u,
INNER JOIN u USING (都道府県);
内部結合の場合
結合条件を満たす組み合わせのみを抽出し表示
内部的には直積を計算していない
Slide 44
Slide 44 text
JOINとWHEREの評価順序
SELECT
university_student_population_top10.*,
activity.学習・⾃⼰啓発・訓練 AS 学習・⾃⼰鍛錬
FROM
university_student_population_top10 AS u
INNER JOIN
activity
ON
u.都道府県 = activity.都道府県
WHERE
u.総⼈⼝ >= 7000000;
①まず内部結合
②FROM句の内容を条件で絞り込む
Slide 45
Slide 45 text
外部結合(OUTER JOIN)
日時 顧客ID 商品ID 個数
2019/1/1 い A 2
2019/1/1 い B 3
2022/3/7 に D 8
購買履歴
商品ID 商品名 単価
A 伊左衛門 130
B 午前の紅茶 150
C おいしい牛乳 250
商品
指定した列が指定条件を満たす表の行を結合
(条件を満たさない時,結合される側の⾏に空値で結合する)
日時 顧客ID 商品ID 個数 商品名 単価
2019/1/1 い A 2 伊左衛門 130
2019/1/1 い B 3 午前の紅茶 150
2022/3/7 に D 8
商品IDが同じ⾏を探して結合
Slide 46
Slide 46 text
外部結合(OUTER JOIN)
日時 顧客ID 商品ID 個数
2019/1/1 い A 2
2019/1/1 い B 3
2022/3/7 に D 8
購買履歴
商品ID 商品名 単価
A 伊左衛門 130
B 午前の紅茶 150
C おいしい牛乳 250
商品
指定した列が指定条件を満たす表の行を結合
(条件を満たさない時,結合される側の⾏に空値で結合する)
日時 顧客ID 商品ID 個数 商品名 単価
2019/1/1 い A 2 伊左衛門 130
2019/1/1 い B 3 午前の紅茶 150
2022/3/7 に D 8
商品IDが同じ⾏を探して結合
NULL値
Slide 47
Slide 47 text
左外部結合(LEFT OUTER JOIN)
SELECT 購買履歴.*, 商品.*
FROM 購買履歴
LEFT OUTER JOIN 商品 ON 購買履歴.商品ID = 商品.商品ID;
結合条件
日時 顧客ID 商品ID 個数
2019/1/1 い A 2
2019/1/1 い B 3
2022/3/7 に D 8
購買履歴
商品ID 商品名 単価
A 伊左衛門 130
B 午前の紅茶 150
C おいしい牛乳 250
商品
商品IDが同じ⾏を探して結合
日時 顧客ID 商品ID 個数 商品名 単価
2019/1/1 い A 2 伊左衛門 130
2019/1/1 い B 3 午前の紅茶 150
2022/3/7 に D 8 NULL値
Q7: 左外部結合
Q. populationテーブルとactivityテーブルを
列「地域コード」が等しいという条件で
左外部結合を⾏うSQL⽂を書け.
SELECT
*
FROM
population
LEFT OUTER JOIN activity
USING (地域コード);
A.
Slide 50
Slide 50 text
右外部結合(RIGHT OUTER JOIN)
SELECT 購買履歴.*, 商品.*
FROM 購買履歴
RIHGT OUTER JOIN 商品 ON 購買履歴.商品ID = 商品.商品ID;
日時 顧客ID 商品ID 個数
2019/1/1 い A 2
2019/1/1 い B 3
2022/3/7 に D 8
購買履歴
商品ID 商品名 単価
A 伊左衛門 130
B 午前の紅茶 150
C おいしい牛乳 250
商品
商品IDが同じ⾏を探して結合
日時 顧客ID 個数 商品ID 商品名 単価
2019/1/1 い 2 A 伊左衛門 130
2019/1/1 い 3 B 午前の紅茶 150
C おいしい牛乳 250
NULL値
Slide 51
Slide 51 text
外部結合の例
SELECT
university_student_population_top10.*,
activity.学習・⾃⼰啓発・訓練 AS 学習・⾃⼰鍛錬
FROM
university_student_population_top10 AS u
LEFT OUTER JOIN
activity
ON
u.都道府県 = activity.都道府県;
左外部結合
外部結合は条件を満たさなかったレコードを⾒つけることが可能