Download - データベース05 - SQL(SELECT:結合,副問合せ)
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 権限を取り下げる
⼩説家テーブル
5
writerwriter_id name age
1東野圭吾 572宮部みゆき 543村上春樹 66
id name1001新潮社1002講談社1003⽂藝春秋1004集英社1005岩波書店
publisher
novel_id title writer_id pub_id year101秘密 1 1003 2001102⽩夜⾏ 1 1004 2002103容疑者Xの献⾝ 1 1003 2008104模倣犯 2 1001 2005105⽕⾞ 2 1001 19981061Q84 3 1001 2009107⾵の歌を聴け 3 1002 2004108海辺のカフカ 3 1001 2002109ノルウェイの森 3 1002 1987110使命と魂のリミット 1 1006 2010
novel
*manaba+R上の"writer.sql"内のSQL⽂を実⾏することで復元できる
結合
6
集約関数 説明交差結合 ⼆つのテーブルの直積(全組合せ)
を求める⾃然結合 ⼆つのテーブルで同名のカラムで結
合を⾏う等結合(内部結合)
⼆つのテーブルで条件に合致するもののみを結合
左(右,完全)外部結合
左(右)側のテーブルに対応するデータがない場合は,NULL値をセットして結合する
⾃⼰結合 ⾃分⾃⾝のテーブルで結合を⾏う
SELECT * FROM writer CROSS JOIN publisher;
交差結合
7
writerwriter_id name age
1東野圭吾 572宮部みゆき 543村上春樹 66
id name1001新潮社1002講談社1003⽂藝春秋1004集英社1005岩波書店
publisher
writer_id name age id name1東野圭吾 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
writerwriter_id name age
1東野圭吾 572宮部みゆき 543村上春樹 66
writer_id name age novel_id title pub_id year1東野圭吾 57 101秘密 1 10031東野圭吾 57 102⽩夜⾏ 1 10041東野圭吾 57 103容疑者Xの献⾝ 1 10032宮部みゆき 54 104模倣犯 2 1001
... ... ... ... ... ... ...
novel_id
title writer_id
pub_id year
101秘密 1 1003 2001102⽩夜⾏ 1 1004 2002103容疑者Xの献⾝ 1 1003 2008104模倣犯 2 1001 2005
...... ... ... ...
novel
⼆つのテーブルで同名のカラムで結合を⾏う
SELECT * FROM novel JOIN publisherON novel.pub_id = publisher.id;
等結合
9
novel_id title writer_id pub_id year id name101秘密 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 2001102⽩夜⾏ 1 1004 2002103容疑者Xの献⾝ 1 1003 2008104模倣犯 2 1001 2005
...... ... ... ...
novelid name
1001新潮社1002講談社1003⽂藝春秋1004集英社1005岩波書店
publisher
⼆つのテーブルで条件に合致するもののみを結合
SELECT * FROM novel LEFT OUTER JOIN publisherON novel.pub_id = publisher.id;
左外部結合
10
novel_id title writer_id pub_id year id name101秘密 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 2001102⽩夜⾏ 1 1004 2002103容疑者Xの献⾝ 1 1003 2008104模倣犯 2 1001 2005
...... ... ... ...
novelid name
1001新潮社1002講談社1003⽂藝春秋1004集英社1005岩波書店
publisher
左側のテーブルに対応するデータがない場合は,NULL値をセットして結合する
SELECT * FROM novel RIGHT OUTER JOIN publisherON novel.pub_id = publisher.id;
右外部結合
11
novel_id title writer_id pub_id year id name101秘密 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 2001102⽩夜⾏ 1 1004 2002103容疑者Xの献⾝ 1 1003 2008104模倣犯 2 1001 2005
...... ... ... ...
novelid name
1001新潮社1002講談社1003⽂藝春秋1004集英社1005岩波書店
publisher
右側のテーブルに対応するデータがない場合は,NULL値をセットして結合する
SELECT * FROM novel FULL OUTER JOIN publisherON novel.pub_id = publisher.id;
完全外部結合
12
novel_id title writer_id pub_id year id name101秘密 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 2001102⽩夜⾏ 1 1004 2002103容疑者Xの献⾝ 1 1003 2008104模倣犯 2 1001 2005
...... ... ... ...
novelid name
1001新潮社1002講談社1003⽂藝春秋1004集英社1005岩波書店
publisher
MySQLではサポート外左側のテーブルを基準として結合さらに,右側のテーブルを基準として結合
内部結合と外部結合
13
SELECT * FROM t1 CROSS JOIN t2;
c1 c2a 1b 1c 2d 4
t1
c3 c41 x2 y3 z
t2
c1 c2 c3 c4a 1 1 xa 1 2 ya 1 3 zb 1 1 xb 1 2 yb 1 3 zc 2 1 xc 2 2 yc 2 3 zd 4 1 xd 4 2 yd 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 c4a 1 1 xb 1 1 xc 2 2 y
等結合=内部結合c1 c2 c3 c4a 1 1 xb 1 1 xc 2 2 yd 4 NULL NULL
左外部結合
c1 c2 c3 c4a 1 1 xb 1 1 xc 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 publisherON novel.pub_id = publisher.id;
等結合と内部結合
15
SELECT * FROM novel, publisherWHERE novel.pub_id = publisher.id;
等価SELECT * FROM novel INNER JOIN publisher
ON novel.pub_id = publisher.id;
等価
実は,⼆つのテーブルの交差結合から条件に合致するデータを選択していることになる
writer w2writer_id name age
1東野圭吾 572宮部みゆき 543村上春樹 66
SELECT w1.name AS name1, w1.age AS age1,w2.name AS name2, w2.age AS age2FROM writer w1 JOIN writer w2 WHERE w1.age > w2.age;
⾃⼰結合
16
writer w1writer_id name age
1東野圭吾 572宮部みゆき 543村上春樹 66
name1 age1 name2 age2村上春樹 66 東野圭吾 57東野圭吾 57 宮部みゆき 54村上春樹 66 宮部みゆき 54
⾃分⾃⾝のテーブルで結合を⾏う
カラムの別名指定
副問合せ
17
テーブル副問合せ 副問合せの結果がテーブルの形になる
スカラ副問合せ 副問合せの結果がスカラ(1⾏1列)になる
SELECT⽂内に複数の基本的なSELECT⽂を階層的に(⼊れ⼦型に)組み合わせた問合せ
テーブル副問合せ(IN句,ANY(SOME)句,ALL句)
18
SELECTname
FROMwriter
WHEREwriter_id IN
(SELECT
writer_idFROM
novelWHERE
year >= 2008);
"=ANY", "=SOME"でも良い"<=ALL", "<=ANY"とすると…?
writer_id1 3 1
name東野圭吾村上春樹
テーブル副問合せ(FROM句の副問合せ)
19
SELECTavg(c)
FROM(SELECT
count(*) AS cFROM
novelGROUP BY writer_id
)AS t1;
c4 24
avg(c)3.3333
SELECTname
FROMpublisher
WHERENOT EXISTS
(SELECT
*FROM
novelWHERE
pub_id = publisher.id);
テーブル副問合せ(EXSISTS句,NOT EXISITS句)
20
name岩波書店
id name1001新潮社1002講談社1003⽂藝春秋1004集英社1005岩波書店
novelテーブルにEXISTSEXISTSEXISTSEXISTSNOT EXISTS
SELECT * FROM novel WHERE pub_id = 1005;Empty set
スカラ副問合せ(WHERE句の副問合せ)
21
SELECTname
FROMwriter
WHEREage <
(SELECT
avg(age)FROM
writer);
avg(age)59.000
name東野圭吾宮部みゆき
スカラ副問合せ(HAVING句の副問合せ)
22
SELECT name, count(*)FROM novel, publisherWHERE id = pub_idGROUP BY pub_idHAVING
count(*) >=(SELECT
avg(c)FROM
(SELECTcount(*) AS c
FROMnovel
GROUP BY pub_id)AS t1);
avg(c)2.000
name count(*)新潮社 4講談社 2⽂藝春秋 2
本⽇学習したキーワード〜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 BYALTER TABLE ... ADD DROP USER PRIMARY KEYALTER TABLE ... CHANGE EXISTS REFERENCESALTER TABLE ... DROP FOREIGN KEY REVOKEALTER TABLE ... MODIFY FULL OUTER JOIN RIGHT OUTER JOINALTER TABLE ... RENAME AS GRANT SELECTANY GROUP BY SHOW COLUMNS FROMAS HAVING SHOW DATABASESASC IN SHOW TABLESavg INNER JOIN SOMEBETWEEN INSERT INTO sumcount JOIN UNIQUECREATE DATABASE LEFT OUTER JOIN UPDATECREATE TABLE LIKE USECREATE VIEW LIMIT WHERECROSS JOIN maxDELETE FROM minDESC NATURAL JOINDISTINCT NOT EXISTSDROP DATABASE NOT NULL
これまでに学習したSQLキーワード
28
ALL DROP TABLE ORDER BYALTER TABLE ... ADD DROP USER PRIMARY KEYALTER TABLE ... CHANGE EXISTS REFERENCESALTER TABLE ... DROP FOREIGN KEY REVOKEALTER TABLE ... MODIFY FULL OUTER JOIN RIGHT OUTER JOINALTER TABLE ... RENAME AS GRANT SELECTANY GROUP BY SHOW COLUMNS FROMAS HAVING SHOW DATABASESASC IN SHOW TABLESavg INNER JOIN SOMEBETWEEN INSERT INTO sumcount JOIN UNIQUECREATE DATABASE LEFT OUTER JOIN UPDATECREATE TABLE LIKE USECREATE VIEW LIMIT WHERECROSS JOIN maxDELETE FROM minDESC NATURAL JOINDISTINCT NOT EXISTSDROP DATABASE NOT NULL