28
データベース 第5回 SQL(SELECT:結合,副問合せ) 1 2015年5⽉7⽇(⽊) 7・8時限 担当:奥 健太

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

Embed Size (px)

Citation preview

データベース第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

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

まとめ

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 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