# 資料庫期末專案-線上補教平台課程與報名系統
## 一、專案說明
### 1.情景說明
隨著線上學習趨勢興起,我想模擬一個提供國中、高中各科線上課程,由老師上傳教材、安排課程時段,學生可線上報名與查詢成績的資料庫,同時支援追蹤繳費與退費情況,於是我選擇將線上教學平台為題並以此延伸。
### 2.資料表
|資料表名稱|欄位摘要|
|--------|-------|
|**`Student`**|`student_id` (PK), `name`, `email`, `phone`|
|**`Teacher`**|`teacher_id` (PK), `name`, `subject`|
|**`Course`**|`course_id` (PK), `title`, `subject`, `level`, `teacher_id` (FK), `max_seats`|
|**`Schedule`**|`schedule_id` (PK), `course_id` (FK), `start_time`, `end_time`, `room`|
|**`Enrollment`**|`student_id` + `course_id` (PKs), `grade`, `status`|
|**`Payment`**|`payment_id` (PK), `student_id` (FK), `course_id` (FK), `amount`, `pay_date`, `status` |
## 二、專題實作內容
### 1.資料庫需求分析與規劃
#### 系統功能構想
|系統功能|功能描述|
|------|-------|
|1.師生管理|學生與教師建立帳號並登入平台|
|2.課程建立|教師可新增課程並設定課程名稱、描述與費用|
|3.開課與時間排程|課程可安排上課時間、地點(實體或線上)、期程|
|4.學生選課|學生可選擇課程並加入學習行程|
|5.查詢課表/修課紀錄|學生可查詢已選課與修課情況,查看成績或進度|
|6.評分與成績記錄|教師對學生課程學習表現進行評分|
|7.課程繳費|學生需對選課繳交對應費用|
|8.課程查詢與搜尋|搜尋課程標題、分類、老師|
|9.熱門課程統計|管理員查詢熱門課程、選課人數統計|
|10.繳費狀況查詢/管理|學生與管理員查詢已繳/未繳課程繳費狀況|
#### ER Diagram

#### 正規化及主、外鍵設計原因
- **第一正規化 :**
```
第一正規化(1NF):
每個欄位只能有一個值(不可為陣列或重複欄位)。
所有資料表中的欄位皆為原子值。
```
**Student**
|student_id|name|email|phone|
|----------|----|-----|-----|
|1|王小明|ming@student.com|0911222333|
|2|林小美|mei@student.com|0933444555|
**Teacher**
|teacher_id|name|subject|
|----------|----|-------|
|1|陳老師|數學|
|2|李老師|英文|
**Course**
|course_id|title|subject|level|teacher_id|max_seats|
|---------|-----|-------|-----|----------|---------|
|1|國中數學進階班|數學|國中|1`(陳老師)`|30|
|2|高中英文作文班|英文|高中|2`(李老師)`|20|
**Schedule**
|schedule_id|course_id|start_time|end_time|room|
|-----------|---------|----------|--------|----|
|1|1`(國中數學進階班)`|2025-07-01 09:00:00.000|2025-07-01 11:00:00.000|A101|
|2|2`(高中英文作文班)`|2025-07-02 13:00:00.000|2025-07-02 15:00:00.000|B202|
**Enrollment**
|student_id|course_id|grade|status|
|----------|---------|-----|------|
|1`(王小明)`|1`(國中數學進階班)`|88.5|正常|
|6`(吳怡婷)`|5`(國文閱讀理解班)`|79|退選|
**Payment**
|payment_id|student_id|course_id|amount|pay_date|status|
|----------|----------|---------|------|--------|------|
|1|1`(王小明)`|1`(國中數學進階班)`|3000|2025-06-15|已繳|
|2|2`(林小美)`|2`(高中英文作文班)`|3200|2025-06-16|已繳|
- **第二正規化 :**
```
第二正規化(2NF):
在符合 1NF 的前提下,資料表中「每個非主鍵欄位」都必須完全依賴整個主鍵,而非部分主鍵。
```
|資料表|主鍵|是否有部分相依?|結論|
|-----|---|-------------|----|
|`Enrollment`|(`student_id`, `course_id`)|否(grade,status完全依賴此複合主鍵)| 符合 2NF |
|其他資料表|各自為單一主鍵|無組合鍵|符合 2NF|
- **第三正規化 :**
|資料表|非主鍵欄位是否傳遞依賴其他非主鍵欄位?|
|-----|-------------------------------|
|`Student`|`name`, `email`, `phone` → 只依賴 `student_id`|
|`Teacher`| 同上(`teacher_id` 為唯一主鍵)|
|`Course`|`title`, `subject`,`level`,`teacher_id`,`max_seats` → 都依賴主鍵|
|`Schedule`|`start_time`,`end_time`,`room` → 依賴`schedule_id`;`course_id`為外鍵|
|`Enrollment`|`grade`,`status`→完全依賴複合主鍵(`student_id`, `course_id`)|
|`Payment`|所有欄位都直接依賴`payment_id`,而不是其他欄位|
資料表皆符合 第三正規化
- **設計原因:**
使用 Auto Increment 整數主鍵 確保唯一性與簡化關聯。
Enrollment 使用複合主鍵是因為一位學生不能選同一門課兩次。
外鍵約束確保資料一致性(例如課程一定對應一位教師,繳費一定對應選課)。
### 2.資料表建立與基本操作
#### Schema 建立與初始資料插入 (CREATE TABLE, INSERT)。
- 建立```Student```學生資料表並插入資料
```sql
CREATE TABLE Student (
student_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20)
);
INSERT INTO Student (name, email, phone) VALUES
('王小明', 'ming@student.com', '0911222333'),
('林小美', 'mei@student.com', '0933444555'),
('李俊宏', 'john@student.com', '0922111222'),
('陳雨柔', 'yurou@student.com', '0977888999'),
('劉大志', 'dazhi@student.com', '0911000111'),
('吳怡婷', 'iting@student.com', '0922333444'),
('周志豪', 'hao@student.com', '0988777666'),
('鄭雅文', 'yaya@student.com', '0966555444'),
('蔡佳恩', 'chiaen@student.com', '0955666777'),
('張博翔', 'boshiang@student.com', '0988112233'),
('張心妍', 'xinyan@student.com', '0988777123'),
('林怡君', 'yijun2@student.com', '0923456782'),
('黃志明', 'zhiming3@student.com', '0934567893'),
('張嘉玲', 'jialing4@student.com', '0945678904'),
('劉建宏', 'jianhong5@student.com', '0956789015'),
('王詩涵', 'shihan6@student.com', '0967890126'),
('李欣怡', 'xinyi7@student.com', '0978901237'),
('周明軒', 'mingxuan8@student.com', '0989012348'),
('蔡依婷', 'yiting9@student.com', '0912345609'),
('郭子豪', 'zihao10@student.com', '0923456710'),
('徐佳慧', 'jiahui11@student.com', '0934567821'),
('謝孟哲', 'mengzhe12@student.com', '0945678932'),
('許柔柔', 'rourou13@student.com', '0956789043'),
('范逸群', 'yiqun14@student.com', '0967890154'),
('鄭雅婷', 'yating15@student.com', '0978901265'),
('洪志偉', 'zhiwei16@student.com', '0989012376'),
('宋佳琳', 'jialin17@student.com', '0912345487'),
('邱俊宏', 'junhong18@student.com', '0923456598'),
('曹婉如', 'wanru19@student.com', '0934567609'),
('何家豪', 'jiahao20@student.com', '0945678710'),
('馮雅文', 'yawan21@student.com', '0956789821'),
('潘志強', 'zhiqiang22@student.com', '0967890932'),
('鄒雅婷', 'yating23@student.com', '0978901043'),
('賴俊傑', 'junjie24@student.com', '0989012154'),
('藍品妤', 'pinyu25@student.com', '0912345265'),
('葉家瑜', 'jiayu26@student.com', '0923456376'),
('呂家豪', 'jiahao27@student.com', '0934567487'),
('丁雅文', 'yawan28@student.com', '0945678598'),
('江明軒', 'mingxuan29@student.com', '0956789609'),
('蘇嘉玲', 'jialing30@student.com', '0967890710');
```
- 建立```Teacher```教師資料表並插入資料
```sql
CREATE TABLE Teacher (
teacher_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
subject VARCHAR(50)
);
INSERT INTO Teacher (name, subject) VALUES
('陳老師', '數學'),
('李老師', '英文'),
('黃老師', '物理'),
('林老師', '化學'),
('謝老師', '國文');
```
- 建立```Course```課程資料表並插入資料
```sql
CREATE TABLE Course (
course_id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
subject VARCHAR(50),
level VARCHAR(20),
teacher_id INT,
max_seats INT,
FOREIGN KEY (teacher_id) REFERENCES Teacher(teacher_id)
);
INSERT INTO Course (title, subject, level, teacher_id, max_seats) VALUES
('國中數學進階班', '數學', '國中', 1, 30),
('高中英文作文班', '英文', '高中', 2, 25),
('高中物理衝刺班', '物理', '高中', 3, 20),
('國中化學先修班', '化學', '國中', 4, 20),
('國文閱讀理解班', '國文', '高中', 5, 20),
('高中英文會話班', '英文', '高中', 2, 15);
```
- 建立```Schedule```課程時段資料表並插入資料
```sql
CREATE TABLE Schedule (
schedule_id INT PRIMARY KEY AUTO_INCREMENT,
course_id INT,
start_time DATETIME,
end_time DATETIME,
room VARCHAR(50),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
INSERT INTO Schedule (course_id, start_time, end_time, room) VALUES
(1, '2025-07-01 09:00:00', '2025-07-01 11:00:00', 'A101'),
(2, '2025-07-02 13:00:00', '2025-07-02 15:00:00', 'B202'),
(3, '2025-07-03 10:00:00', '2025-07-03 12:00:00', 'C303'),
(4, '2025-07-04 14:00:00', '2025-07-04 16:00:00', 'D101'),
(5, '2025-07-05 15:00:00', '2025-07-05 17:00:00', 'A202'),
(6, '2025-07-06 08:30:00', '2025-07-06 10:30:00', 'B101');
```
- 建立```Enrollment```選課紀錄資料表並插入資料
```sql
CREATE TABLE Enrollment (
student_id INT,
course_id INT,
grade DECIMAL(5,2),
status VARCHAR(20),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Student(student_id),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
INSERT INTO Enrollment (student_id, course_id, grade, status) VALUES
(1, 1, 88.5, '正常'),
(1, 2, 85.5, '正常'),
(1, 4, 79.0, '正常'),
(2, 2, 91.0, '正常'),
(2, 3, NULL, '正常'),
(3, 2, 82.0, '正常'),
(3, 3, NULL, '正常'),
(3, 5, 88.0, '正常'),
(4, 1, 85.0, '正常'),
(4, 5, NULL, '正常'),
(5, 1, 87.0, '正常'),
(5, 4, NULL, '正常'),
(6, 5, 76.0, '退選'),
(6, 6, NULL, '正常'),
(7, 2, 82.5, '正常'),
(7, 4, 76.5, '正常'),
(8, 3, NULL, '正常'),
(8, 6, NULL, '正常'),
(9, 2, 90.0, '正常'),
(9, 5, 90.0, '正常'),
(10, 1, NULL, '正常'),
(10, 3, 78.0, '正常'),
(11, 1, NULL, '正常'),
(12, 4, 80.0, '正常'),
(13, 6, NULL, '正常'),
(14, 2, 68.5, '正常'),
(15, 3, NULL, '正常'),
(16, 1, 91.0, '正常'),
(17, 5, 84.0, '正常'),
(18, 4, NULL, '退選'),
(19, 2, 77.5, '正常'),
(20, 6, NULL, '正常'),
(21, 3, 83.0, '正常'),
(22, 1, NULL, '正常'),
(23, 5, 89.0, '正常'),
(24, 4, NULL, '正常'),
(25, 6, 70.0, '正常'),
(26, 2, NULL, '正常'),
(27, 3, 88.5, '正常'),
(28, 1, NULL, '正常'),
(29, 5, 93.0, '正常'),
(30, 6, NULL, '正常');
```
- 建立```Payment```繳費紀錄資料表並插入資料
```sql
CREATE TABLE Payment (
payment_id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT,
course_id INT,
amount DECIMAL(10,2),
pay_date DATE,
status VARCHAR(20),
FOREIGN KEY (student_id) REFERENCES Student(student_id),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
INSERT INTO Payment (student_id, course_id, amount, pay_date, status) VALUES
(1, 1, 3000.00, '2025-06-15', '已繳'),
(2, 2, 3200.00, '2025-06-16', '已繳'),
(3, 3, 3500.00, '2025-06-17', '已繳'),
(4, 1, 3000.00, '2025-06-18', '已繳'),
(5, 4, 2800.00, '2025-06-19', '已繳'),
(6, 5, 2700.00, '2025-06-20', '退費'),
(7, 2, 3200.00, '2025-06-21', '已繳'),
(8, 6, 2600.00, '2025-06-22', '已繳'),
(9, 5, 2700.00, '2025-06-23', '已繳'),
(10, 3, 3500.00, '2025-06-24', '已繳'),
(1, 2, 3200.00, '2025-06-25', '已繳'),
(3, 5, 2700.00, '2025-06-26', '已繳'),
(11, 5, NULL, NULL, '未繳');
(12, 4, 2800, '2025-06-27', '已繳'),
(13, 6, NULL, NULL, '未繳'),
(14, 2, 3200, '2025-06-28', '已繳'),
(15, 3, NULL, NULL, '未繳'),
(16, 1, 3000, '2025-06-29', '已繳'),
(17, 5, 2700, '2025-06-30', '已繳'),
(18, 4, NULL, NULL, '未繳'),
(19, 2, 3200, '2025-07-01', '已繳'),
(20, 6, NULL, NULL, '未繳'),
(21, 3, 3500, '2025-07-02', '已繳'),
(22, 1, NULL, NULL, '未繳'),
(23, 5, 2700, '2025-07-03', '已繳'),
(24, 4, NULL, NULL, '未繳'),
(25, 6, 2600, '2025-07-04', '已繳'),
(26, 2, NULL, NULL, '未繳'),
(27, 3, 3500, '2025-07-05', '已繳'),
(28, 1, NULL, NULL, '未繳'),
(29, 5, 2700, '2025-07-06', '已繳'),
(30, 6, NULL, NULL, '未繳'),
(1, 4, 2800, '2025-07-07', '已繳'),
(2, 3, NULL, NULL, '未繳'),
(3, 2, 3200, '2025-07-08', '已繳'),
(4, 5, NULL, NULL, '未繳'),
(5, 1, 3000, '2025-07-09', '已繳'),
(6, 6, NULL, NULL, '未繳'),
(7, 4, 2800, '2025-07-10', '已繳'),
(8, 3, NULL, NULL, '未繳'),
(9, 2, 3200, '2025-07-11', '已繳'),
(10, 1, NULL, NULL, '未繳');
```
#### 索引與效能考量:為常用查詢欄位建立索引
- 根據「科目」查詢課程
```sql
CREATE INDEX idx_subject ON Course(subject);
```
- 依據教師查詢開課資料
```sql
CREATE INDEX idx_teacher_id ON Course(teacher_id);
```
- 依課程查詢修課學生或成績統計
```sql
CREATE INDEX idx_course_id_enrollment ON Enrollment(course_id);
```
- 依學生查詢選課紀錄、成績的效率
```sql
CREATE INDEX idx_student_id_enrollment ON Enrollment(student_id);
```
- 查詢特定繳費狀態(如已繳、未繳)的資料
```sql
CREATE INDEX idx_payment_status ON Payment(status);
```
- 依學生查詢繳費紀錄
```sql
CREATE INDEX idx_student_id_payment ON Payment(student_id);
```
#### 交易 (Transaction) 機制:BEGIN、COMMIT、ROLLBACK 範例
- **正常交易流程**
```sql
--新增測試用資料
INSERT INTO Student (student_id, name, email, phone) VALUES (99, '測試學生', 'test99@test.com', '000');
INSERT INTO Course (course_id, title, subject, level, teacher_id, max_seats) VALUES (99, '測試課程', '測試', '初級', 1, 50);
--開始交易
START TRANSACTION;
-- 新增付款資料
INSERT INTO Payment (student_id, course_id, amount, pay_date, status)
VALUES (99, 99, 9999.99, CURDATE(), '已繳');
--確認付款資料
SELECT * FROM Payment WHERE student_id = 99 AND course_id = 99;
--送出交易
COMMIT;
--確認資料寫入
SELECT * FROM Payment WHERE student_id = 99 AND course_id = 99;
```
- **取消交易**
```sql
--清除測試資料並再次輸入
DELETE FROM Payment WHERE student_id = 99;
--開始交易
START TRANSACTION;
-- 新增付款資料
INSERT INTO Payment (student_id, course_id, amount, pay_date, status)
VALUES (99, 99, 9999.99, CURDATE(), '已繳');
--確認資料並發現有誤
SELECT * FROM Payment WHERE student_id = 99 AND course_id = 99;
--取消整筆交易
ROLLBACK;
--確認資料並沒有被寫入
SELECT * FROM Payment WHERE student_id = 99 AND course_id = 99;
```
### 3.進階 SQL 功能應用
#### 複雜查詢與子查詢:
- **查詢各課程報名人數及平均成績(只列出報名人數超過 3 人的課程)**
```sql
SELECT
C.course_id,
C.title,
COUNT(E.student_id) AS total_students,
AVG(E.grade) AS avg_grade
FROM Course C
JOIN Enrollment E ON C.course_id = E.course_id
WHERE E.status = '正常'
GROUP BY C.course_id, C.title
HAVING COUNT(E.student_id) > 3;
```

- **查詢有未繳費紀錄的學生清單**
```sql
SELECT S.student_id, S.name
FROM Student S
WHERE S.student_id IN (
SELECT DISTINCT student_id
FROM Payment
WHERE status = '未繳'
);
```

- **建立「熱門課程視圖」,顯示課程名稱與報名人數**
```sql
CREATE OR REPLACE VIEW View_HotCourses AS
SELECT C.course_id, C.title, COUNT(E.student_id) AS enroll_count
FROM Course C
LEFT JOIN Enrollment E ON C.course_id = E.course_id
GROUP BY C.course_id, C.title
ORDER BY enroll_count DESC;
--查詢視圖
SELECT * FROM View_HotCourses WHERE enroll_count > 5;
```

- **建立「學生課程成績統計試圖」,顯示學生的修課數量,成績平均分數及修課狀態**
```sql
CREATE OR REPLACE VIEW vw_StudentPerformanceSummary AS
SELECT
S.student_id,
S.name AS student_name,
COUNT(E.course_id) AS total_courses_enrolled,
COUNT(CASE WHEN E.grade IS NOT NULL THEN 1 END) AS graded_courses,
ROUND(AVG(E.grade), 2) AS avg_grade,
SUM(CASE WHEN E.status = '退選' THEN 1 ELSE 0 END) AS dropped_courses
FROM
Student S
LEFT JOIN
Enrollment E ON S.student_id = E.student_id
GROUP BY
S.student_id, S.name;
--查詢視圖
SELECT * FROM vw_StudentPerformanceSummary;
```

#### Stored Procedure / Function:實作商業邏輯或報表計算
- **建立產生學生成績報表的Stored Procedure**
```
目標功能
產生某一學生的修課紀錄,包括:
課程名稱、成績(grade)、修課狀態(status)。
```
```sql
CREATE PROCEDURE sp_GetStudentReport(IN p_student_id INT)
SELECT
C.title AS course_title,
E.grade,
E.status
FROM
Enrollment E
JOIN
Course C ON E.course_id = C.course_id
WHERE
E.student_id = p_student_id;
--呼叫
CALL sp_GetStudentReport(2);
```

- **建立計算課程平均成績Function**
```
目標功能
查詢指定課程的平均成績並在沒有成績時回傳 0。
```
```sql
CREATE FUNCTION fn_GetCourseAvgGrade(courseId INT)
RETURNS DECIMAL(5,2)
DETERMINISTIC
RETURN (
SELECT IFNULL(AVG(grade), 0)
FROM Enrollment
WHERE course_id = courseId AND grade IS NOT NULL
);
--呼叫
SELECT fn_GetCourseAvgGrade(2) AS avg_grade;
```

#### Trigger設計
```
繳費確認
功能構想
觸發時機:當 Payment 資料表有「新增(INSERT)」一筆資料後執行。
作用對象:對剛新增的這筆繳費資料(用 NEW 代表新增的行)。
功能描述:
它會去更新 Enrollment 表中,student_id 和 course_id 與剛新增的繳費資料相同的紀錄。
更新的欄位是 status,將它設成 '報名完成',但條件是繳費資料的 status 必須是 '已繳'。
```
```sql
CREATE TRIGGER trg_PaymentAfterInsert
AFTER INSERT ON Payment
FOR EACH ROW
UPDATE Enrollment
SET status = '報名完成'
WHERE student_id = NEW.student_id AND course_id = NEW.course_id AND NEW.status = '已繳';
--新增資料
INSERT INTO Payment (student_id, course_id, amount, pay_date, status) VALUES
(1, 4, 2800.00, CURDATE(), '已繳');
--檢視觸發
SELECT student_id, course_id, status
FROM Enrollment
WHERE student_id = 1 AND course_id = 4;
```

#### 安全性與權限管理:建立 ROLE
```sql
--建立角色
CREATE ROLE course_manager;
CREATE ROLE viewer;
```
``course_manager``角色:給予能全面管理課程資料的權限。
``viewer``角色:只給予查詢(SELECT)權限,適合只看不動資料的使用者。
```sql
--授權角色權限
GRANT SELECT, INSERT, UPDATE, DELETE ON OnlineEduDB.* TO course_manager;
GRANT SELECT ON OnlineEduDB.* TO viewer;
```
``course_manager``角色有增(INSERT)、刪(DELETE)、改(UPDATE)、查(SELECT)完整 CRUD 權限。
``viewer``角色只有查詢(SELECT)權限,不能修改資料。
```sql
--建立使用者並指派角色
CREATE USER 'manager_user'@'%' IDENTIFIED BY 'password123';
CREATE USER 'viewer_user'@'%' IDENTIFIED BY 'password123';
GRANT course_manager TO 'manager_user'@'%';
GRANT viewer TO 'viewer_user'@'%';
```
建立兩個使用者:
manager_user:系統管理員,管理課程及報名資料。
viewer_user:只能瀏覽資料的用戶。
授予前述角色給這兩個使用者,方便統一管理和修改權限。
```sql
--預設啟用角色
SET DEFAULT ROLE course_manager FOR 'manager_user'@'%';
SET DEFAULT ROLE viewer FOR 'viewer_user'@'%';
```
設定登入時使用的預設角色,確保使用者登入後自動擁有對應權限。
這樣使用者不需要每次登入手動啟用角色,提高使用便利性與安全。
### 4.功能測試
#### 功能查詢清單
```
於3.進階SQL功能應用有提及
```
#### 資料一致性與異常情況測試:外鍵約束、Transaction Rollback
- **資料一致性**
```
資料一致性確保資料在任何操作後都符合系統邏輯規則,避免出現「不合理」、「孤立」、「殘缺」資料。
在補教平台中,滿足之一致性需求:
學生只能選存在的課程。
繳費紀錄必須對應有效的學生與課程。
刪除教師時,必須先處理該教師開設的課程,否則資料會不完整。
```
- **外鍵約束**
異常測試:插入不合法資料
```sql
INSERT INTO Enrollment (student_id, course_id, grade, status)
VALUES (999, 1, 90, '正常');
```

- **Transaction Rollback**
```
於交易 (Transaction) 機制:BEGIN、COMMIT、ROLLBACK 範例提及過
```
#### 效能測試
- **單筆查詢測試**
```sql
EXPLAIN SELECT * FROM Enrollment WHERE student_id = 1;
```

- **大量資料測試**
```sql
--灌入大量測試資料
INSERT INTO Student (name)
SELECT CONCAT('TestStudent', n)
FROM (SELECT @row := @row + 1 AS n FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t1,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t2,
(SELECT @row := 0) r
) nums
WHERE n <= 10000;
--測試查詢是否依舊流暢
SELECT COUNT(*) FROM Student;
```

### 5.文件報告
#### 組員分工
|學號|姓名|工作內容|
|----------|----------|----------|
|411630600|吳侑澤|資料庫設計、SQL實作、DBeaver操作、文件撰寫|