SlideShare a Scribd company logo
データベース
第5回
SQL(SELECT:結合,副問合せ)
1
2015年5⽉7⽇(⽊) 7・8時限
担当:奥 健太
SQL編
回 ⽇付 テーマ
2 4/16 SQL概要
3 4/23 SQL(CREATE, INSERT, DELETE, UPDATEなど)
4 4/30 SQL(SELECT:基本)
5 5/7 SQL(SELECT:結合,副問合せ)
6 5/14 SQL(VIEW, ALTER, GRANTなど)
7 5/21 SQL復習,中間試験(SQL)
2
SQLの主なコマンド⼀覧(2/2)
3
種類 コマンド 説明
DML
INSERT テーブルにデータを登録
DELETE テーブルからデータを削除
UPDATE テーブル内のデータを更新
SELECT テーブル内からデータを検索して
取り出す
DCL
COMMIT 正常終了を通知
ROLLBACK 異常終了を通知
GRANT 権限を与える
REVOKE 権限を取り下げる
本⽇の講義で学ぶこと
4
複数のテーブルへの問合せ
⼩説家テーブル
5
writer
writer_id name age
1東野圭吾 57
2宮部みゆき 54
3村上春樹 66
id name
1001新潮社
1002講談社
1003⽂藝春秋
1004集英社
1005岩波書店
publisher
novel_id title writer_id pub_id year
101秘密 1 1003 2001
102⽩夜⾏ 1 1004 2002
103容疑者Xの献⾝ 1 1003 2008
104模倣犯 2 1001 2005
105⽕⾞ 2 1001 1998
1061Q84 3 1001 2009
107⾵の歌を聴け 3 1002 2004
108海辺のカフカ 3 1001 2002
109ノルウェイの森 3 1002 1987
110使命と魂のリミット 1 1006 2010
novel
*manaba+R上の"writer.sql"内のSQL⽂を実⾏することで復元できる
結合
6
集約関数 説明
交差結合 ⼆つのテーブルの直積(全組合せ)
を求める
⾃然結合 ⼆つのテーブルで同名のカラムで結
合を⾏う
等結合
(内部結合)
⼆つのテーブルで条件に合致するも
ののみを結合
左(右,完全)
外部結合
左(右)側のテーブルに対応する
データがない場合は,NULL値をセッ
トして結合する
⾃⼰結合 ⾃分⾃⾝のテーブルで結合を⾏う
SELECT * FROM writer CROSS JOIN publisher;
交差結合
7
writer
writer_id name age
1東野圭吾 57
2宮部みゆき 54
3村上春樹 66
id name
1001新潮社
1002講談社
1003⽂藝春秋
1004集英社
1005岩波書店
publisher
writer_id name age id name
1東野圭吾 57 1001新潮社
2宮部みゆき 54 1001新潮社
3村上春樹 66 1001新潮社
1東野圭吾 57 1002講談社
2宮部みゆき 54 1002講談社
3村上春樹 66 1002講談社
1東野圭吾 57 1003⽂藝春秋
... ... ... ... ...
⼆つのテーブルの直積(全組合せ)を求める
SELECT * FROM writer, publisher;
SELECT * FROM writer NATURAL JOIN novel;
⾃然結合
8
writer
writer_id name age
1東野圭吾 57
2宮部みゆき 54
3村上春樹 66
writer_id name age novel_id title pub_id year
1東野圭吾 57 101秘密 1 1003
1東野圭吾 57 102⽩夜⾏ 1 1004
1東野圭吾 57 103容疑者Xの献⾝ 1 1003
2宮部みゆき 54 104模倣犯 2 1001
... ... ... ... ... ... ...
novel
_id
title writer
_id
pub_id year
101秘密 1 1003 2001
102⽩夜⾏ 1 1004 2002
103容疑者Xの献⾝ 1 1003 2008
104模倣犯 2 1001 2005
...... ... ... ...
novel
⼆つのテーブルで同名のカラムで結合を⾏う
SELECT * FROM novel JOIN publisher
ON novel.pub_id = publisher.id;
等結合
9
novel_id title writer_id pub_id year id name
101秘密 1 1003 2001 1003⽂藝春秋
102⽩夜⾏ 1 1004 2002 1004集英社
103容疑者Xの献⾝ 1 1003 2008 1003⽂藝春秋
104模倣犯 2 1001 2005 1001新潮社
... ... ... ... ... ... ...
novel
_id
title writer
_id
pub_id year
101秘密 1 1003 2001
102⽩夜⾏ 1 1004 2002
103容疑者Xの献⾝ 1 1003 2008
104模倣犯 2 1001 2005
...... ... ... ...
novel
id name
1001新潮社
1002講談社
1003⽂藝春秋
1004集英社
1005岩波書店
publisher
⼆つのテーブルで条件に合致するもののみを結合
SELECT * FROM novel LEFT OUTER JOIN publisher
ON novel.pub_id = publisher.id;
左外部結合
10
novel_id title writer_id pub_id year id name
101秘密 1 1003 2001 1003⽂藝春秋
102⽩夜⾏ 1 1004 2002 1004集英社
103容疑者Xの献⾝ 1 1003 2008 1003⽂藝春秋
104模倣犯 2 1001 2005 1001新潮社
... ... ... ... ... ... ...
110使命と魂のリミット 1 1006 2010 NULL NULL
novel
_id
title writer
_id
pub_id year
101秘密 1 1003 2001
102⽩夜⾏ 1 1004 2002
103容疑者Xの献⾝ 1 1003 2008
104模倣犯 2 1001 2005
...... ... ... ...
novel
id name
1001新潮社
1002講談社
1003⽂藝春秋
1004集英社
1005岩波書店
publisher
左側のテーブルに対応するデータがない場合は,
NULL値をセットして結合する
SELECT * FROM novel RIGHT OUTER JOIN publisher
ON novel.pub_id = publisher.id;
右外部結合
11
novel_id title writer_id pub_id year id name
101秘密 1 1003 2001 1003⽂藝春秋
102⽩夜⾏ 1 1004 2002 1004集英社
103容疑者Xの献⾝ 1 1003 2008 1003⽂藝春秋
104模倣犯 2 1001 2005 1001新潮社
... ... ... ... ... ... ...
NULLNULL NULL NULL NULL 1005岩波書店
novel
_id
title writer
_id
pub_id year
101秘密 1 1003 2001
102⽩夜⾏ 1 1004 2002
103容疑者Xの献⾝ 1 1003 2008
104模倣犯 2 1001 2005
...... ... ... ...
novel
id name
1001新潮社
1002講談社
1003⽂藝春秋
1004集英社
1005岩波書店
publisher
右側のテーブルに対応するデータがない場合は,
NULL値をセットして結合する
SELECT * FROM novel FULL OUTER JOIN publisher
ON novel.pub_id = publisher.id;
完全外部結合
12
novel_id title writer_id pub_id year id name
101秘密 1 1003 2001 1003⽂藝春秋
102⽩夜⾏ 1 1004 2002 1004集英社
103容疑者Xの献⾝ 1 1003 2008 1003⽂藝春秋
104模倣犯 2 1001 2005 1001新潮社
... ... ... ... ... ... ...
110使命と魂のリミット 1 1006 2010 NULL NULL
NULLNULL NULL NULL NULL 1005岩波書店
novel
_id
title writer
_id
pub_id year
101秘密 1 1003 2001
102⽩夜⾏ 1 1004 2002
103容疑者Xの献⾝ 1 1003 2008
104模倣犯 2 1001 2005
...... ... ... ...
novel
id name
1001新潮社
1002講談社
1003⽂藝春秋
1004集英社
1005岩波書店
publisher
MySQLではサポート外
左側のテーブルを基準として結合
さらに,右側のテーブルを基準として結合
内部結合と外部結合
13
SELECT * FROM t1 CROSS JOIN t2;
c1 c2
a 1
b 1
c 2
d 4
t1
c3 c4
1 x
2 y
3 z
t2
c1 c2 c3 c4
a 1 1 x
a 1 2 y
a 1 3 z
b 1 1 x
b 1 2 y
b 1 3 z
c 2 1 x
c 2 2 y
c 2 3 z
d 4 1 x
d 4 2 y
d 4 3 z
交差結合
SELECT * FROM t1 JOIN t2 ON t1.c2 = t2.c3;
SELECT * FROM t1 LEFT OUTER JOIN t2 ON t1.c2=t2.c3;
SELECT * FROM t1 RIGHT OUTER JOIN t2 ON t1.c2=t2.c3;
c1 c2 c3 c4
a 1 1 x
b 1 1 x
c 2 2 y
等結合=内部結合
c1 c2 c3 c4
a 1 1 x
b 1 1 x
c 2 2 y
d 4 NULL NULL
左外部結合
c1 c2 c3 c4
a 1 1 x
b 1 1 x
c 2 2 y
NULL NULL 3 z
右外部結合
内部結合と外部結合(つづき)
 内部結合
 結合結果が,交差結合結果の部分集合(内部)になる
 外部結合
 結合結果が,交差結合結果の部分集合に納まらない
(外部にはみ出す)
交差結合
外部結合
(a,1,2,y)
(a,1,3,z)
(b,1,2,y)
(b,1,3,z)
(c,2,1,x)
内部結合
(a,1,1,x)
(b,1,1,x)
(c,2,2,y)
(c,2,3,z)
(d,4,1,x)
(d,4,2,y)
(d,4,3,z)
(d,4,NULL,NULL)
(NULL,NULL,3,z)
SELECT * FROM novel JOIN publisher
ON novel.pub_id = publisher.id;
等結合と内部結合
15
SELECT * FROM novel, publisher
WHERE novel.pub_id = publisher.id;
等価
SELECT * FROM novel INNER JOIN publisher
ON novel.pub_id = publisher.id;
等価
 実は,⼆つのテーブルの交差結合から条件に合致する
データを選択していることになる
writer w2
writer_id name age
1東野圭吾 57
2宮部みゆき 54
3村上春樹 66
SELECT w1.name AS name1, w1.age AS age1,
w2.name AS name2, w2.age AS age2
FROM writer w1 JOIN writer w2 WHERE w1.age > w2.age;
⾃⼰結合
16
writer w1
writer_id name age
1東野圭吾 57
2宮部みゆき 54
3村上春樹 66
name1 age1 name2 age2
村上春樹 66 東野圭吾 57
東野圭吾 57 宮部みゆき 54
村上春樹 66 宮部みゆき 54
⾃分⾃⾝のテーブルで結合を⾏う
カラムの別名指定
副問合せ
17
 テーブル副問合せ
 副問合せの結果がテーブルの形になる
 スカラ副問合せ
 副問合せの結果がスカラ(1⾏1列)になる
SELECT⽂内に複数の基本的なSELECT⽂を階層的
に(⼊れ⼦型に)組み合わせた問合せ
テーブル副問合せ
(IN句,ANY(SOME)句,ALL句)
18
SELECT
name
FROM
writer
WHERE
writer_id IN
(
SELECT
writer_id
FROM
novel
WHERE
year >= 2008
);
"=ANY", "=SOME"でも良い
"<=ALL", "<=ANY"とすると…?
writer_id
1
3
1
name
東野圭吾
村上春樹
テーブル副問合せ
(FROM句の副問合せ)
19
SELECT
avg(c)
FROM
(
SELECT
count(*) AS c
FROM
novel
GROUP BY writer_id
)
AS t1;
c
4
2
4
avg(c)
3.3333
SELECT
name
FROM
publisher
WHERE
NOT EXISTS
(
SELECT
*
FROM
novel
WHERE
pub_id = publisher.id
);
テーブル副問合せ
(EXSISTS句,NOT EXISITS句)
20
name
岩波書店
id name
1001新潮社
1002講談社
1003⽂藝春秋
1004集英社
1005岩波書店
novelテーブルに
EXISTS
EXISTS
EXISTS
EXISTS
NOT EXISTS
SELECT * FROM novel WHERE pub_id = 1005;
Empty set
スカラ副問合せ
(WHERE句の副問合せ)
21
SELECT
name
FROM
writer
WHERE
age <
(
SELECT
avg(age)
FROM
writer
);
avg(age)
59.000
name
東野圭吾
宮部みゆき
スカラ副問合せ
(HAVING句の副問合せ)
22
SELECT name, count(*)
FROM novel, publisher
WHERE id = pub_id
GROUP BY pub_id
HAVING
count(*) >=
(SELECT
avg(c)
FROM
(SELECT
count(*) AS c
FROM
novel
GROUP BY pub_id)
AS t1);
avg(c)
2.000
name count(*)
新潮社 4
講談社 2
⽂藝春秋 2
まとめ
23
複数のテーブルへの問合せ
まとめ
24
複数のテーブルへの問合せ
交差結合 ⾃然結合 内部結合
左外部結合 右外部結合 完全外部結合
⾃⼰結合
テーブル副問合せ
スカラ副問合せ
本⽇学習したキーワード
〜SQL編〜
25
MySQL スクリプトファイル
NOT-NULL制約 静的SQL
SQL 制約
⼀意性制約 対話的DB操作
外部キー制約 ダンプファイル
外部キー データ制御⾔語(DCL)
仮想テーブル データ操作⾔語(DML)
カラム(列) データ定義⾔語(DDL)
関係代数 データベース
関係データベース管理システム(RDBMS) テーブル(表)
関係データモデル テーブル副問合せ
完全外部結合 問合せ(クエリ)
交差結合 等結合
参照整合性制約 動的SQL
⾃⼰結合 内部結合
⾃然結合 左外部結合
集約関数 ビュー
主キー 副問合せ
主キー制約 右外部結合
スカラ副問合せ ロウ(⾏)
これまでに学習したキーワード
〜SQL編〜
26
MySQL スクリプトファイル
NOT-NULL制約 静的SQL
SQL 制約
⼀意性制約 対話的DB操作
外部キー制約 ダンプファイル
外部キー データ制御⾔語(DCL)
仮想テーブル データ操作⾔語(DML)
カラム(列) データ定義⾔語(DDL)
関係代数 データベース
関係データベース管理システム(RDBMS) テーブル(表)
関係データモデル テーブル副問合せ
完全外部結合 問合せ(クエリ)
交差結合 等結合
参照整合性制約 動的SQL
⾃⼰結合 内部結合
⾃然結合 左外部結合
集約関数 ビュー
主キー 副問合せ
主キー制約 右外部結合
スカラ副問合せ ロウ(⾏)
本⽇学習したSQLキーワード
27
ALL DROP TABLE ORDER BY
ALTER TABLE ... ADD DROP USER PRIMARY KEY
ALTER TABLE ... CHANGE EXISTS REFERENCES
ALTER TABLE ... DROP FOREIGN KEY REVOKE
ALTER TABLE ... MODIFY FULL OUTER JOIN RIGHT OUTER JOIN
ALTER TABLE ... RENAME AS GRANT SELECT
ANY GROUP BY SHOW COLUMNS FROM
AS HAVING SHOW DATABASES
ASC IN SHOW TABLES
avg INNER JOIN SOME
BETWEEN INSERT INTO sum
count JOIN UNIQUE
CREATE DATABASE LEFT OUTER JOIN UPDATE
CREATE TABLE LIKE USE
CREATE VIEW LIMIT WHERE
CROSS JOIN max
DELETE FROM min
DESC NATURAL JOIN
DISTINCT NOT EXISTS
DROP DATABASE NOT NULL
これまでに学習したSQLキーワード
28
ALL DROP TABLE ORDER BY
ALTER TABLE ... ADD DROP USER PRIMARY KEY
ALTER TABLE ... CHANGE EXISTS REFERENCES
ALTER TABLE ... DROP FOREIGN KEY REVOKE
ALTER TABLE ... MODIFY FULL OUTER JOIN RIGHT OUTER JOIN
ALTER TABLE ... RENAME AS GRANT SELECT
ANY GROUP BY SHOW COLUMNS FROM
AS HAVING SHOW DATABASES
ASC IN SHOW TABLES
avg INNER JOIN SOME
BETWEEN INSERT INTO sum
count JOIN UNIQUE
CREATE DATABASE LEFT OUTER JOIN UPDATE
CREATE TABLE LIKE USE
CREATE VIEW LIMIT WHERE
CROSS JOIN max
DELETE FROM min
DESC NATURAL JOIN
DISTINCT NOT EXISTS
DROP DATABASE NOT NULL

More Related Content

What's hot

基本情報技術者試験 勉強会
基本情報技術者試験 勉強会基本情報技術者試験 勉強会
基本情報技術者試験 勉強会
Yusuke Furuta
 
データベース14 - データベース構造とインデックス
データベース14 - データベース構造とインデックスデータベース14 - データベース構造とインデックス
データベース14 - データベース構造とインデックス
Kenta Oku
 
SIGIR2011読み会 3. Learning to Rank
SIGIR2011読み会 3. Learning to RankSIGIR2011読み会 3. Learning to Rank
SIGIR2011読み会 3. Learning to Rank
sleepy_yoshi
 
14 データ収集とバイアス
14 データ収集とバイアス14 データ収集とバイアス
14 データ収集とバイアス
Seiichi Uchida
 
リクルートのビッグデータ活用基盤とデータ活用に向けた取組み
リクルートのビッグデータ活用基盤とデータ活用に向けた取組みリクルートのビッグデータ活用基盤とデータ活用に向けた取組み
リクルートのビッグデータ活用基盤とデータ活用に向けた取組み
Recruit Technologies
 
Data platformdesign
Data platformdesignData platformdesign
Data platformdesign
Ryoma Nagata
 
MLflowによる機械学習モデルのライフサイクルの管理
MLflowによる機械学習モデルのライフサイクルの管理MLflowによる機械学習モデルのライフサイクルの管理
MLflowによる機械学習モデルのライフサイクルの管理
Takeshi Yamamuro
 
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
Google Cloud Platform - Japan
 
DataDrift in Azure Machine Learning
DataDrift in Azure Machine LearningDataDrift in Azure Machine Learning
DataDrift in Azure Machine Learning
Keita Onabuta
 
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
Nobukazu Yoshioka
 
データベース10 - 正規化
データベース10 - 正規化データベース10 - 正規化
データベース10 - 正規化
Kenta Oku
 
SIGMOD 2019 参加報告
SIGMOD 2019 参加報告SIGMOD 2019 参加報告
SIGMOD 2019 参加報告
Masafumi Oyamada
 
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~Ryota Watabe
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
モデルベース要件定義 at BPStudy
モデルベース要件定義 at BPStudyモデルベース要件定義 at BPStudy
モデルベース要件定義 at BPStudy
Zenji Kanzaki
 
ビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年versionビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年version
Tetsutaro Watanabe
 
機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話
Ryota Kamoshida
 
データベース技術の羅針盤
データベース技術の羅針盤データベース技術の羅針盤
データベース技術の羅針盤Yoshinori Matsunobu
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
データベース12 - トランザクションと同時実行制御
データベース12 - トランザクションと同時実行制御データベース12 - トランザクションと同時実行制御
データベース12 - トランザクションと同時実行制御
Kenta Oku
 

What's hot (20)

基本情報技術者試験 勉強会
基本情報技術者試験 勉強会基本情報技術者試験 勉強会
基本情報技術者試験 勉強会
 
データベース14 - データベース構造とインデックス
データベース14 - データベース構造とインデックスデータベース14 - データベース構造とインデックス
データベース14 - データベース構造とインデックス
 
SIGIR2011読み会 3. Learning to Rank
SIGIR2011読み会 3. Learning to RankSIGIR2011読み会 3. Learning to Rank
SIGIR2011読み会 3. Learning to Rank
 
14 データ収集とバイアス
14 データ収集とバイアス14 データ収集とバイアス
14 データ収集とバイアス
 
リクルートのビッグデータ活用基盤とデータ活用に向けた取組み
リクルートのビッグデータ活用基盤とデータ活用に向けた取組みリクルートのビッグデータ活用基盤とデータ活用に向けた取組み
リクルートのビッグデータ活用基盤とデータ活用に向けた取組み
 
Data platformdesign
Data platformdesignData platformdesign
Data platformdesign
 
MLflowによる機械学習モデルのライフサイクルの管理
MLflowによる機械学習モデルのライフサイクルの管理MLflowによる機械学習モデルのライフサイクルの管理
MLflowによる機械学習モデルのライフサイクルの管理
 
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
[Cloud OnAir] Apigee でかんたん API 管理 2019年12月12日 放送
 
DataDrift in Azure Machine Learning
DataDrift in Azure Machine LearningDataDrift in Azure Machine Learning
DataDrift in Azure Machine Learning
 
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
 
データベース10 - 正規化
データベース10 - 正規化データベース10 - 正規化
データベース10 - 正規化
 
SIGMOD 2019 参加報告
SIGMOD 2019 参加報告SIGMOD 2019 参加報告
SIGMOD 2019 参加報告
 
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
モデルベース要件定義 at BPStudy
モデルベース要件定義 at BPStudyモデルベース要件定義 at BPStudy
モデルベース要件定義 at BPStudy
 
ビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年versionビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年version
 
機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話
 
データベース技術の羅針盤
データベース技術の羅針盤データベース技術の羅針盤
データベース技術の羅針盤
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
データベース12 - トランザクションと同時実行制御
データベース12 - トランザクションと同時実行制御データベース12 - トランザクションと同時実行制御
データベース12 - トランザクションと同時実行制御
 

データベース05 - SQL(SELECT:結合,副問合せ)

  • 2. SQL編 回 ⽇付 テーマ 2 4/16 SQL概要 3 4/23 SQL(CREATE, INSERT, DELETE, UPDATEなど) 4 4/30 SQL(SELECT:基本) 5 5/7 SQL(SELECT:結合,副問合せ) 6 5/14 SQL(VIEW, ALTER, GRANTなど) 7 5/21 SQL復習,中間試験(SQL) 2
  • 3. SQLの主なコマンド⼀覧(2/2) 3 種類 コマンド 説明 DML INSERT テーブルにデータを登録 DELETE テーブルからデータを削除 UPDATE テーブル内のデータを更新 SELECT テーブル内からデータを検索して 取り出す DCL COMMIT 正常終了を通知 ROLLBACK 異常終了を通知 GRANT 権限を与える REVOKE 権限を取り下げる
  • 5. ⼩説家テーブル 5 writer writer_id name age 1東野圭吾 57 2宮部みゆき 54 3村上春樹 66 id name 1001新潮社 1002講談社 1003⽂藝春秋 1004集英社 1005岩波書店 publisher novel_id title writer_id pub_id year 101秘密 1 1003 2001 102⽩夜⾏ 1 1004 2002 103容疑者Xの献⾝ 1 1003 2008 104模倣犯 2 1001 2005 105⽕⾞ 2 1001 1998 1061Q84 3 1001 2009 107⾵の歌を聴け 3 1002 2004 108海辺のカフカ 3 1001 2002 109ノルウェイの森 3 1002 1987 110使命と魂のリミット 1 1006 2010 novel *manaba+R上の"writer.sql"内のSQL⽂を実⾏することで復元できる
  • 6. 結合 6 集約関数 説明 交差結合 ⼆つのテーブルの直積(全組合せ) を求める ⾃然結合 ⼆つのテーブルで同名のカラムで結 合を⾏う 等結合 (内部結合) ⼆つのテーブルで条件に合致するも ののみを結合 左(右,完全) 外部結合 左(右)側のテーブルに対応する データがない場合は,NULL値をセッ トして結合する ⾃⼰結合 ⾃分⾃⾝のテーブルで結合を⾏う
  • 7. SELECT * FROM writer CROSS JOIN publisher; 交差結合 7 writer writer_id name age 1東野圭吾 57 2宮部みゆき 54 3村上春樹 66 id name 1001新潮社 1002講談社 1003⽂藝春秋 1004集英社 1005岩波書店 publisher writer_id name age id name 1東野圭吾 57 1001新潮社 2宮部みゆき 54 1001新潮社 3村上春樹 66 1001新潮社 1東野圭吾 57 1002講談社 2宮部みゆき 54 1002講談社 3村上春樹 66 1002講談社 1東野圭吾 57 1003⽂藝春秋 ... ... ... ... ... ⼆つのテーブルの直積(全組合せ)を求める SELECT * FROM writer, publisher;
  • 8. SELECT * FROM writer NATURAL JOIN novel; ⾃然結合 8 writer writer_id name age 1東野圭吾 57 2宮部みゆき 54 3村上春樹 66 writer_id name age novel_id title pub_id year 1東野圭吾 57 101秘密 1 1003 1東野圭吾 57 102⽩夜⾏ 1 1004 1東野圭吾 57 103容疑者Xの献⾝ 1 1003 2宮部みゆき 54 104模倣犯 2 1001 ... ... ... ... ... ... ... novel _id title writer _id pub_id year 101秘密 1 1003 2001 102⽩夜⾏ 1 1004 2002 103容疑者Xの献⾝ 1 1003 2008 104模倣犯 2 1001 2005 ...... ... ... ... novel ⼆つのテーブルで同名のカラムで結合を⾏う
  • 9. SELECT * FROM novel JOIN publisher ON novel.pub_id = publisher.id; 等結合 9 novel_id title writer_id pub_id year id name 101秘密 1 1003 2001 1003⽂藝春秋 102⽩夜⾏ 1 1004 2002 1004集英社 103容疑者Xの献⾝ 1 1003 2008 1003⽂藝春秋 104模倣犯 2 1001 2005 1001新潮社 ... ... ... ... ... ... ... novel _id title writer _id pub_id year 101秘密 1 1003 2001 102⽩夜⾏ 1 1004 2002 103容疑者Xの献⾝ 1 1003 2008 104模倣犯 2 1001 2005 ...... ... ... ... novel id name 1001新潮社 1002講談社 1003⽂藝春秋 1004集英社 1005岩波書店 publisher ⼆つのテーブルで条件に合致するもののみを結合
  • 10. SELECT * FROM novel LEFT OUTER JOIN publisher ON novel.pub_id = publisher.id; 左外部結合 10 novel_id title writer_id pub_id year id name 101秘密 1 1003 2001 1003⽂藝春秋 102⽩夜⾏ 1 1004 2002 1004集英社 103容疑者Xの献⾝ 1 1003 2008 1003⽂藝春秋 104模倣犯 2 1001 2005 1001新潮社 ... ... ... ... ... ... ... 110使命と魂のリミット 1 1006 2010 NULL NULL novel _id title writer _id pub_id year 101秘密 1 1003 2001 102⽩夜⾏ 1 1004 2002 103容疑者Xの献⾝ 1 1003 2008 104模倣犯 2 1001 2005 ...... ... ... ... novel id name 1001新潮社 1002講談社 1003⽂藝春秋 1004集英社 1005岩波書店 publisher 左側のテーブルに対応するデータがない場合は, NULL値をセットして結合する
  • 11. SELECT * FROM novel RIGHT OUTER JOIN publisher ON novel.pub_id = publisher.id; 右外部結合 11 novel_id title writer_id pub_id year id name 101秘密 1 1003 2001 1003⽂藝春秋 102⽩夜⾏ 1 1004 2002 1004集英社 103容疑者Xの献⾝ 1 1003 2008 1003⽂藝春秋 104模倣犯 2 1001 2005 1001新潮社 ... ... ... ... ... ... ... NULLNULL NULL NULL NULL 1005岩波書店 novel _id title writer _id pub_id year 101秘密 1 1003 2001 102⽩夜⾏ 1 1004 2002 103容疑者Xの献⾝ 1 1003 2008 104模倣犯 2 1001 2005 ...... ... ... ... novel id name 1001新潮社 1002講談社 1003⽂藝春秋 1004集英社 1005岩波書店 publisher 右側のテーブルに対応するデータがない場合は, NULL値をセットして結合する
  • 12. SELECT * FROM novel FULL OUTER JOIN publisher ON novel.pub_id = publisher.id; 完全外部結合 12 novel_id title writer_id pub_id year id name 101秘密 1 1003 2001 1003⽂藝春秋 102⽩夜⾏ 1 1004 2002 1004集英社 103容疑者Xの献⾝ 1 1003 2008 1003⽂藝春秋 104模倣犯 2 1001 2005 1001新潮社 ... ... ... ... ... ... ... 110使命と魂のリミット 1 1006 2010 NULL NULL NULLNULL NULL NULL NULL 1005岩波書店 novel _id title writer _id pub_id year 101秘密 1 1003 2001 102⽩夜⾏ 1 1004 2002 103容疑者Xの献⾝ 1 1003 2008 104模倣犯 2 1001 2005 ...... ... ... ... novel id name 1001新潮社 1002講談社 1003⽂藝春秋 1004集英社 1005岩波書店 publisher MySQLではサポート外 左側のテーブルを基準として結合 さらに,右側のテーブルを基準として結合
  • 13. 内部結合と外部結合 13 SELECT * FROM t1 CROSS JOIN t2; c1 c2 a 1 b 1 c 2 d 4 t1 c3 c4 1 x 2 y 3 z t2 c1 c2 c3 c4 a 1 1 x a 1 2 y a 1 3 z b 1 1 x b 1 2 y b 1 3 z c 2 1 x c 2 2 y c 2 3 z d 4 1 x d 4 2 y d 4 3 z 交差結合 SELECT * FROM t1 JOIN t2 ON t1.c2 = t2.c3; SELECT * FROM t1 LEFT OUTER JOIN t2 ON t1.c2=t2.c3; SELECT * FROM t1 RIGHT OUTER JOIN t2 ON t1.c2=t2.c3; c1 c2 c3 c4 a 1 1 x b 1 1 x c 2 2 y 等結合=内部結合 c1 c2 c3 c4 a 1 1 x b 1 1 x c 2 2 y d 4 NULL NULL 左外部結合 c1 c2 c3 c4 a 1 1 x b 1 1 x c 2 2 y NULL NULL 3 z 右外部結合
  • 14. 内部結合と外部結合(つづき)  内部結合  結合結果が,交差結合結果の部分集合(内部)になる  外部結合  結合結果が,交差結合結果の部分集合に納まらない (外部にはみ出す) 交差結合 外部結合 (a,1,2,y) (a,1,3,z) (b,1,2,y) (b,1,3,z) (c,2,1,x) 内部結合 (a,1,1,x) (b,1,1,x) (c,2,2,y) (c,2,3,z) (d,4,1,x) (d,4,2,y) (d,4,3,z) (d,4,NULL,NULL) (NULL,NULL,3,z)
  • 15. SELECT * FROM novel JOIN publisher ON novel.pub_id = publisher.id; 等結合と内部結合 15 SELECT * FROM novel, publisher WHERE novel.pub_id = publisher.id; 等価 SELECT * FROM novel INNER JOIN publisher ON novel.pub_id = publisher.id; 等価  実は,⼆つのテーブルの交差結合から条件に合致する データを選択していることになる
  • 16. writer w2 writer_id name age 1東野圭吾 57 2宮部みゆき 54 3村上春樹 66 SELECT w1.name AS name1, w1.age AS age1, w2.name AS name2, w2.age AS age2 FROM writer w1 JOIN writer w2 WHERE w1.age > w2.age; ⾃⼰結合 16 writer w1 writer_id name age 1東野圭吾 57 2宮部みゆき 54 3村上春樹 66 name1 age1 name2 age2 村上春樹 66 東野圭吾 57 東野圭吾 57 宮部みゆき 54 村上春樹 66 宮部みゆき 54 ⾃分⾃⾝のテーブルで結合を⾏う カラムの別名指定
  • 17. 副問合せ 17  テーブル副問合せ  副問合せの結果がテーブルの形になる  スカラ副問合せ  副問合せの結果がスカラ(1⾏1列)になる SELECT⽂内に複数の基本的なSELECT⽂を階層的 に(⼊れ⼦型に)組み合わせた問合せ
  • 18. テーブル副問合せ (IN句,ANY(SOME)句,ALL句) 18 SELECT name FROM writer WHERE writer_id IN ( SELECT writer_id FROM novel WHERE year >= 2008 ); "=ANY", "=SOME"でも良い "<=ALL", "<=ANY"とすると…? writer_id 1 3 1 name 東野圭吾 村上春樹
  • 20. SELECT name FROM publisher WHERE NOT EXISTS ( SELECT * FROM novel WHERE pub_id = publisher.id ); テーブル副問合せ (EXSISTS句,NOT EXISITS句) 20 name 岩波書店 id name 1001新潮社 1002講談社 1003⽂藝春秋 1004集英社 1005岩波書店 novelテーブルに EXISTS EXISTS EXISTS EXISTS NOT EXISTS SELECT * FROM novel WHERE pub_id = 1005; Empty set
  • 22. スカラ副問合せ (HAVING句の副問合せ) 22 SELECT name, count(*) FROM novel, publisher WHERE id = pub_id GROUP BY pub_id HAVING count(*) >= (SELECT avg(c) FROM (SELECT count(*) AS c FROM novel GROUP BY pub_id) AS t1); avg(c) 2.000 name count(*) 新潮社 4 講談社 2 ⽂藝春秋 2
  • 24. まとめ 24 複数のテーブルへの問合せ 交差結合 ⾃然結合 内部結合 左外部結合 右外部結合 完全外部結合 ⾃⼰結合 テーブル副問合せ スカラ副問合せ
  • 25. 本⽇学習したキーワード 〜SQL編〜 25 MySQL スクリプトファイル NOT-NULL制約 静的SQL SQL 制約 ⼀意性制約 対話的DB操作 外部キー制約 ダンプファイル 外部キー データ制御⾔語(DCL) 仮想テーブル データ操作⾔語(DML) カラム(列) データ定義⾔語(DDL) 関係代数 データベース 関係データベース管理システム(RDBMS) テーブル(表) 関係データモデル テーブル副問合せ 完全外部結合 問合せ(クエリ) 交差結合 等結合 参照整合性制約 動的SQL ⾃⼰結合 内部結合 ⾃然結合 左外部結合 集約関数 ビュー 主キー 副問合せ 主キー制約 右外部結合 スカラ副問合せ ロウ(⾏)
  • 26. これまでに学習したキーワード 〜SQL編〜 26 MySQL スクリプトファイル NOT-NULL制約 静的SQL SQL 制約 ⼀意性制約 対話的DB操作 外部キー制約 ダンプファイル 外部キー データ制御⾔語(DCL) 仮想テーブル データ操作⾔語(DML) カラム(列) データ定義⾔語(DDL) 関係代数 データベース 関係データベース管理システム(RDBMS) テーブル(表) 関係データモデル テーブル副問合せ 完全外部結合 問合せ(クエリ) 交差結合 等結合 参照整合性制約 動的SQL ⾃⼰結合 内部結合 ⾃然結合 左外部結合 集約関数 ビュー 主キー 副問合せ 主キー制約 右外部結合 スカラ副問合せ ロウ(⾏)
  • 27. 本⽇学習したSQLキーワード 27 ALL DROP TABLE ORDER BY ALTER TABLE ... ADD DROP USER PRIMARY KEY ALTER TABLE ... CHANGE EXISTS REFERENCES ALTER TABLE ... DROP FOREIGN KEY REVOKE ALTER TABLE ... MODIFY FULL OUTER JOIN RIGHT OUTER JOIN ALTER TABLE ... RENAME AS GRANT SELECT ANY GROUP BY SHOW COLUMNS FROM AS HAVING SHOW DATABASES ASC IN SHOW TABLES avg INNER JOIN SOME BETWEEN INSERT INTO sum count JOIN UNIQUE CREATE DATABASE LEFT OUTER JOIN UPDATE CREATE TABLE LIKE USE CREATE VIEW LIMIT WHERE CROSS JOIN max DELETE FROM min DESC NATURAL JOIN DISTINCT NOT EXISTS DROP DATABASE NOT NULL
  • 28. これまでに学習したSQLキーワード 28 ALL DROP TABLE ORDER BY ALTER TABLE ... ADD DROP USER PRIMARY KEY ALTER TABLE ... CHANGE EXISTS REFERENCES ALTER TABLE ... DROP FOREIGN KEY REVOKE ALTER TABLE ... MODIFY FULL OUTER JOIN RIGHT OUTER JOIN ALTER TABLE ... RENAME AS GRANT SELECT ANY GROUP BY SHOW COLUMNS FROM AS HAVING SHOW DATABASES ASC IN SHOW TABLES avg INNER JOIN SOME BETWEEN INSERT INTO sum count JOIN UNIQUE CREATE DATABASE LEFT OUTER JOIN UPDATE CREATE TABLE LIKE USE CREATE VIEW LIMIT WHERE CROSS JOIN max DELETE FROM min DESC NATURAL JOIN DISTINCT NOT EXISTS DROP DATABASE NOT NULL