Upload
mufutau-frye
View
23
Download
0
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
7-1
11
Ch 8Ch 8Supplement #1Supplement #1
SELECT and JOIN
楊立偉教授台灣大學工管系
2013 Fall
7-2
Relational algebra
• Relational database 的數學理論基礎
• 對於 Relation 的基本操作包括了1. ( 水平 ) 選擇運算 Selection
2. ( 垂直 ) 投影運算 Projection
3. 乘積運算 Product
4. 合併運算 Join
5. 聯集與差集運算 Union / Difference
7-3
( 水平 ) 選擇運算 Selection
• SELECT…FROM R WHER P
• 用給定條件過濾出所要的資料• 是關聯式資料庫最常用的功能
7-4
( 水平 ) 選擇運算 Selection – 範例
• SELECT…FROM Books WHERE price<140
7-5
( 水平 ) 選擇運算 Selection – 範例
• SELECT…FROM Books WHERE id<=3
7-6
( 水平 ) 選擇運算 Selection – 範例
• SELECT…FROM Books WHERE price<140 or id<=3
透過欄位條件,可方便地取回想要的資料
7-7
( 垂直 ) 投影運算 Projection
• SELECT F1,F2,…FROM…WHER…
• 只將想要的欄位投影出來– SELECT id, author, publish FROM Books
7-8
Product 乘積運算• 又稱 Cartesian Product
– 任二張表格紀錄間的全部排列組合
7-9
Join 合併運算• 將表格間依特定條件做合併
– 由 FK 關聯回 PK, 組回一張大表
7-10
Join 合併運算 – 範例SELECT Emp.*, Dept.*
FROM Emp JOIN Dept ON Emp.dep_no=Dept.no
7-11
Join 合併運算 – 另一種角度• 合併運算的結果,其實就是 Product 乘積結果,
再用 Selection 選擇條件做篩選
先做乘積 依 dep_no=no做選擇
7-12
Join 合併運算• Join 是關聯式資料庫最核心的功能• 相當於透過 FK 與 PK 的關聯,重新組回一張大
表– 同時讓重複資料降到最少,又不遺失資訊
• Join 後的結果,必被包含於乘積之中
• 可執行多次 Join 以合併多張表格– 「所有表格運算後的結果仍是表格」
• 此為 Relational algebra 的封閉特性 (closure)
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
查詢結果
7-14
Join 合併運算 – 另一種角度• 一樣可視為乘積後、選擇條件篩選後的結果• 可想成兩張 Join 後結果與第三張再 Join ,或三張表格
直接做乘積後做條件篩選,結果一樣– 此為 Relational Algebra 的結合律 (Associativity) 與交換律
(Commutativity)
先做乘積共 8 筆
依 c_id=id and p_id=id 做選擇剩 2 筆 ( 與前頁結果一樣 )
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, 再想欄位結果 )
7-16
Join 合併運算 – RDBMS 內部的真實運作方式
• 直觀:透過巢狀迴路 (Nested Loop) 做查表
• 一個 Join 隱含大量的查表動作,因此常需 Join的欄位,記得要建立索引 (index)– 通則:在 PK 與 FK 欄位上建立索引
7-17
1717
Ch 8Ch 8Supplement #2Supplement #2
SELECT 個案練習
楊立偉教授台灣大學工管系
2012 Fall
7-18
綜合練習• 為了建立一個社交網站,請設計一個可以
包括會員與交友關係的資料庫
7-19
會員與交友關係 (1)
• 使用 unary relationship 來表達
member
Date
Type有朋友
被加入朋友
E-R Model Diagram
關係上也有屬性
7-20
會員與交友關係 (2)
• 轉換成表格
member
MnoNameGenderAgeEducationMarriageArea
member_ friendship
MnoF_MnoTypeDate
多對多關係
關係上有屬性
引入Association Entity
7-21
會員與交友關係 (3)
• 建立表格、欄位、關聯
member
PK Mno
Name Gender Age Education Marriage Area
member_friendship
PK,FK1 MnoPK,FK2 F_Mno
Type Date
7-22
會員與交友關係 (4)
7-23
基本查詢練習 (1)
• 列出住在台北 , 有朋友在新竹的所有會員– 分解動作 1: 先列出住在台北的人
SELECT m.*
FROM member AS m
WHERE m.area=' 台北 ';
7-24
基本查詢練習 (1)
– 分解動作 2: 列出住台北的人 , 以及他們的朋友
SELECT m.*, f.*
FROM member AS m, member_friendship AS f
WHERE m.area=' 台北 ' and m.mno=f.mno;
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;
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=' 新竹 ';
7-27
基本查詢練習 (2)
• 交友人數排行榜 : 列出至少有 3 位以上朋友 , 由人數多的開始 , 列出他們的姓名與人數– 分解動作 1: 先統計每個人有多少朋友 , 並排
序
SELECT mno, count(*)
FROM member_friendship
GROUP BY mno
ORDER BY count(*);
7-28
基本查詢練習 (2)
– 分解動作 2: 把排序方向倒過來 , 只留下超過3 人以上的 , 並把欄位顯示名稱改一下
SELECT mno, count(*) AS ppl
FROM member_friendship
GROUP BY mno
HAVING count(*)>=3
ORDER BY count(*) DESC;
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這邊也要加入
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;
7-31
基本查詢練習 (2)
• 第二種解法– 分解動作 2: 把會員名稱連回來即可
SELECT tmp.mno, name, ppl
FROM tmp, member
WHERE tmp.mno=member.mno;
– 分解動作 3: 刪除暫存表格
DROP TABLE tmp;
非不得已不要用多句 SQL, 盡量用一句完成
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;
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;
7-34
基本查詢練習 (3)
• 列出有朋友的人– 解法 3: 運用 IN 運算元
SELECT nameFROM memberWHERE mno IN (SELECT mno FROM member_friendship)ORDER BY name;
IN 在意義上相當於多個 OR 相連
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;
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;
7-37
基本查詢練習 (4)
• 列出沒有朋友的人– 解法 2: 運用 NOT IN 運算元
SELECT nameFROM memberWHERE mno NOT IN
(SELECT mno FROM member_friendship)ORDER BY name;
7-38
工具使用 (1)
• Excel 轉入 Access 的方法– 在 Access 內 , 選檔案→取得外部資料
• 匯入• 連結
選擇檔案類型為 Excel
之後依序決定欄位屬性即可
7-39
工具使用 (2)
• Access 轉入 Excel 的方法1. 直接在 Excel 內選複製 , 再到 Access貼上
即可2. 在 Access 內 , 選檔案→匯出選擇檔案類型
為 Excel