# 資料庫系統
僑光科技大學 資訊科技系
2021/02/22 ~ 2021/06/26
授課老師:高吉隆
電子信箱:[kevinkao888@gmail.com](mailto://kevinkao888@gmail.com)
---
![](https://i.imgur.com/QV7GTb2.png =500x650)
---
# 課程介紹
* 課程大綱
* 每週目標
* 成績計算
* 期末報告(忠班):[連結](https://hackmd.io/wsxoCaQCQE26zf-dhHnsag)
* 期末報告(孝班):[連結](https://hackmd.io/Xnn9gFeHQKujLXdzSzQk_A)
----
## 課程大綱
1. 資料庫的概念
2. 關聯式資料庫的介紹
3. 資料庫的設計與分析
4. 資料庫的查詢與實作
5. 資料庫的交易與管理
6. 資料庫實作與報告
----
## 每週目標
* 前 9 週上課目標 (上課講解、作業繳交、測驗)
* 後 9 週上課目標 (分組討論、專題報告)
----
|週| 前 9 週上課目標 | 作業、小考
|:-:| --------------- |:--:
| 1 | 第1章 資料庫導論
| 2 | 第2章 關聯式資料庫
| 3 | 第3章 實體關係圖 |
| 4 | 第1次作業、小考 | 第1-2章
| 5 | 第4章 資料庫正規化 |
| 6 | 第5章 關聯式資料運算 |
| 7 | 06/19畢業典禮補課 |
| 8 | 第1次作業、小考 | 第3-4章
| 9 | 期中考 | 第1-5章
----
| 週 | 後 9 週上課目標 | 備註 |
|:--:| --------------- |:--:|
| 10 | 第6章 結構化查詢語言 |
| 11 | 第7章 SQL的查詢語言 | 第5-6章作業
| 12 | 第8章 合併理論與實作 |
| 13 | 第9章 T-SQL程式設計 | 第7-8章
| 14 | 第10章 觸發、預存程序 | 規劃報告
| 15 | 分組討論與分析 |
| 16 | 分組討論與分析 |
| 17 | 期末成果報告 |
| 18 | 期末成果報告 |
----
## 資料庫系統補課公告
* 開課班級:107孝班,每週一早上09:00~12:00
* 原18週06/29(一)課程,調整至畢業典禮06/21(日)上課
* 為了讓大家星期日好安排行程,因此調整至平日時間補課
* 預訂分別在以下時間補課,原課程3小時
* 05/13(三):班會時間13:10~15:00(2小時)
* 05/20(三):班會時間13:10~14:00(1小時)
* 上課教室:圖資9樓8907
----
## 資料庫系統加課公告
* 開課班級:107孝班,每週一早上09:00~12:00
* 技優領航計畫加課:技優入學同學請務必簽到
* 全部同學皆可來上課,期末報告問題可以詢問
* 預訂分別在以下時間加課,
* 06/01(一):第8節16:10~17:00(1小時)
* 06/08(一):第1節08:10~09:00(1小時)
* 06/08(一):第8節16:10~17:00(1小時)
* 上課教室:圖資9樓8906
----
## 資料庫系統加課公告
* 開課班級:107忠班,每週二早上09:00~12:00
* 技優領航計畫加課:技優入學同學請務必簽到
* 全部同學皆可來上課,期末報告問題可以詢問
* 預訂分別在以下時間加課,
* 06/02(二):第1節08:10~09:00(1小時)
* 06/02(二):第8節16:10~17:00(1小時)
* 06/09(二):第1節08:10~09:00(1小時)
* 上課教室:圖資9樓8907
---
## 教學用書
* 書本名稱:動畫圖解資料庫系統理論-使用SQL Server實作
* 出版社:全華圖書
* 作者:李春雄
![](https://www.opentech.com.tw/gif/cbook/06188037.JPG =250x350)
----
## 評分標準
* 平時成績:60%
* 上課互動:10% (出席狀況)
* 作業繳交:20% (第4、6、9、11週)
* 小考:30% (第4、6、11週)
* 期中成績:10%
* 期中考 (第9週)
* 期末成績:30%
* 規劃報告:5% (第15週)
* 期末報告:25% (第18週)
----
#### 投影片網址
* 請同學登入zuvio平台,下載投影片
* 帳號:s10715XXX@ocu.edu.tw
* 密碼:123(登入後請更改密碼)
* 上傳版投影片使用原則
* 本上傳版簡報檔已經出版商授權
* 只授權教師上傳至有帳號及密碼的平台
* 只可讓本課程上課學生使用
* 不能公開上傳至其他平台
* 若有侵害原作者版權,請同學自行負責
---
## 期末報告
* 以1-4人為1組:[分組名單](https://hackmd.io/3U3iL8CkQhC-w-wsDwB3JQ)
* 完成以下內容:
* 建立資料庫:列出所有資料表(至少3個)
* 製作E-R關聯圖:標示出主鍵、外鍵等資訊
* 程式:以 Visual Studio 2019撰寫程式
* 用條件查詢、新增、修改、刪除等功能
* 資料庫:以單機/線上資料庫平台建置
* 報告方式:製作PPT簡報,錄製5分鐘報告影片
* 繳交方式:錄製擷取螢幕及錄音成影片上傳
* 資料參考:政府資料開放平台[連結](https://data.gov.tw/)
* 評分方式:自評(20%)+互評(20%)+老師(60%)
----
### 第一次小考成績統計(108忠)
||平均|最高|最低|未到考|不及格
|:-:|-:|-:|-:|-:|-:|
|原始分數|48|73|21|0人|38人
|加20分後|66|92|40|30|12人
![](https://i.imgur.com/IM9bPJX.png =800x400)
----
### 第二次小考成績統計(108忠)
||平均|最高|最低|未到考|不及格
|:-:|-:|-:|-:|-:|-:|
|原始分數|45|89|19|2人|37人
|加20分後|64|100|40|30|16人
![](https://i.imgur.com/f62iJim.png =800x400)
----
### 期中考成績統計(108忠)
||平均|最高|最低|未到考|不及格
|:-:|-:|-:|-:|-:|-:|
|原始分數|48|87|29|1人|37人
|加20分後|67|100|49|40|13人
![](https://i.imgur.com/275QtCd.png)
----
### 第三次小考成績統計(108忠)
||平均|最高|最低|未到考|不及格
|:-:|-:|-:|-:|-:|-:|
|原始分數|20|72|20|6人|34人
|加20分後|61|92|40|30|20人
![](https://i.imgur.com/Fk9n396.png)
---
## 課程前之準備
* 安裝 Visual Studio 軟體(必備)
* Visual Studio Community 2019:[下載](https://visualstudio.microsoft.com/zh-hant/vs/older-downloads/)
* 如果同學希望把資料建立你自已的電腦請安裝
* 安裝 SQL Server 軟體
* SQL Server Express 2016:[下載](https://www.microsoft.com/zh-TW/download/details.aspx?id=56840)
* SQL Server Management Studio 18:[下載](https://docs.microsoft.com/zh-tw/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15)
----
### 安裝 Visual Studio Community 2019 #1
* 安裝前安裝設定
![](https://i.imgur.com/K2nc5FC.png)
----
### 安裝 Visual Studio Community 2019 #2
![](https://i.imgur.com/S7BVKri.png)
----
### 安裝 Visual Studio Community 2019 #3
* 選擇傳統型與行動裝置:.NET桌面開發,再按安裝
![](https://i.imgur.com/OYV0zzy.png)
----
### 安裝 Visual Studio Community 2019 #4
![](https://i.imgur.com/oWVUyzy.png)
----
### 安裝 Visual Studio Community 2019 #5
![](https://i.imgur.com/TOqFrXH.png)
----
### 安裝 Visual Studio Community 2019 #6
* 選擇暫不登入
![](https://i.imgur.com/FlQgX2Z.png)
----
### 安裝 Visual Studio Community 2019 #7
* 啟動 Visual Studio
![](https://i.imgur.com/XB7UFdP.png)
----
### 安裝 Visual Studio Community 2019 #8
* 建立新的專案
![](https://i.imgur.com/lf3JGwp.png)
----
### 安裝 Visual Studio Community 2019 #9
* 選擇Windows Form應用程式(C#/Windows/桌面)
![](https://i.imgur.com/q1Xc8Iy.png)
----
### 安裝 Visual Studio Community 2019 #10
* 選擇目標Framework .NET 5.0
![](https://i.imgur.com/kHk3jl8.png)
---
### 安裝 SQL Server Express 2016 #1
* 選擇安裝類型:基本
![](https://i.imgur.com/ujyNIqS.png =800x500)
----
### 安裝 SQL Server Express 2016 #2
* 選擇:接受授權條款
![](https://i.imgur.com/UW3UGtf.png =800x500)
----
### 安裝 SQL Server Express 2016 #3
* 選擇:安裝
![](https://i.imgur.com/5UbwvD4.png =800x500)
----
### 安裝 SQL Server Express 2016 #4
* 下載安裝封裝
![](https://i.imgur.com/meb5K47.png =800x500)
----
### 安裝 SQL Server Express 2016 #5
* 正在安裝
![](https://i.imgur.com/jNguolO.png =800x500)
----
### 安裝 SQL Server Express 2016 #6
* 結束安裝
![](https://i.imgur.com/hKe2qwB.png =800x500)
----
### 安裝 SQL Server Management Studio 18 #1
* 選擇位置後按安裝
![](https://i.imgur.com/zdfhEq1.png)
----
### 安裝 SQL Server Management Studio 18 #2
* 安裝進度
![](https://i.imgur.com/n1TS1CT.png)
----
### 安裝 SQL Server Management Studio 18 #3
* 結束安裝
![](https://i.imgur.com/MPM6FHh.png)
---
## 資料庫實務操作
* 開啟 SQL Server Management Studio
* 伺服器名稱:db.ocu.tw,2433
* 驗證:SQL Server 驗證
* 登入:s+學號
* 密碼:s+學號@ocu.edu.tw
* 連接:點選前可按記住密碼
![](https://i.imgur.com/veCFDbi.png =350x250)
----
### 範例資料庫
* 新增順序1:老師->課程
* 新增順序2:科系->學生->教務處->學務處
* 新增順序3:選課
![](https://i.imgur.com/ep2Lb72.png)
----
### 老師資料表
```sql=
CREATE TABLE 老師資料表(
老師編號 nvarchar(5),
老師姓名 nvarchar(8),
研究領域 nvarchar(100),
PRIMARY KEY (老師編號)
)
INSERT INTO 老師資料表 VALUES
(N'T0001', N'張三', N'數位學習')
, (N'T0002', N'李四', N'資料探勘')
, (N'T0003', N'王五', N'知識管理')
, (N'T0004', N'李安', N'軟體測試')
```
----
### 課程資料表
```sql=
CREATE TABLE 課程資料表(
課號 nvarchar(5),
課名 nvarchar(10),
學分數 int,
老師編號 nvarchar(5),
PRIMARY KEY (課號),
FOREIGN KEY (老師編號) REFERENCES 老師資料表 (老師編號)
)
INSERT INTO 課程資料表 VALUES
(N'C001', N'程式設計', 4, N'T0001')
, (N'C002', N'資料庫', 4, N'T0001')
, (N'C003', N'資料結構', 3, N'T0001')
, (N'C004', N'系統分析', 4, N'T0002')
, (N'C005', N'計算機概論', 3, N'T0002')
, (N'C006', N'數位學習', 3, N'T0003')
, (N'C007', N'知識管理', 3, N'T0004')
```
----
### 科系代碼表
```sql=
CREATE TABLE 科系代碼表(
系碼 nvarchar(4),
系名 nvarchar(10),
系主任 nvarchar(10),
PRIMARY KEY (系碼)
)
INSERT INTO 科系代碼表 VALUES
(N'D001', N'資管系', N'林主任')
, (N'D002', N'資工系', N'陳主任')
, (N'D003', N'工管系', N'王主任')
, (N'D004', N'企管系', N'李主任')
, (N'D005', N'幼保系', N'黃主任')
```
----
### 學生資料表
```sql=
CREATE TABLE 學生資料表(
學號 nvarchar(5),
姓名 nvarchar(4),
系碼 nvarchar(4),
PRIMARY KEY (學號),
FOREIGN KEY (系碼) REFERENCES 科系代碼表 (系碼)
)
INSERT INTO 學生資料表 VALUES
(N'S0001', N'張三', N'D001')
, (N'S0002', N'李四', N'D002')
, (N'S0003', N'王五', N'D003')
, (N'S0004', N'陳明', N'D001')
, (N'S0005', N'李安', N'D004')
```
----
### 教務處資料表
```sql=
CREATE TABLE 教務處資料表(
序號 int,
學號 nvarchar(5),
學業成績 int,
PRIMARY KEY (序號),
FOREIGN KEY (學號) REFERENCES 學生資料表 (學號)
)
INSERT INTO 教務處資料表 VALUES
(1, N'S0001', 60)
, (2, N'S0002', 70)
, (3, N'S0003', 80)
, (4, N'S0004', 90)
```
----
### 學務處資料表
```sql=
CREATE TABLE 學務處資料表(
序號 int,
學號 nvarchar(5),
操性成績 int,
PRIMARY KEY (序號),
FOREIGN KEY (學號) REFERENCES 學生資料表 (學號)
)
INSERT INTO 學務處資料表 VALUES
(1, N'S0001', 80)
, (2, N'S0002', 93)
, (3, N'S0003', 75)
, (4, N'S0004', 60)
```
----
### 選課資料表
```sql=
CREATE TABLE 選課資料表(
學號 nvarchar(5),
課號 nvarchar(5),
成績 int,
PRIMARY KEY (學號, 課號),
FOREIGN KEY (學號) REFERENCES 學生資料表 (學號),
FOREIGN KEY (課號) REFERENCES 課程資料表 (課號)
)
INSERT INTO [選課資料表] VALUES
(N'S0001', N'C001', 56)
, (N'S0001', N'C005', 73)
, (N'S0002', N'C002', 92)
, (N'S0002', N'C005', 63)
, (N'S0003', N'C004', 92)
, (N'S0003', N'C005', 70)
, (N'S0004', N'C003', 75)
, (N'S0004', N'C004', 88)
, (N'S0004', N'C005', 68)
, (N'S0005', N'C005', NULL)
```
---
### DROP TABLE
* 因為有關聯,刪除資料表也有分順序
```sql=
DROP TABLE 選課資料表
DROP TABLE 學務處資料表
DROP TABLE 教務處資料表
DROP TABLE 學生資料表
DROP TABLE 科系代碼表
DROP TABLE 課程資料表
DROP TABLE 老師資料表
```
----
### CROSS JOIN
* 同時讀取老師和課程資料表
```sql=
SELECT * FROM 老師資料表, 課程資料表
WHERE 老師資料表.老師編號=課程資料表.老師編號
```
* 可以用別名來代替資料表名稱
```sql=
SELECT * FROM 老師資料表 AS A, 課程資料表 AS B
WHERE A.老師編號=B.老師編號
```
* 也可以只列出部分欄位
```sql=
SELECT A.老師編號, 老師姓名, 課號, 課名
FROM 老師資料表 AS A, 課程資料表 AS B
WHERE A.老師編號=B.老師編號
```
----
### CROSS JOIN WITH GROUP BY
* 同時讀取學生和選課資料表並做統計
```sql=
SELECT A.學號, 姓名, AVG(成績) AS 平均成績
FROM 學生資料表 AS A, 選課資料表 AS B
WHERE A.學號=B.學號
And B.成績>=70
GROUP BY A.學號, 姓名
HAVING AVG(成績)>=90
ORDER BY AVG(成績) ASC;
```
----
### INNER/LEFT/RIGHT/FULL JOIN
```sql=
SELECT *
FROM 老師資料表 AS A INNER JOIN 課程資料表 AS B
ON A.老師編號=B.老師編號;
SELECT *
FROM 老師資料表 AS A LEFT JOIN 課程資料表 AS B
ON A.老師編號=B.老師編號;
SELECT *
FROM 老師資料表 AS A RIGHT JOIN 課程資料表 AS B
ON A.老師編號=B.老師編號;
SELECT *
FROM 老師資料表 AS A FULL JOIN 課程資料表 AS B
ON A.老師編號=B.老師編號;
```
---
### 使用 Visual Studio 連接資料庫
* 開啟 Visual Studio 2017
* 開啟新專案
* 選擇C#->傳統桌面->Windows Form應用程式
![](https://i.imgur.com/omvz6Le.png =600x400)
----
### 使用工具箱建立按鈕(執行新增指令)
* 開啟檢視->工具箱視窗
* 在Form1中建立button1,標題:執行SQL
![](https://i.imgur.com/qZnfLxg.png)
----
### 在按鈕中建立程式
* 在按鈕中點擊兩下開啟程式視窗
* 在程式視窗中加入
```csharp=
using System.Data.SqlClient; // 2019 請使用 Microsoft.Data.SqlClient
```
* 在 button1_Click 輸入以下程式
```csharp=
string str = "Server=db.ocu.tw,2433;";
str += "User ID=s10815XXX;"; // 請同學自行改成自已的學號
str += "Password=s10815XXX@ocu.edu.tw;";
str += "Initial Catalog=db10815XXX;";
using (SqlConnection con = new SqlConnection(str)) {
con.Open(); // 請確定資料表中沒有 T0006 這筆
string sql = "insert into 老師資料表 values ('T0006', '宋七', '人工智慧')";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
cmd.ExecuteNonQuery();
}
}
MessageBox.Show("OK");
```
----
### 使用工具箱建立按鈕及文字
* 在Form1中建立label1(老師編號)、textBox1
* 在Form1中建立label2(老師姓名)、textBox2
* 在Form1中建立label3(研究領域)、textBox3
* 在Form1中建立button2,標題:新增1筆
![](https://i.imgur.com/Zp0XRpD.png)
----
### 在桌面中建立程式
* 在桌面中點擊兩下開啟程式視窗
* 在類別中輸入通用變數之宣告
```csharp=
public string Connection = "";
```
* 在 Form1_Load 中輸入以下程式
```csharp=
Connection = "Server=db.ocu.tw,2433;";
Connection += "User ID=s10715101;";
Connection += "Password=s10715101@ocu.edu.tw;";
Connection += "Initial Catalog=db10715101;";
```
----
### 在按鈕中建立程式
* 在 button2_Click 輸入以下程式
```csharp=
using (SqlConnection con = new SqlConnection(Connection)) {
con.Open();
string sql = "insert into 老師資料表 values ('" + textBox1.Text + "', '" + textBox2.Text + "', '" + textBox3.Text + "')";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
cmd.ExecuteNonQuery();
}
}
MessageBox.Show("OK");
```
----
### 使用工具箱建立按鈕-刪除
* 在Form1中建立button3,標題:刪除1筆
![](https://i.imgur.com/vFYZgBe.png)
----
### 在按鈕中建立程式
* 在 button3_Click 輸入以下程式
```csharp=
using (SqlConnection con = new SqlConnection(Connection)) {
con.Open();
string sql = "delete from 老師資料表 where 老師編號 = '" + textBox1.Text + "'";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
cmd.ExecuteNonQuery();
}
}
MessageBox.Show("OK");
```
----
### 使用工具箱建立按鈕-修改
* 在Form1中建立button4,標題:修改1筆
![](https://i.imgur.com/9wf7IB7.png)
----
### 在按鈕中建立程式
* 在 button4_Click 輸入以下程式
```csharp=
using (SqlConnection con = new SqlConnection(Connection)) {
con.Open();
string sql = "update 老師資料表 set 老師姓名 = '" + textBox2.Text + "', 研究領域 = '" + textBox3.Text + "' where 老師編號 = '" + textBox1.Text + "'";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
cmd.ExecuteNonQuery();
}
}
MessageBox.Show("OK");
```
----
### 使用工具箱建立按鈕-查詢1欄
* 在Form1中建立button5,標題:依編號查姓名
![](https://i.imgur.com/therJOE.png)
----
### 在按鈕中建立程式
* 在 button5_Click 輸入以下程式
```csharp=
using (SqlConnection con = new SqlConnection(Connection)) {
con.Open();
string sql = "select 老師姓名 from 老師資料表 where 老師編號 = '" + textBox1.Text + "'";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
textBox2.Text = cmd.ExecuteScalar().ToString();
}
}
MessageBox.Show("OK");
```
----
### 使用工具箱建立按鈕-查詢多欄
* 在Form1中建立button6,標題:依編號查多欄
![](https://i.imgur.com/n28nTK5.png)
----
### 在按鈕中建立程式
* 在 button6_Click 輸入以下程式
```csharp=
using (SqlConnection con = new SqlConnection(Connection)) {
con.Open();
string sql = "select 老師姓名, 研究領域 from 老師資料表 where 老師編號 = '" + textBox1.Text + "'";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
using (SqlDataReader reader = cmd.ExecuteReader()) {
if (reader.Read()) {
textBox2.Text = reader.GetString(0);
textBox3.Text = reader.GetString(1);
}
}
}
}
MessageBox.Show("OK");
```
----
### 使用工具箱建立按鈕-查詢多筆多欄
* 在Form1中建立button7,標題:依編號查多筆多欄
* 在Form1中建立dataGridView1
![](https://i.imgur.com/pTFfwz1.png)
----
### 在按鈕中建立程式
* 在 button7_Click 輸入以下程式
```csharp=
using (SqlConnection con = new SqlConnection(Connection)) {
con.Open();
string sql = "select * from 老師資料表 where 老師編號 like '" + textBox1.Text + "'";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) {
DataTable table = new DataTable();
adapter.Fill(table);
dataGridView1.DataSource = table;
}
}
}
MessageBox.Show("OK");
```
----
## 資料庫的基礎
* 資料與資料處理
* 資料庫
* 資料庫管理系統
* 資料庫系統發展的歷史演進
* 資料庫技術的發展趨勢
----
### 資料與資料處理
* 資料(Data)
* 定義:指收集但沒有經過整理和分析的原始數值、文字或符號,屬於資訊的原始型態。
* 範例:學校整班學生必修課程的一疊成績資料
* 資訊(Information)
* 定義:經過處理的資料,資料在經過整理和分析後,可以成為有用或可供決策的資訊。
* 資料處理(Process)
![](https://vignette.wikia.nocookie.net/computing2k16/images/0/05/Data_Processing_Chart.jpg/revision/latest?cb=20160202223403 =40%x40%)
----
### 資料儲存的階層
* 總共分為六個階層:位元(bit)、位元組(Byte)、欄位(Field)、記錄(Record)、檔案(File)和資料庫(Database)
![](http://images.slideplayer.dk/16/5118742/slides/slide_7.jpg =70%x70%)
----
### 資料庫的組成與定義
* 資料庫(Database)
* 資料庫管理系統(Database Management System,DBMS)
* 定義:是一個儲存資料的電子文件檔案櫃
![](http://slideplayer.com/5383533/17/images/36/Organizational+Database+Systems.jpg =700x400)
----
### 資料的模型建置
* 資料塑模:將真實東西轉換成模型,這是一種分析客戶需求的技術。
![](http://4.bp.blogspot.com/-rDUIxT2zMes/VUGJTIDpAJI/AAAAAAAAPqg/Qhla9F1pdvQ/s1600/data-model2.png =500x400)
----
#### 資料塑模的元素
* 實體:在真實世界識別出的東西
* 如:學生、老師、員工、課程
* 屬性:每一個實體擁有一些特性
* 如:學生的學號、姓名、電話、地址
* 關聯性:在二個或多個實體之間擁有的關係
* 如:一對一(老師-員工)
* 如:一對多(老師-學生)
* 如:多對多(學生-課程)
----
#### 資料塑模的羅輯關聯性
![](http://slidesplayer.com/11539852/62/images/13/1-1-2+%E8%B3%87%E6%96%99%E5%A1%91%E6%A8%A1-%E9%82%8F%E8%BC%AF%E9%97%9C%E8%81%AF%E8%B3%87%E6%96%99%28%E9%97%9C%E8%81%AF%E6%80%A72%29.jpg)
----
#### 檔案處理方式的問題
* 結構與資料相依
* 資料分隔與孤立
* 資料沒有集中管理。
* 檔案格式不相容。
* 更新系統困難。
* 資料重複與不一致
* 多使用者問題
* 安全問題
* 資料完整性問題
----
#### 使用資料庫的目的
* 多人使用,資料共享。
* 資料一致和最少的資料重複。
* 資料獨立(相反的是資料相依)。
* 改進資料完整性問題。
* 更佳的資料安全管理。
* 同步與交易管理。
* 資料備份與回復。
----
#### 資料庫系統的發展流程
* 資料庫系統的演進
* 網路與階層式資料庫
* 關聯式資料庫模型
* SQL結構化查詢語言
* 物件導向式資料模型與主從架構
---
### 資料庫系統
* 四大組成元件
* 資料庫系統架構
* 資料庫綱要間的對映
* 邏輯資料庫獨立
* 實體資料庫獨立
----
#### 四大組成元件
* 使用者(User)、資料(Data)
* 軟體(Software)、硬體(Hardware)
![](http://player.slidesplayer.com/62/11475834/slides/slide_3.jpg =800x600)
----
#### 資料庫綱要(Schema)
* 外部綱要(External)
* 概念綱要、邏輯綱要(Conceptual/Logical)
* 內部綱要(Internal)
![](http://player.slidesplayer.com/61/11307854/slides/slide_26.jpg)
----
#### 資料庫系統架構說明
* 外部綱要(External)
* 使用者觀點(View)
* 依不同使用者篩選條件
* 過濾部分欄位和資料代碼轉換
* 概念綱要(Conceptual)
* 管理師觀點(Design)
* 最完整的邏輯性設計、規劃描述
* 包括資料所有欄位和及關聯性
* 內部層(Internal)
* 實際儲存(Data)
* 定義資料各欄位型別、長度
* 定義那些欄位需要建立索引
----
#### 資料庫綱要間的對映
![](http://player.slidesplayer.com/61/11307854/slides/slide_31.jpg)
----
#### 邏輯資料獨立
* 外部層<->概念層
![](http://player.slidesplayer.com/61/11307854/slides/slide_35.jpg =600x400)
----
#### 實體資料獨立
* 概念層<->實體層
![](http://player.slidesplayer.com/61/11307854/slides/slide_36.jpg =600x400)
---
### 資料庫設計
* 三層資料模型
----
* 概念資料模型(Conceptual)
* 邏輯資料模型(Logical)
* 內部資料模型(Internal)
![](https://image-private.slidesharecdn.com/database03-180315035915/95/slide-4-638.jpg?hdnea=acl=/database03-180315035915/95/slide-4-638.jpg*~exp=1521086816~hmac=b49e5b55005ffe40b7c330fe149843092225e0231c477aaea568c5fb6555ee46&cb=1521086469 =800x600)
---
#### 概念資料模型
* ERM:實體關聯模型(E-R Model)
* 實體(Entity):真實世界的物件
* 屬性(Attribute):物件的特性
* 關聯(Relationship):兩實體間的關係
![](http://slidesplayer.com/11725544/65/images/8/3-1-1+%E6%A6%82%E5%BF%B5%E8%B3%87%E6%96%99%E6%A8%A1%E5%9E%8B-%E5%9C%96%E4%BE%8B+%E8%B3%87%E6%96%99%E5%BA%AB%28DB%29+ch03.jpg =700x400)
----
#### 邏輯資料模型
* 關聯式資料模型:Relational Data Modal
* 資料結構:欄位名稱定義(中文)
* 資料操作或運算:資料檢查、動作
* 完整性限制條件:資料內容檢查
![](https://image-private.slidesharecdn.com/database03-180315061132/95/slide-11-638.jpg?hdnea=acl=/database03-180315061132/95/slide-11-638.jpg*~exp=1521094660~hmac=7f3f9dda8c967cf6528da05d8bd2eea04eab524945bddcb8579e7dcf7bbb15ec&cb=1521094357 =700x400)
----
#### 實體資料模型
* 資料庫管理系統建立
* 欄位定義:型別、長度(英文)
* 關聯設定:建立關聯表(Relation)
* 索引設定:建立索引表(Index)
![](http://www.ocu.tw/class/database/slide-13-638.jpg =700x400)
---
### 資料庫設計軟體
* Microsoft資料庫管理系統:SQL Server
* 版本:SQL Server R2 Express With Tools
* 網址:[下載](http://120.109.105.10:8080/download/SQLEXPRWT_x64_CHT.exe)
* MySQL資料庫
* 網址:[下載](http://120.109.105.10:8080/download/xampp-win32-5.6.32-0-VC11-installer.exe)
* 資料庫規劃:Navicat Data Modeler
* 網址:[下載](http://120.109.105.10:8080/download/modeler021_ct_x64.exe)
* 資料庫管理:Navicat for SQL Server
* 網址:[下載](http://120.109.105.10:8080/download/navicat120_sqlserver_ct_x64.exe)
---
### 第一次作業題目
* 請以書面式繳交,打字或書寫皆可
* 請註明學號、姓名
* 請參考指定教科書的題目
* 繳交期限:2018/04/12
----
1. 第一章問答題第1, 2題
* 請說明何謂資料(Data)?何謂資訊(Information)?
* 請說明何謂資料階層(Data Hierarchy)和各階層資料之間的關係?
----
2. 第二章問答題第1, 6, 9題
* 請說明何謂資料庫系統(Database System)?資料庫環境的組成元件?
* 請說明資料庫綱要分成幾種?和ANSI/SPARC資料庫系統架構有何關係?
* 請說明資料庫系統的優缺點,至少各4項?
----
3. 第三章名詞解釋第9題,問答題第1, 7題
* 名詞解釋主鍵(Primary Key)、超鍵(Superkeys)、候選鍵(Candidate Keys)、替代鍵(Alternate Keys)和外來鍵(Foreign Keys)
* 請說明ANSI/SPARC資料庫系統架構對應的三層資料模型是什麼?這和資料庫設計有什麼關係?
* 請說明什麼是空值(Null Values)?空值的意義為何?
----
4. 第四章問答題第1, 2題
* 請簡單的說明資料庫系統開發生命周期的五個階段?完整資料庫設計可以分成哪兩部分?
* 請使用圖例說明本書使用的資料庫設計方法論(Database Design Methodology)?邏輯資料庫設計的主要工作有哪兩項?
----
#### SQL結構化指令
* 請參考W3Schools:[連結](https://www.w3schools.com/sql/)
* 建立資料庫:Create Database
* 建立資料表:Create Table
* 建立索引:Create Index
* 修改資料表:Alter Table
----
#### 連結資料庫
* 執行Navicat for SQL Server
* 新增連線:輸入以下帳號資訊:密碼為ocu
![](https://i.imgur.com/FZFw825.png =400x500)
----
#### 建立資料庫:Create Database
* 新增查詢:在空白區輸入以下指令
* 語法:
```sql
Create Database _databasename_;
```
* 練習:_databasename_請輸入自已的學號
----
#### 建立資料表:Create Table
* 語法:
```sql
CREATE TABLE _table_name _(
_ column1 datatype_,
_ column2 datatype_,
_ column3 datatype_,
....
);
```
----
#### 建立紀錄:Insert Into
* 語法一:
```sql
INSERT INTO _table_name_
VALUES (_value1_,_ value2_,_ value3_, ...);
```
* 語法二:
```sql
INSERT INTO _table_name_ (_column1_,_ column2_,_ column3_, ...)
VALUES (_value1_,_ value2_,_ value3_, ...);
```
----
#### 查詢紀錄:Select From
* 語法一:
```sql
SELECT *
FROM _table_name_;
```
* 語法二:
```sql
SELECT _column1_,_ column2, ..._
FROM _table_name_;
```
---
## Zuvio即時反饋系統
* 網址:[https://irs.zuvio.com.tw/](https://irs.zuvio.com.tw/)
* 登入:已註冊過,可以直接登入
* 帳號:s105XXXXXX@ocu.edu.tw
* 密碼:123
* 更改密碼:為保護課程權益請一定要修改
* 設定->帳號設定->變更密碼
* 請選擇課程:資料庫系統
---
## 期末報告說明(105級)
* 採分組報告:2-4人為一組,請選1人為組長
* 擬定系統名稱:以小型專案資料庫系統為優先
* 資料庫系統:ACCESS/MS SQL/MYSQL等
* 資料庫規模:5個資料表以上,每個資料表10筆
* 資料庫分析:ER關聯圖、資料表結構等文件
* 資料庫參考:可由政府資料開放平台擷取
* 系統規劃:PHP/ASP/C#/EXCEL VBA/ACCESS
* 系統功能:至少1個表單,需繪製功能組織圖
* 系統設計:包括畫面設計、程式設計、功能測試
* 書面報告:以DOC及PPT繳交,PPT需以摘要列印
* 上台報告:每組報告5-10分鐘,依組數而定
----
{%pdf https://www.ocu.tw/class/database/1062.pdf %}
----
## 使用 Excel VBA
* 下載Navicat for SQL Server:[下載](http://www.ocu.tw/class/database/navicat120_sqlserver_ct_x64.exe)
* 連線名稱:ocu
* 主機:ocu.database.windows.net
* 初始資料庫:ocu
* 使用者名稱:ocuguest
* 密碼:Ocu27016855
* 下載範例檔:[下載](http://www.ocu.tw/class/database/ReadSQLDatabase.xls)
----
### SQL 指令實例練習(Where)
* 請捉取客戶資料表以下資料:Customer
* 列出前1000筆姓氏為王的客戶
* 列出郵遞區號為404的客戶
* 列出地址為彰化市的客戶
* 列出姓名中有惠的客戶
* 列出手機號碼為0922的客戶
* 列出生日為8月的客戶
* 列出住在文心路上的客戶
* 列出郵遞區號為404和406的客戶
----
### SQL 指令實例參考(Where)
* SQL 指令是唯一解,以下僅供參考
```sql=
select * from Customer where CName like '王%'
select * from Customer where Zone like '404%'
select * from Customer where ADDR like '彰化市%'
select * from Customer where CName like '%惠%'
select * from Customer where Mobile like '0922%'
select * from Customer where BDate like '____08__'
select * from Customer where ADDR like '%文心路%'
select * from Customer where Zone like '404%' or Zone like '406%'
select * from Customer where substring(Zone, 1, 3) in ('404','406')
```
----
### SQL 指令實例練習(Group)
* 請捉取客戶資料表以下資料:Customer
* 請列出各郵遞區號客戶的人數
* 請列出各姓氏的人數統計,且人數多的在前面
* 請列出各月份生日的人數統計,依月份順序列出
----
### SQL 指令實例參考(Group)
```sql=
select substring(Zone, 1, 3), count(*)
from Customer
where Zone <> ''
group by substring(Zone, 1, 3)
order by count(*) desc
select substring(CName, 1, 1), count(*)
from Customer
where CName <> ''
group by substring(CName, 1, 1)
order by count(*) desc
select substring(BDate, 5, 2), count(*)
from Customer
where BDate <> ''
group by substring(BDate, 5, 2)
order by substring(BDate, 5, 2)
```
---
### Excel VBA 專案實作
* Excel VBA範例檔:[下載](http://www.drmaster.com.tw/download/example/MI11601_Example.rar)
* 專題演練範例檔:[下載](http://www.ocu.tw/class/database/ReadSQLDatabase.xls)
* 功能實作:
* 客戶資料:請實作廠商資料
* 客戶查詢:請實作廠商查詢
* 客戶刪除:請實作廠商刪除
* 客戶新增:請實作廠商新增
----
### Excel VBA 專案表單實作
* 專題演練範例檔:[下載](http://www.ocu.tw/class/database/ExcelVBAForm.xls)
* 功能實作:
* 系統首頁:請實作廠商資料管理
* 客戶資料管理:請實作廠商資料管理
---
## 期末專題製作資料處理
* 資料擷取:政府資料開放平台[連結](https://data.gov.tw/)
* 下載CSV檔:臺北世界美食餐廳名單[下載](https://beta.data.taipei/api/getDatasetInfo/downloadResource?id=d26b2e0e-ca5e-4989-8bb8-f028d043c42f&rid=c81d95d5-3249-4e5c-a5a4-8b87d8abd3e7)
* 去除不必要資料:表頭、表尾、空白資料等
* 另存成Excel檔:檔案類型xls或xlsx檔
* 開啟Access空白資料庫檔:
* 外部資料->新增資料來源->從檔案->Excel檔
* 選擇資料來源:選擇上面的Excel檔
* 選擇目的地:選擇資料庫的新資料表
* 選擇打勾:第一列是欄名
* 設定主索引欄位:若無則新增一欄識別欄
----
### Access資料庫
* 範例檔下載:[連結](http://www.ocu.tw/class/database/Pos.mdb)
* Excel檔更正:[連結](http://www.ocu.tw/class/database/ExcelVBAAccess.xls)
* 資料表:建立、修改欄位、資料匯入、資料刪除
* 設計模式:設定資料表欄位(Schema)
* 檢視模式:瀏覽資料表紀錄(Select * from)
* 查詢:建立、SELECT、INSERT、DELETE、UPDATE
* SQL模式:以指令式寫出SQL指令
* 設計模式:以圖形界面設計SQL指令
* 表單:建立表單、表單精靈
* 報表:建立報表、報表精靈
----
### Access資料庫+Excel VBA案例說明
* 資料庫下載:ExcelVBAProject.accdb[連結](http://www.ocu.tw/class/database/ExcelVBAProject.accdb)
* Excel檔下載:ExcelVBAProject.xlsm[連結](http://www.ocu.tw/class/database/ExcelVBAProject.xlsm)
* 餐廳查詢:增加餐廳類別查詢
* 餐廳新增:增加流水號計算功能
* 餐廳刪除:依編號刪除
{"metaMigratedAt":"2023-06-14T15:47:34.570Z","metaMigratedFrom":"Content","title":"資料庫系統","breaks":true,"contributors":"[{\"id\":\"9eed60a5-6546-4dfd-8445-07f81bcfde52\",\"add\":21716,\"del\":9913}]"}