39
7-1 1 Ch 8 Ch 8 Supplement #1 Supplement #1 SELECT and JOIN 楊楊楊楊楊 楊楊楊楊楊楊楊 2013 Fall

Ch 8 Supplement #1

Embed Size (px)

DESCRIPTION

Ch 8 Supplement #1. SELECT and JOIN. 楊立偉教授 台灣大學工管系 2013 Fall. 1. Relational algebra. Relational database 的數學理論基礎 對於 Relation 的基本操作包括了 ( 水平 ) 選擇運算 Selection ( 垂直 ) 投影運算 Projection 乘積運算 Product 合併運算 Join 聯集與差集運算 Union / Difference. ( 水平 ) 選擇運算 Selection. SELECT…FROM R WHER P - PowerPoint PPT Presentation

Citation preview

Page 1: Ch 8 Supplement #1

7-1

11

Ch 8Ch 8Supplement #1Supplement #1

SELECT and JOIN

楊立偉教授台灣大學工管系

2013 Fall

Page 2: Ch 8 Supplement #1

7-2

Relational algebra

• Relational database 的數學理論基礎

• 對於 Relation 的基本操作包括了1. ( 水平 ) 選擇運算 Selection

2. ( 垂直 ) 投影運算 Projection

3. 乘積運算 Product

4. 合併運算 Join

5. 聯集與差集運算 Union / Difference

Page 3: Ch 8 Supplement #1

7-3

( 水平 ) 選擇運算 Selection

• SELECT…FROM R WHER P

• 用給定條件過濾出所要的資料• 是關聯式資料庫最常用的功能

Page 4: Ch 8 Supplement #1

7-4

( 水平 ) 選擇運算 Selection – 範例

• SELECT…FROM Books WHERE price<140

Page 5: Ch 8 Supplement #1

7-5

( 水平 ) 選擇運算 Selection – 範例

• SELECT…FROM Books WHERE id<=3

Page 6: Ch 8 Supplement #1

7-6

( 水平 ) 選擇運算 Selection – 範例

• SELECT…FROM Books WHERE price<140 or id<=3

透過欄位條件,可方便地取回想要的資料

Page 7: Ch 8 Supplement #1

7-7

( 垂直 ) 投影運算 Projection

• SELECT F1,F2,…FROM…WHER…

• 只將想要的欄位投影出來– SELECT id, author, publish FROM Books

Page 8: Ch 8 Supplement #1

7-8

Product 乘積運算• 又稱 Cartesian Product

– 任二張表格紀錄間的全部排列組合

Page 9: Ch 8 Supplement #1

7-9

Join 合併運算• 將表格間依特定條件做合併

– 由 FK 關聯回 PK, 組回一張大表

Page 10: Ch 8 Supplement #1

7-10

Join 合併運算 – 範例SELECT Emp.*, Dept.*

FROM Emp JOIN Dept ON Emp.dep_no=Dept.no

Page 11: Ch 8 Supplement #1

7-11

Join 合併運算 – 另一種角度• 合併運算的結果,其實就是 Product 乘積結果,

再用 Selection 選擇條件做篩選

先做乘積 依 dep_no=no做選擇

Page 12: Ch 8 Supplement #1

7-12

Join 合併運算• Join 是關聯式資料庫最核心的功能• 相當於透過 FK 與 PK 的關聯,重新組回一張大

表– 同時讓重複資料降到最少,又不遺失資訊

• Join 後的結果,必被包含於乘積之中

• 可執行多次 Join 以合併多張表格– 「所有表格運算後的結果仍是表格」

• 此為 Relational algebra 的封閉特性 (closure)

Page 13: Ch 8 Supplement #1

7-13

Join 合併運算 – 範例SELECT Order.*, Customer.*, Product.* FROM Order

JOIN Customer ON Order.c_id=Customer.id

JOIN Product ON Order.p_id=Product.id

查詢結果

Page 14: Ch 8 Supplement #1

7-14

Join 合併運算 – 另一種角度• 一樣可視為乘積後、選擇條件篩選後的結果• 可想成兩張 Join 後結果與第三張再 Join ,或三張表格

直接做乘積後做條件篩選,結果一樣– 此為 Relational Algebra 的結合律 (Associativity) 與交換律

(Commutativity)

先做乘積共 8 筆

依 c_id=id and p_id=id 做選擇剩 2 筆 ( 與前頁結果一樣 )

Page 15: Ch 8 Supplement #1

7-15

Join 合併運算 – 配合 Where

找出落在 10 月且為女性之訂單 , 其姓名與購買產品為何SELECT Customer.Name, Product.Name

FROM Order

JOIN Customer ON Order.c_id=Customer.id

JOIN Product ON Order.p_id=Product.id

Where date>=‘20091001’ and date<=‘20091031’

and Customer.Gender=‘ 女’

查詢結果 ( 先想 Join 結果 , 再想 Where, 再想欄位結果 )

Page 16: Ch 8 Supplement #1

7-16

Join 合併運算 – RDBMS 內部的真實運作方式

• 直觀:透過巢狀迴路 (Nested Loop) 做查表

• 一個 Join 隱含大量的查表動作,因此常需 Join的欄位,記得要建立索引 (index)– 通則:在 PK 與 FK 欄位上建立索引

Page 17: Ch 8 Supplement #1

7-17

1717

Ch 8Ch 8Supplement #2Supplement #2

SELECT 個案練習

楊立偉教授台灣大學工管系

2012 Fall

Page 18: Ch 8 Supplement #1

7-18

綜合練習• 為了建立一個社交網站,請設計一個可以

包括會員與交友關係的資料庫

Page 19: Ch 8 Supplement #1

7-19

會員與交友關係 (1)

• 使用 unary relationship 來表達

member

Date

Type有朋友

被加入朋友

E-R Model Diagram

關係上也有屬性

Page 20: Ch 8 Supplement #1

7-20

會員與交友關係 (2)

• 轉換成表格

member

MnoNameGenderAgeEducationMarriageArea

member_ friendship

MnoF_MnoTypeDate

多對多關係

關係上有屬性

引入Association Entity

Page 21: Ch 8 Supplement #1

7-21

會員與交友關係 (3)

• 建立表格、欄位、關聯

member

PK Mno

Name Gender Age Education Marriage Area

member_friendship

PK,FK1 MnoPK,FK2 F_Mno

Type Date

Page 22: Ch 8 Supplement #1

7-22

會員與交友關係 (4)

Page 23: Ch 8 Supplement #1

7-23

基本查詢練習 (1)

• 列出住在台北 , 有朋友在新竹的所有會員– 分解動作 1: 先列出住在台北的人

SELECT m.*

FROM member AS m

WHERE m.area=' 台北 ';

Page 24: Ch 8 Supplement #1

7-24

基本查詢練習 (1)

– 分解動作 2: 列出住台北的人 , 以及他們的朋友

SELECT m.*, f.*

FROM member AS m, member_friendship AS f

WHERE m.area=' 台北 ' and m.mno=f.mno;

Page 25: Ch 8 Supplement #1

7-25

基本查詢練習 (1)

– 分解動作 3: 列出住台北的人 , 以及他們的朋友 , 連他們的朋友住哪也列出來

SELECT m.*, f.*, n.name, n.area

FROM member AS m, member_friendship AS f, member AS N

WHERE m.area=' 台北 ' and m.mno=f.mno and f.f_mno=n.mno;

Page 26: Ch 8 Supplement #1

7-26

基本查詢練習 (1)

– 分解動作 4: 列出住台北的人 , 以及他們的朋友 , 連他們的朋友住哪也列出來 , 只留下住新竹的

SELECT m.*, f.*, n.name, n.area

FROM member AS m, member_friendship AS f, member AS n

WHERE m.area=' 台北 ' and m.mno=f.mno and f.f_mno=n.mno

and n.area=' 新竹 ';

Page 27: Ch 8 Supplement #1

7-27

基本查詢練習 (2)

• 交友人數排行榜 : 列出至少有 3 位以上朋友 , 由人數多的開始 , 列出他們的姓名與人數– 分解動作 1: 先統計每個人有多少朋友 , 並排

SELECT mno, count(*)

FROM member_friendship

GROUP BY mno

ORDER BY count(*);

Page 28: Ch 8 Supplement #1

7-28

基本查詢練習 (2)

– 分解動作 2: 把排序方向倒過來 , 只留下超過3 人以上的 , 並把欄位顯示名稱改一下

SELECT mno, count(*) AS ppl

FROM member_friendship

GROUP BY mno

HAVING count(*)>=3

ORDER BY count(*) DESC;

Page 29: Ch 8 Supplement #1

7-29

基本查詢練習 (2)

– 分解動作 3: 把會員名稱連回來即可

SELECT f.mno, m.name, count(*) AS ppl

FROM member_friendship AS f, member AS m

WHERE f.mno=m.mno

GROUP BY f.mno

HAVING count(*)>=3

ORDER BY count(*) DESC;

, m.name這邊也要加入

Page 30: Ch 8 Supplement #1

7-30

基本查詢練習 (2)

• 第二種解法– 當查詢很複雜,透過一句 SQL 無法完成時,

可將查詢結果做暫存,之後再利用– 分解動作 1: 先將統計結果暫存成 tmp 表格SELECT mno, count(*) AS ppl INTO tmp

FROM member_friendship

GROUP BY mno

HAVING count(*)>=3

ORDER BY count(*) DESC;

Page 31: Ch 8 Supplement #1

7-31

基本查詢練習 (2)

• 第二種解法– 分解動作 2: 把會員名稱連回來即可

SELECT tmp.mno, name, ppl

FROM tmp, member

WHERE tmp.mno=member.mno;

– 分解動作 3: 刪除暫存表格

DROP TABLE tmp;

非不得已不要用多句 SQL, 盡量用一句完成

Page 32: Ch 8 Supplement #1

7-32

基本查詢練習 (3)

• 列出有朋友的人– 解法 1: 統計每人有幾位朋友 , 列出 1 位以上

的SELECT m.name, count(*)FROM member_friendship AS F LEFT JOIN member AS M ON m.mno=f.mnoGROUP BY m.nameHAVING count(*)>=1ORDER BY count(*) DESC , m.name;

SELECT m.name, count(*)FROM member_friendship AS F, member as MWHERE m.mno=f.mnoGROUP BY m.nameHAVING count(*)>=1ORDER BY count(*) DESC , m.name;

Page 33: Ch 8 Supplement #1

7-33

基本查詢練習 (3)

• 列出有朋友的人– 解法 2: 運用 DISTINCT保留字

SELECT m.nameFROM member_friendship AS F LEFT JOIN member AS M ON m.mno=f.mnoORDER BY m.name;

SELECT DISTINCT m.nameFROM member_friendship AS F LEFT JOIN member AS M ON m.mno=f.mnoORDER BY m.name;

Page 34: Ch 8 Supplement #1

7-34

基本查詢練習 (3)

• 列出有朋友的人– 解法 3: 運用 IN 運算元

SELECT nameFROM memberWHERE mno IN (SELECT mno FROM member_friendship)ORDER BY name;

IN 在意義上相當於多個 OR 相連

Page 35: Ch 8 Supplement #1

7-35

基本查詢練習 (4)

• 列出沒有朋友的人– 解法 1: 利用 Outer Join 的特性 , 列出無關連

的– 分解動作 1: 先用 Outer Join

SELECT m.name, f.f_mnoFROM member AS m LEFT OUTER JOIN member_friendship AS f

ON m.mno=f.mnoORDER BY m.name;

Page 36: Ch 8 Supplement #1

7-36

基本查詢練習 (4)

– 分解動作 2: 再用 WHERE挑選出無關連的資料即可

SELECT m.name, f.f_mnoFROM member AS m LEFT OUTER JOIN member_friendship AS f

ON m.mno=f.mnoWHERE f.f_mno is nullORDER BY m.name;

Page 37: Ch 8 Supplement #1

7-37

基本查詢練習 (4)

• 列出沒有朋友的人– 解法 2: 運用 NOT IN 運算元

SELECT nameFROM memberWHERE mno NOT IN

(SELECT mno FROM member_friendship)ORDER BY name;

Page 38: Ch 8 Supplement #1

7-38

工具使用 (1)

• Excel 轉入 Access 的方法– 在 Access 內 , 選檔案→取得外部資料

• 匯入• 連結

選擇檔案類型為 Excel

之後依序決定欄位屬性即可

Page 39: Ch 8 Supplement #1

7-39

工具使用 (2)

• Access 轉入 Excel 的方法1. 直接在 Excel 內選複製 , 再到 Access貼上

即可2. 在 Access 內 , 選檔案→匯出選擇檔案類型

為 Excel