25
1 關關關關關關 關關關關關關

關聯式資料庫

Embed Size (px)

DESCRIPTION

關聯式資料庫. DB. 資料庫. 資料庫是一個儲存資料的固定位置 一個資料庫中可以包含一個以上的資料表 每一個資料表中有許多記錄 ( 資料列 ) 例如 : Customers 資料表. 術語. 欄位. 欄位是具有型別的 (currency, string, …). 可以是 null ( 空值 ). 主索引鍵 (primary key) ( 一個或多個值不會重覆的欄位 ). DB. 範例. 以下是一個非常簡單的 Sales 資料庫 : Customers, Orders and Products. 關聯式資料庫. 什麼是關聯 ? - PowerPoint PPT Presentation

Citation preview

Page 1: 關聯式資料庫

1

關聯式資料庫關聯式資料庫關聯式資料庫關聯式資料庫

Page 2: 關聯式資料庫

2

資料庫資料庫 資料庫是一個儲存資料的固定位置資料庫是一個儲存資料的固定位置 一個資料庫中可以包含一個以上的資料表一個資料庫中可以包含一個以上的資料表

每一個資料表中有許多記錄 每一個資料表中有許多記錄 (( 資料列資料列 ))例如例如 : Customers : Customers 資料表資料表

DB

Page 3: 關聯式資料庫

3

術語術語

主索引鍵 主索引鍵 (primary key)(primary key)(( 一個或多個值不會重覆的欄位一個或多個值不會重覆的欄位 ))

欄位欄位

欄位是具有型別的欄位是具有型別的 (currency, string, (currency, string, …)…)

可以是 可以是 null (null ( 空值空值 ))

Page 4: 關聯式資料庫

4

範例範例 以下是一個非常簡單的以下是一個非常簡單的 SalesSales 資料庫資料庫 ::

Customers, Orders and ProductsCustomers, Orders and Products

DB

Page 5: 關聯式資料庫

5

關聯式資料庫關聯式資料庫 什麼是關聯什麼是關聯 ?? 資料表之間透過主索引鍵進行關聯資料表之間透過主索引鍵進行關聯 … …

關聯鍵 關聯鍵 (foreign key)(foreign key)(( 一個關聯到資料表主索引鍵的欄位一個關聯到資料表主索引鍵的欄位 ))

Page 6: 關聯式資料庫

6

資料庫結構資料庫結構 資料庫結構就是資料庫的設計結果資料庫結構就是資料庫的設計結果

資料表、欄位、型別、主索引鍵、資料表、欄位、型別、主索引鍵、……

關聯關聯 : : 一對多、多對一、多對多一對多、多對一、多對多

11

¥¥

11

¥¥

Page 7: 關聯式資料庫

7

正規化正規化 資料庫正規化可以幫助你設計資料庫資料庫正規化可以幫助你設計資料庫

一種數學式的資料庫設計方式一種數學式的資料庫設計方式讓我們來看一下「第一階正規化」讓我們來看一下「第一階正規化」

Page 8: 關聯式資料庫

8

範例範例 客戶購買多個產品客戶購買多個產品 第一種設計方式第一種設計方式 ::

ItemsItems 欄位包含產品代號與數量 欄位包含產品代號與數量 (pid, quantity) (pid, quantity) 的清單的清單 … …

這樣並不好 這樣並不好 ……

Page 9: 關聯式資料庫

9

第一階正規化第一階正規化11stst 正規化正規化 ::

在一個欄位中只會包含一個 在一個欄位中只會包含一個 ““簡單簡單” ” 的資料的資料

處理方式處理方式 : : 將這個欄位變成多個欄位和多筆記錄 將這個欄位變成多個欄位和多筆記錄 ……

Page 10: 關聯式資料庫

10

第一階正規化第一階正規化 之前的設計錯誤 之前的設計錯誤 !! 第二種設計第二種設計 :: 將訂單明細的部份變成資料將訂單明細的部份變成資料

表表 … …主索引鍵主索引鍵 (( 組合式組合式 ))

Page 11: 關聯式資料庫

11

結構化查詢語言 結構化查詢語言 (SQL)(SQL)結構化查詢語言 結構化查詢語言 (SQL)(SQL)

Page 12: 關聯式資料庫

12

SQLSQL

Structured Query LanguageStructured Query Language1970 1970 開始至今開始至今關聯式資料庫程式設計語言關聯式資料庫程式設計語言

標準型別標準型別 : integers, reals, strings, currency, …: integers, reals, strings, currency, … 資料結構資料結構 : : 資料表資料表 DML: DML: Data Manipulation LanguageData Manipulation Language (select, update, …) (select, update, …) DDL: DDL: Data Definition LanguageData Definition Language (create, drop, …) (create, drop, …)

一種宣告式的語言一種宣告式的語言 你宣告你要什麼 你宣告你要什麼 – – 提出要求提出要求 資料庫引擎處理你的要求資料庫引擎處理你的要求

Page 13: 關聯式資料庫

13

selectselect 範例範例 找出有欠錢的客戶,並且按照欠錢多寡排序找出有欠錢的客戶,並且按照欠錢多寡排序 … …

資料庫引擎會搜尋、排序、然後傳回結果資料庫引擎會搜尋、排序、然後傳回結果

SELECT LastName, FirstName, AcctBalance FROM Customers WHERE AcctBalance > 0.0 ORDER BY AcctBalance DESC;

SELECT LastName, FirstName, AcctBalance FROM Customers WHERE AcctBalance > 0.0 ORDER BY AcctBalance DESC;

Page 14: 關聯式資料庫

14

SQL SQL 中的一切都是資料表中的一切都是資料表 資料表就是 資料表就是 SQL SQL 中最基本的資料結構中最基本的資料結構

你就是要針對資料表做處理你就是要針對資料表做處理結果看起來就像一個表格結果看起來就像一個表格

SELECT LastName, FirstName, AcctBalance FROM Customers WHERE AcctBalance > 0.0 ORDER BY AcctBalance DESC;

SELECT LastName, FirstName, AcctBalance FROM Customers WHERE AcctBalance > 0.0 ORDER BY AcctBalance DESC;

Page 15: 關聯式資料庫

15

SQL SQL 的 的 DMLDML

SQL SQL 的 的 Data Manipulation Language:Data Manipulation Language:使用查詢格式來撰寫使用查詢格式來撰寫SELECT SELECT 語法可以用來從資料庫取得資料語法可以用來從資料庫取得資料其它語法其它語法 :: INSERT, UPDATE, DELETE INSERT, UPDATE, DELETE

不分大小寫 不分大小寫 ……

Page 16: 關聯式資料庫

16

範例範例 #1#1

搜尋所有客戶資料,不做其它處理 搜尋所有客戶資料,不做其它處理 ……

SELECT * FROM Customers;SELECT * FROM Customers;

Page 17: 關聯式資料庫

17

範例 範例 #2#2

根據 根據 LastName LastName 和 和 FirstName FirstName 來排序來排序 … …

SELECT * FROM Customers ORDER BY LastName ASC, FirstName ASC;

SELECT * FROM Customers ORDER BY LastName ASC, FirstName ASC;

Page 18: 關聯式資料庫

18

計算型的欄位計算型的欄位SQL SQL 可以進行計算可以進行計算 例如例如 ::

計算客戶數目、平均欠款、欠款最大金額計算客戶數目、平均欠款、欠款最大金額

SELECT COUNT(*) AS CustomerCount, AVG(AcctBalance) AS AvgAcctBalance, MAX(AcctBalance) AS MaxAcctBalance FROM Customers;

SELECT COUNT(*) AS CustomerCount, AVG(AcctBalance) AS AvgAcctBalance, MAX(AcctBalance) AS MaxAcctBalance FROM Customers;

Page 19: 關聯式資料庫

19

JoinsJoins 如果要合併兩個資料表的資料,使用如果要合併兩個資料表的資料,使用 JOIN …JOIN … 範例範例 ::

那一個客戶下了編號 那一個客戶下了編號 #12351 #12351 的訂單 的訂單 ??

我們要 我們要 Customers Customers 資料表中的客戶名稱,但是需要 資料表中的客戶名稱,但是需要 Orders Orders 資料表中的訂單編號來做搜尋條件資料表中的訂單編號來做搜尋條件

SELECT FirstName, LastName FROM Customers INNER JOIN Orders ON Customers.CID = Orders.CID WHERE Orders.OID = 12351;

SELECT FirstName, LastName FROM Customers INNER JOIN Orders ON Customers.CID = Orders.CID WHERE Orders.OID = 12351;

Page 20: 關聯式資料庫

20

Outer joinsOuter joins

如果你要不符合條件的記錄,使用如果你要不符合條件的記錄,使用 outer joinouter join 範例範例 ::

列出所有客戶資料,以及他們的訂單數目列出所有客戶資料,以及他們的訂單數目 (( 如果有的話如果有的話 ))inner join : inner join : 只會傳回有下訂單的客戶只會傳回有下訂單的客戶outer join : outer join : 傳回所有客戶 傳回所有客戶 (( 不管有沒有下訂單不管有沒有下訂單 ))

SELECT FirstName, LastName, COUNT(OID) AS NumberOfOrders FROM Customers LEFT OUTER JOIN Orders ON Customers.CID = Orders.CID GROUP BY LastName, FirstName ORDER BY LastName ASC, FirstName ASC;

SELECT FirstName, LastName, COUNT(OID) AS NumberOfOrders FROM Customers LEFT OUTER JOIN Orders ON Customers.CID = Orders.CID GROUP BY LastName, FirstName ORDER BY LastName ASC, FirstName ASC;

Page 21: 關聯式資料庫

21

巢狀式 巢狀式 joinsjoins

如果要 如果要 join join 多個表格時會用到多個表格時會用到 … … 範例範例 ::

某一個客戶訂了那一個產品某一個客戶訂了那一個產品需要什麼欄位,就 需要什麼欄位,就 join join 那個欄位所在的表格那個欄位所在的表格 … …

SELECT ProductName FROM Products WHERE Products.PID IN ( SELECT DISTINCT PID FROM OrderItems INNER JOIN ( SELECT OID FROM Orders INNER JOIN Customers ON Orders.CID = Customers.CID WHERE FirstName = 'Jim' AND LastName = 'Bag' ) AS TEMP On OrderItems.OID = TEMP.OID ) ORDER BY ProductName ASC;

SELECT ProductName FROM Products WHERE Products.PID IN ( SELECT DISTINCT PID FROM OrderItems INNER JOIN ( SELECT OID FROM Orders INNER JOIN Customers ON Orders.CID = Customers.CID WHERE FirstName = 'Jim' AND LastName = 'Bag' ) AS TEMP On OrderItems.OID = TEMP.OID ) ORDER BY ProductName ASC;

Page 22: 關聯式資料庫

22

非查詢式 非查詢式 SQL SQL 命令命令 用來修改資料庫中的資料用來修改資料庫中的資料 ::

注意注意 : : 字串要用 字串要用 ‘ ‘ 括起來,日期要用括起來,日期要用 # # 括起來括起來

如果要刪除客戶,要一併刪除訂單、訂單名細資料 如果要刪除客戶,要一併刪除訂單、訂單名細資料 ? ? 還是還是只是將該客戶標記成刪除 只是將該客戶標記成刪除 ??

INSERT INTO Customers(CID, FirstName, LastName, CreditLimit, AcctBalance, DateOfEntry) Values(667, 'Jia', 'Zhang', 1000.0, 0.0, #01-March-2004#);

INSERT INTO Customers(CID, FirstName, LastName, CreditLimit, AcctBalance, DateOfEntry) Values(667, 'Jia', 'Zhang', 1000.0, 0.0, #01-March-2004#);

UPDATE Customers SET CreditLimit = 40000000000.0, AcctBalance = 0.0 WHERE LastName = 'Gates' AND FirstName = 'Bill';

UPDATE Customers SET CreditLimit = 40000000000.0, AcctBalance = 0.0 WHERE LastName = 'Gates' AND FirstName = 'Bill';

DELETE FROM Customers WHERE CID = 666;DELETE FROM Customers WHERE CID = 666;

Page 23: 關聯式資料庫

23

預儲程序預儲程序預儲程序預儲程序

Page 24: 關聯式資料庫

24

預儲程序預儲程序 預儲程序是事先儲存在資料庫中的 預儲程序是事先儲存在資料庫中的 SQL SQL

程式程式可以接受參數可以接受參數可以回傳資料表可以回傳資料表預先編譯、最佳化過 預先編譯、最佳化過 – – 幾乎是十倍快幾乎是十倍快 !!

DB

/***** 輸入訂單編號,傳回下這筆訂單的客戶資料 … *****/CREATE PROCEDURE sprocOrdersOIDToCustomer @OID bigint ASSELECT * FROM Customers INNER JOIN Orders ON Customers.CID = Orders.CID WHERE Orders.OID = @OID

/***** 輸入訂單編號,傳回下這筆訂單的客戶資料 … *****/CREATE PROCEDURE sprocOrdersOIDToCustomer @OID bigint ASSELECT * FROM Customers INNER JOIN Orders ON Customers.CID = Orders.CID WHERE Orders.OID = @OID

Page 25: 關聯式資料庫

25

優點與缺點優點與缺點 優點優點 ::

執行快速執行快速將複雜的 將複雜的 SQL SQL 程式封裝起來程式封裝起來提供另外一層的存取控制能力提供另外一層的存取控制能力大部份的資料庫提供者都支援大部份的資料庫提供者都支援

SQL Server, Oracle, etc.SQL Server, Oracle, etc.

缺點缺點 ::每個資料庫提供者的預儲程序語法都不一樣每個資料庫提供者的預儲程序語法都不一樣預儲程序不容易轉換成其它格式的程式預儲程序不容易轉換成其它格式的程式