MySQL
MySQL 的學習筆記,整理核心概念、實作範例與常用指令。
- Updated —
- May 29, 2026
- Topics —
- MySQL, 資料庫
資料庫系統
- 資料庫(Database)
1. 相關資料的集合(Collection of interrelated data)
2. 資訊架構(Information architecture)
Bit → Byte → Field → Record → File → Database - 資料庫管理系統(Database Management System, DBMS)
1. 一組程式用來管理資料
2. 資料庫管理系統提供一個方便且有效率的使用環境讓使用者來管理資料.
Oracle, SQL server, MYSQL, DB2, Informix,……
資料庫管理系統 (DBMS)
資料庫管理系統簡介
- 資料庫管理系統是一種系統軟體用來建立與管理資料庫
- 提供系統化的方式讓使用者及其他程式來存取及管理資料
- DBMS是資料庫與用戶或應用程式之間的介面,以確保資料的一致性與管理的方便性
資料庫管理系統DBMS( DataBase Management System )
AP (Aplication Program):
- 傳送資料請求給DBMS 查詢會員資料、儲存訂單
- EX: 網站、APP 、公司系統 #應用程式不能直接碰資料庫,要透過DBMS才能呼叫資料 使用者 → App → DBMS → 資料庫 Tool:
- 管理資料庫系統 EX: phpMyAdmin、 MySQL Workbench
- 分析工具、查詢工具 #管理員可以直接透過工具操作資料庫(查詢、修改) 管理員 → Tool → DBMS → 資料庫
資料庫管理系統的功能
- 管理資料 (Management of Data)
- 定義資料儲存的結構
- 提供資料維護的機制
- 確保資料的安全(系統當機,未經授權的存取,誤用,…)
- 提供多人使用下的同時存取控制機制
- 資料庫管理系統的目標
- 提供一個方便且有效率的使用環境讓使用者來存取及管理資料庫
資料庫管理系統伺服器 (DBMS Server)
DataBase Server:
- Instance : Memory 暫存記憶體+執行中的程式=關機就不見
- Memory Model Data:
- Tables
- Rows
- Columns
- Indexes ( 索引 ) Meta/ SQL: Meta Code ( 結構資訊 ) Plan ( 查詢計畫 ) SQL Statements ( SQL語句 )
- Process Model
- Reader
- Writer
- Logging : 記錄所有操作
- Checkpoint : 把資料同步到硬碟,可以防止資料遺失,加快復原速度。
- DataBase : Disk上的資料,永久存在,關機也不會消失
- Data
- Tables
- Rows
- Columns
- Indexes
- logs : 紀錄所有的變更,如果系統當機,可以還原資料 ( Recovery )
- Control Files : 紀錄資料庫結構資訊,例如:檔案的位置、資料庫的狀態。
資料執行流程: SQL指令傳進DBMS,Memory解析Plan(解析SQL指令),Reader讀取Disk裡的資料,再將資料放到Memory,最終回傳結果。 SQL → 解析 → 查Memory → 不夠讀Disk → 回傳
資料進到Memory先修改保存在這,同時寫入Log,Writer再寫入Disk,Checkpoint會執行同步紀錄。
SQL → 先寫Log → 改Memory → Writer寫Disk → Checkpoint同步
資料庫系統的使用者
應用程式設計師(Application programmer)
透過DML與資料庫互動(做資料維護)
開發AP的人
經驗豐富的使用者(Sophisticated users)
使用SQL來完成工作→ 使用者
專業使用者(Specialized users)
撰寫不同於傳統資料處理方式的特殊資料庫應用程式→ 使用者
一般(天真)使用者(Naive users)
使用他人寫好的應用程式與資料庫互動
資料庫管理者(Database administrator, DBA)
管理資料庫系統的所有活動
關聯式資料庫管理系統 (RDBMS)
簡介
由1970年Dr. E.F. Codd 提出的關聯式資料模型發展出來的資料庫管理系統
- 關聯式資料模型主要組成:
- 物件或關聯的集合(Collection of objects or relations)
- 關聯運算方法(Set of operators to act on the relations)
- 資料整合條件(Data integrity for accuracy and consistency)
- 關聯式資料庫管理系統
- 資料庫物件(Database Objects)
- 資料運算(Data Operations)
- 資料庫限制條件(Database Constraints)
關聯式資料庫管理系統的功能
- 儲存使用者的資料
- 提供安全與穩定的存取系統
- 提供多人線上同時存取
- 提供權限來做資料庫的管理
- 提供資料備份與回復的功能
- 支援結構化查詢語言(Structured Query Language, SQL)
用語
Table
橫欄 column
每一個欄位都必須命名而且必須設定資料型態和資料長度,用來存放欄位資料
資料列 Row
資料列是資料表中的一筆記錄資料
- Bit → Byte → Field → Record → File → Database
• Bit → Byte → Column → Row → Table → Database
整合
- 主鍵( Primary Key ): 用於識別每一横列的欄位組合
- 具有唯一性(Unique): 不能重複
- 不為空值(Not Null)
- 外來鍵( Foreign Key ): 用來連接「另一張表的主鍵」的欄位
- 一定要對應到另一張表存在的值
- 可以指向同一個PK
- 可以為Null
- column:直欄
- Row: 橫列
- Field: 直欄和橫列交錯的地方
- Null
溝通流程:
Client(輸入SQL) → 傳送 → Server(解析+查詢) → 回傳結果

SQL語言
簡介
IBM發明 → Oracle商用 → ANSI統一 → ISO全球 → SQL持續進化
IBM 發明(起源)
- 開發系統:System R
- 原本名稱:SEQUEL
- 1980 年改名為:SQL 📌 重點: 👉 SQL 一開始是「研究用語言」,讓人可以用類英文查資料
Oracle 商用(進入市場)
- 1979 年:Oracle 推出第一個商用 SQL 系統 📌 重點: 👉 SQL 從「研究」變成「實際企業在用」 👉 開始普及
ANSI 訂標準(統一規則)
- 1986 年:ANSI 制定 SQL 標準(SQL-86 / SQL-87) 📌 重點: 👉 不同公司有共同語法 👉 避免各做各的
ISO 全球化(國際認證)
- 1987 年:ISO 採用 SQL 標準 📌 重點: 👉 SQL 成為「國際標準語言」 👉 全世界都用同一套概念
SQL 持續升級(版本演進)
重要版本:
- SQL-89
- SQL-92(🔥最重要、考試常考)
- SQL-99
- SQL-2023(最新版) 📌 重點: 👉 功能越來越強(例如:更複雜查詢、物件導向等)
特性
- SQL是高級的非程序的語言,它允許用戶在高層資料結構上工作。
- 不需要使用者瞭解其具體的資料存放方式。
- 不同底層結構的資料庫之間使用相同SQL語言作為資料的輸入與管理。
- SQL語言可以寫出非常複雜的語句。
分類
DDL(資料定義語言Data Definition Language)
用來定義資料庫物件的指令: 用來「建立、修改、刪除」資料庫的架構(骨架) 因為是修改架構,所以不能Rollback
CREATE👉 建立DROP👉 刪除整個物件ALTER👉 修改結構RENAME👉 改名字TRUNCATE👉 清空資料(但保留表) DML = 改 Excel 裡的內容(可以復原) DDL = 把整個檔案刪掉(救不回來)
DML(資料操作語言Data Manipulation Language)
用來處理資料庫中的資料的指令,一般資料的新增、修改、刪除、查詢等運算。 可以Rollback 對資料做 CRUD(增刪改查)
INSERT👉 新增UPDATE👉 修改DELETE👉 刪除SELECT👉 查詢(有些人另外分)
DCL(資料控制語言: Data Control Language)
用來控制管理資料庫的使用權限及相關安全設定的管控指令
GRANT👉 給權限REVOKE👉 收回權限
TCL(交易控制語言Transaction Control Language)
管理資料庫中交易的指令
COMMIT👉 確認ROLLBACK👉 回復SAVEPOINT👉 設中繼點 常搭配 DML 使用,用來防止資料錯亂 多步驟操作+不能出錯的情境 → 一定用 TCL 例如:- 新增訂單
- 新增訂單明細
- 更新庫存
👉 這三個要一起成功,不然就一起失敗,避免資料錯亂,
保證 資料一致性。
DQL ( 資料查詢語言 Data Query Language )
查詢指令
SELECT
| 類型 | 用途 | 關鍵字 |
| DDL | 定義結構 | CREATE, ALTER, DROP |
| DML | 操作資料 | INSERT, UPDATE, DELETE, SELECT |
| DCL | 權限控制 | GRANT, REVOKE |
| TCL | 交易控制 | COMMIT, ROLLBACK |
| DQL | 查詢 | SELECT |
👉 一開始就是「開放原始碼」(免費、可修改) #### 加入 GPL(2000年) - 採用 **GNU GPL 授權** 📌 意思:
👉 可以免費使用、修改、分享
👉 很多人開始用 → 快速普及 #### 被 Sun 收購(2008年) - **Sun Microsystems(昇陽)** 收購 MySQL AB 📌 重點:
👉 MySQL 開始變成大公司產品 #### 被 Oracle 收購(2009年) - **Oracle(甲骨文)** 收購 Sun
👉 MySQL 變成 Oracle 旗下產品 📌 重點:
👉 現在 MySQL 是 Oracle 在維護 ### 特色 1. 關聯式資料庫(RDBMS) 用「表(Table)」來存資料 2. 開放原始碼(Community Server) 免費、可修改 - 可以自由下載使用 - 有企業版(付費)但一般用免費版就夠 3. 速度快、可靠、易用 - ⚡ 速度快:查詢效率高 - 🔒 穩定可靠:很少當機 - 👍 好上手:語法簡單、資源多 4. 主從式架構(Client / Server) Client 發送 → Server 處理 → 回傳結果 ### Client(客戶端) - 你 / App / 網站 - 負責送 SQL ### Server(伺服器) - MySQL - 負責處理資料
- 有大量開發者參與
- 問題很好查(Google 幾乎都有答案)
- 工具很多(phpMyAdmin、Workbench)
- 持續更新
連接使用MySQL

| 元件 | 說明 | 圖中位置 | 重點 |
| Client(客戶端) | 使用者操作工具 | 左邊黑色視窗 | 輸入 SQL |
| MySQL Server | 資料庫伺服器 | 中間大方塊 | 處理資料 |
| Databases | 多個資料庫 | 中間圓柱 | 裝不同資料 |
| Tables | 資料表 | 右邊 emp、dept | 真正存資料 |
| 類型 | 說明 | 例子 | 適合 |
| GUI(圖形介面) | 用滑鼠操作、有畫面 | MySQL Workbench、phpMyAdmin | 初學者 |
| CLI(命令列) | 用指令操作 | `mysql -u root -p` | 工程師 |
use sample;
- CREATE DATABASE 建立一個新的資料庫 CREATE DATABASE [IF NOT EXISTS] databaseName; {color=“gray_bg”}
CREATE DATABASE mydb;
- SOURCE 執行一個SQL腳本文件(SCRIPTFILE): Script = 把很多 SQL 存成檔案,一次全部執行 SOURCE FileName; {color=“gray_bg”}
SOURCE c:\mysql_demobld.sql;
- SHOW TABLES 列出預設資料庫中所有資料表
SHOW TABLES;
- DESC[RIBE] table 列出指定資料表的欄位資訊 查資料結構 describe
DESCRIBE dept;
- SELECT 列出資料表資料
SELECT *
FROM dept;
資料型態
資料型態介紹
| 資料類型 | 資料型態 | 說明 | 格式 / 範圍 | 使用情境 |
| 文字資料 | CHAR(n) | 固定長度,不足補空白 | n = 1 \~ 255 | 身分證、固定長度代碼 |
| 文字資料 | VARCHAR(n) | 可變長度,不補空白 | n = 1 \~ 65535 | 姓名、地址(最常用🔥) |
| 數值資料 | INT | 整數 | 約 -21億 \~ 21億 | 年齡、數量 |
| 數值資料 | DECIMAL(p,s) | 精確小數 | p=總位數,s=小數位 | 金額(非常重要🔥) |
| 數值資料 | NUMERIC(p,s) | 與 DECIMAL 類似 | 同上 | 金額(有些系統用) |
| 日期資料 | DATE | 只有日期 | YYYY-MM-DD | 生日 |
| 日期資料 | DATETIME | 日期+時間 | YYYY-MM-DD HH:MM:SS | 訂單時間、登入時間 |
| 資料類型 | 寫法 | 範例 | 重點 |
| 字串(String) | 用單引號 `' '` 或雙引號 `" "` | `'hello'`、`"你好"` | 文字一定要加引號 |
| 整數(Integer) | 直接寫數字 | `123`、`1900` | 不用引號 |
| 小數(Float / Decimal) | 直接寫數字 | `12.57`、`0.1234` | 不用引號 |
| 日期(Date) | 用字串格式 | `'1998-02-04'` | 建議用 `YYYY-MM-DD` |
| 日期(其他格式) | 也可接受 | `'1998/02/04'`、`'19980204'` | 但不建議(考試會寫標準格式) |
| 日期時間(Datetime) | 用字串格式 | `'1998-02-04 13:30:00'` | 日期 + 時間 |
數字 123 ✅ ‘123’ ⚠️(變字串)
日期(像字串) ‘2024-01-01’ ✅
### SELECT語法
SELECT \*\|\{\[DISTINCT\] column\|expression \[alias\],...\}<br>FROM table;
#### 查詢資料表中的所有欄位
SELECT \*<br>FROM TableName;
```sql
SELECT *
FROM dept;
查詢指定欄位
SELECT column,…
FROM TableName;
SELECT empno, ename, sal
FROM emp;
顯示資料表結構(Table Structure)
DESC[RIBE] tablename
DESCRIBE dept;
欄位表頭(Column Heading)
column 大寫:則以大寫表示
SELECT NAME FROM student;
column 小寫:則以小寫表示
SELECT name FROM student;
* → 依資料表原本設定(DESC)
用來:
- 看資料表長怎樣
- 確認欄位名稱
- 確認資料型態
SELECT * FROM student;
DESC student;
查詢範例:
SELECT deptno, DNAME
FROM dept;
算術運算式(Arithmetic Expressions)
運算元(operand):
被拿來運算的東西
| 類型 | 例子 |
| 常數 | 5、3、100 |
| 欄位 | salary、age |
| 運算式 | (5 + 3) |
| 函數 | ROUND(...) |
| 變數 | @x |
運算子(operator):
優先順序(Operator Precedence):
跟四則運算一樣
使用括號(Using Parentheses)改變運算順序
| 運算 | 符號 | 範例 | 結果 |
| 加法 | + | 5 + 3 | 8 |
| 減法 | - | 5 - 3 | 2 |
| 乘法 | \* | 5 \* 3 | 15 |
| 除法 | / | 6 / 3 | 2 |
SELECT ename, sal, 12*(sal+100) FROM emp;
### 欄位別名(Column Alias)
一般欄位或是運算試欄位可以更改別名,只會更改顯示名稱,不會影響資料庫原本的命名。
語法:<br>Column \| expression \[AS\] alias
1. 特殊字或空白使用" "刮住
2. 可以用 AS 或是一個空格
```sql
# 把 empno 改成 編號,ename 改成 Name, sal 改成 SALARY,sal*12之後 改成 Ann Sal
SELECT empno "編號", ename Name, sal AS SALARY, sal*12 "Ann Sal"
FROM emp;
空值(Null Value)
- NULL值是在新增資料時沒有設定欄位值,資料庫管理系統便設定該欄位的內容為NULL
1. 無法使用
2. 無法指派
3. 無法運算
4. 與0和空白不相同 - 所有型態皆可以為空值
- 運算式中若含有Null Value時,其結果為NULL
SELECT empno, ename, sal, comm, sal+comm
FROM emp;
字串連結(Concatenation)
把多個值「接在一起」變成一個字串 函數: CONCAT(expr1,expr2,…)
- expr 可以是任何資料型態
expr可以是: - 字串
- 數字
- 欄位
- 函數結果 最終都會轉換成字串
SELECT CONCAT(deptno,dname) Department
FROM dept;
SELECT CONCAT('Hello', ' ', 'World');
SELECT CONCAT(first_name, ' ', last_name)
FROM employee;
SELECT CONCAT('年齡:', 25);
FROM employee;
SELECT CONCAT('ID:', id, ' Name:', name)
FROM student;
如果資料裡面有Null值,整筆資料就會顯示NULL
SELECT CONCAT('Hello', NULL);
結果:
NULL
如果資料庫裡面 last_name的值為null
SELECT CONCAT(first_name, ' ', last_name)
FROM student;
結果:
NULL
常值(Literal)
你直接寫死在 SQL 裡的值,不會改變。
| 類型 | 範例 | 說明 |
| 字串常值 | `'Hello'`、`'小明'` | 要用引號 |
| 數值常值 | `100`、`3.14` | 不用引號 |
| 日期常值 | `'2024-01-01'` | 用字串表示 |
| NULL | `NULL` | 表示沒有值 |
FROM \
| 參數 | 說明 | 重點 |
| DISTINCT | 去除重複資料 | 可加可不加 |
| offset | 略過前幾筆(從X開始),起始位置為0 | = 略過幾筆 |
| count | 最多取幾筆 | 限制筆數 |
| limit | 從第一筆開始,取幾筆。 | 限制筆數 |
| order ny | 資料排序 |
SELECT ename, sal, job FROM emp-> LIMIT 3,5;
### 條件查詢
#### SELECT 敘述總整理表
<table header-row="true">
<tr>
<td>子句(Clause)</td>
<td>運算式(Expression)</td>
<td>中文用途</td>
</tr>
<tr>
<td>SELECT</td>
<td>`<select list>`</td>
<td>指定要顯示的欄位</td>
</tr>
<tr>
<td>FROM</td>
<td>`<table source>`</td>
<td>指定資料來源(哪張表)</td>
</tr>
<tr>
<td>WHERE</td>
<td>`<search condition>`</td>
<td>篩選資料(列)</td>
</tr>
<tr>
<td>GROUP BY</td>
<td>`<group by list>`</td>
<td>將資料分組</td>
</tr>
<tr>
<td>HAVING</td>
<td>`<search condition>`</td>
<td>篩選分組後的結果</td>
</tr>
<tr>
<td>ORDER BY</td>
<td>`<order by list>`</td>
<td>排序結果</td>
</tr>
</table>
#### WHERE → 限制查詢
語法:<br>SELECT column,...<br>FROM table<br>WHERE conditions;
- 條件子句(Conditions):
- 邏輯值:真(TRUE)、假(FALSE)、空值(NULL)
- 比較運算式/邏輯運算式/SQL特定運算式
- 運算元可以是欄位、運算式、函數、常數
```sql
SELECT empno, ename, job, deptno
FROM emp;
WHERE deptno=10;
比較運算子(Comparison Operators)
比較運算子使用在二個資料項的比較大小 可以比較:
- 數值資料: 值
- 字串資料: 內碼(預設值)
- 日期時間資料:世紀、年、月、日、時、分、秒
- 昨天< 今天< 明天
| 運算子 | 意思 | 範例 |
| = | 等於 | age = 20 |
| \> | 大於 | salary \> 30000 |
| \< | 小於 | age \< 18 |
| \>= | 大於等於 | age \>= 20 |
| \<= | 小於等於 | age \<= 30 |
| \<\> 或 != | 不等於 | age \<\> 20 |
#數值資料: 列出薪水大於等於3000的員工 SELECT empno, ename, job, sal FROM emp WHERE sal >= 3000;
#日期資料: 2011-12-03 進公司的員工 SELECT empno,ename,job,deptno, hiredate FROM emp WHERE hiredate = ‘2011-12-03’;
#字串資料:列出KING的資料 SELECT empno, ename, job, deptno, hiredate FROM emp WHERE ename = ‘KING’
#相同資料型態的欄位資料 SELECT ename, sal, comm FROM emp WHERE sal<=comm;
### 邏輯運算子(Logical Operators)
若有一個以上的條件運算必須使用邏輯運算子結合成一個運算結果
<table header-row="true">
<tr>
<td>運算子</td>
<td>意思</td>
<td>範例</td>
</tr>
<tr>
<td>AND</td>
<td>且</td>
<td>age \> 20 AND salary \> 30000</td>
</tr>
<tr>
<td>OR</td>
<td>或</td>
<td>age \< 18 OR age \> 60</td>
</tr>
<tr>
<td>NOT</td>
<td>反向</td>
<td>NOT age = 20</td>
</tr>
</table>
```sql
#AND 必須二個運算元都是真(TRUE)才會符合查詢條件
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1100 AND job='CLERK';
#列出薪水>2000且職務為manager的員工
SELECT empno, ename, job, sal, mgr
FROM emp
WHERE sal > 2000 AND job = 'MANAGER';
#OR只要任一個運算元是真(TRUE)就符合查詢條件
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1100 OR job='CLERK';
#列出薪水>2000或職務為manager的員工
SELECT empno, ename, job, sal, mgr
FROM emp
WHERE sal > 2000 OR job = 'MANAGER';
#NOT反向運算,只有一個運算元
SELECT empno, ename, job, sal, mgr
FROM emp
WHERE NOT(sal > 2000 OR job = 'MANAGER');
SQL特定運算子
| 類別 | 說明 | 範例 |
| BETWEEN | 查詢某個連續範圍內的資料 | SELECT \* FROM table WHERE age BETWEEN 18 AND 30 |
| IN | 查詢符合多個指定值的資料 | SELECT \* FROM table WHERE city IN ('Taipei', 'Taichung') |
| LIKE | 使用萬用字元進行模糊查詢 | SELECT \* FROM table WHERE name LIKE 'A%' |
| IS NULL | 查詢欄位為空值的資料 | SELECT \* FROM table WHERE address IS NULL |
– 找名字為A開頭的員工 SELECT empno, ename, job, sal FROM emp WHERE ename LIKE ‘A%’;
– 找名字為N結尾的員工 SELECT empno, ename, job, sal FROM emp WHERE ename LIKE ‘%N’;
– 找名字有T中的員工 SELECT empno, ename, job, sal FROM emp WHERE ename LIKE ‘%T%’;
– 找姓名中第二個字為A的員工 SELECT empno, ename, job, sal FROM emp WHERE ename LIKE ‘_A%’;
–ESCAPE跳脫他原本的意義 %替代字元-> %百分比符號 SELECT * FROM liquorS WHERE content LIKE ‘%3&%%’ ESCAPE ‘&’;
#### IS NULL
- 空值運算子(判斷資料是否為NULL)
expr IS NULL
1. NULL專用的運算子
2. (NULL = NULL) →NULL
3. NULL與空白和0不相同
4. 任何型態欄位皆可以為NULLvalue
```sql
SELECT empno, ename, job, sal, mgr
FROM emp
WHERE mgr IS NULL;
查詢結果排序
order by
資料排序→ 放置於SELECT敍述的最後一行
SELECT column,…
FROM table
[WHERE conditions]
ORDER BY {column|alias|expression|position [ASC|DESC],…};
排序方式
- ASC: 升冪Ascending 由小到大[預設]
- DESC: 降冪Descending 由大到小
- 若有空值時,升冪在最前面,降冪在最下面
- 欄位/別名/運算式/位置
#升冪排列 由小至大
SELECT empno, ename, sal
FROM emp
WHERE deptno = 10
ORDER BY sal;
#降冪排列 由大至小
SELECT empno, ename, sal
FROM emp
WHERE deptno = 10
ORDER BY sal DESC;
#別名也可以做排序
SELECT empno, ename, sal*12 annsal
FROM emp
WHERE deptno = 10
ORDER BY annsal;
#使用運算式排序
SELECT empno, ename, sal+comm bonus
FROM emp
WHERE deptno = 30
ORDER BY sal+comm;
#依資料項在list中的位置順序
SELECT empno, ename, sal
FROM emp
WHERE deptno = 10
ORDER BY 3;
#多個資料項排序
SELECT *
FROM emp
ORDER BY deptno, job, 6 DESC, 1;
#用LIMIT薪資最高前五名
SELECT ename, sal, job
FROM emp
ORDER BY sal DESC
LIMIT 5;
#薪資最低前五名
SELECT ename, sal, job
FROM emp
ORDER BY sal
LIMIT 5;
列舉式CASE(Simple CASE)
- 與一串列舉的值做比較
- 傳回第一個(值相等)的回傳值
- 若都不相等則傳回ELSE的回傳值,若無給定ELSE則傳回NULL值
SELECT empno, ename, sal, job,
CASE job
WHEN 'PRESIDENT' THEN sal*1.5
WHEN 'MANAGER' THEN sal*1.3
WHEN 'ANALYST' THEN sal*1.2
ELSE sal
END NewSal
FROM emp;
條件式CASE(Searched CASE)
- 與一串列舉的條件做比較
- 傳回第一個(條件運算結果=真)的回傳值
- 若都不符合則傳回ELSE的回傳值,若無給定ELSE則傳回NULL值
SELECT empno, ename, sal,
CASE -- 條件式 如果符合## 就做 ##
WHEN sal BETWEEN 0 AND 1000 THEN 'A'
WHEN sal BETWEEN 1001 AND 2000 THEN 'B'
WHEN sal BETWEEN 2001 AND 3000 THEN 'C'
WHEN sal BETWEEN 3001 AND 4000 THEN 'D'
ELSE 'E'
END Level -- 設定新欄位的別名
FROM emp;
MySQL資料型態
字串
65535以下→VARCHAR(N)
超過→MEDIUMTEXT、LONGTEXT
CHAR
固定長度,速度快但浪費空間
VARCHAR
最常用,節省空間
BLOB
用來存圖片、檔案(二進位)
TEXT
用來存文章、描述
ENUM
用在固定選項,例如性別、狀態
| 類型 | 儲存方式 | 儲存大小 | 範圍 | 其他特性 |
| CHAR(N) | 固定長度,不足補空白,顯示會去掉尾端空白 | 固定為 N 字元 | 1 到 255 | 適合長度固定資料 |
| **VARCHAR(N)**** 最常使用** |
可變長度,尾端空白保留 | 實際長度加 1 或 2 byte | 1 到 65535 | 最常用字串型態 |
| TINYBLOB | Binary → 0 、 1 | L 加 1 byte | L 小於 2 的 8 次方 | 儲存二進位資料 |
| BLOB | Binary | L 加 2 bytes | L 小於 2 的 16 次方 | **可存圖片、影像或音樂檔案等** |
| MEDIUMBLOB | Binary | L 加 3 bytes | L 小於 2 的 24 次方 | 中型二進位資料 |
| LONGBLOB | Binary | L 加 4 bytes | L 小於 2 的 32 次方 | 超大二進位資料 |
| TINYTEXT | 文字 | L 加 1 byte | L 小於 2 的 8 次方 | 不分大小寫 |
| TEXT | 文字 | L 加 2 bytes | L 小於 2 的 16 次方 | 常用長文字 |
| MEDIUMTEXT | 文字 | L 加 3 bytes | L 小於 2 的 24 次方 | 中長文字 |
| LONGTEXT | 文字 | L 加 4 bytes | L 小於 2 的 32 次方 | 超長文字 |
| ENUM | 以整數儲存對應選項 | 1 或 2 bytes | 最多 65535 個選項 | 適合固定選項,列舉型態 |
代表佔用的空間大小
越大 → 可以存越大的數字 Signed
表示可以存「正數 + 負數」 如果是 Unsigned(無號)
👉 只能存正數
👉 最大值會變更大 - Signed 👉 可存負數 - Unsigned 👉 只能存正數 - Unsigned 👉 最大值變 2 倍 MySQL 的 BOOLEAN / BOOL 其實就是 TINYINT(1),用 0 和 1 來表示 False 和 True。
| 型態 | Bytes | Signed 範圍 | Unsigned 範圍 |
| TINYINT | 1 | -128 \~ 127 | 0 \~ 255 |
| SMALLINT | 2 | -32768 \~ 32767 | 0 \~ 65535 |
| MEDIUMINT | 3 | -8388608 \~ 8388607 | 0 \~ 16777215 |
| INT | 4 | -2147483648 \~ 2147483647 | 0 \~ 4294967295 |
| BIGINT | 8 | -9223372036854775808 \~ 9223372036854775807 | 0 \~ 18446744073709551615 |
| 類型 | 型態 | 特性 | 說明 | 範例 |
| 精準實數 | DECIMAL(M,D) | 高精準 | 用字串儲存,不會有誤差 | DECIMAL(5,2) |
| 精準實數 | NUMERIC(M,D) | 高精準 | 與 DECIMAL 完全相同 | NUMERIC(5,2) |
| 浮點數 | FLOAT(p) | 近似值 | 有誤差(速度快) | FLOAT |
| 浮點數 | DOUBLE(M,D) | 近似值 | 精度比 FLOAT 高 | DOUBLE |
| 類型 | 型態 | Bytes | 精確度 | 範圍 | 說明 |
| 單精確數 | FLOAT(p) | 4 | p=0\~24 | ±3.40E+38 | 精度較低,速度快 |
| 雙精確數 | DOUBLE(M,D) | 8 | p=25\~53 | ±1.79E+308 | 精度較高 |
| 型態 | 格式 | 範圍 | 說明 |
| DATE | YYYY-MM-DD | 1000-01-01 \~ 9999-12-31 | 只存日期 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 \~ 9999-12-31 23:59:59 | 日期+時間 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 \~ 2038-01-19 | 日期+時間(受時區影響) |
| TIME | HH:MM:SS | -838:59:59 \~ 838:59:59 | 只存時間 |
| YEAR | YYYY | 1901 \~ 2155 | 只存年份 |
| 輸入格式 | 範例 | 轉換結果 |
| YYYY-MM-DD HH:MM:SS | '1998-12-31 11:30:45' | 1998-12-31 11:30:45 |
| YY-MM-DD HH:MM:SS | '98-12-31 11:30:45' | 1998-12-31 11:30:45 |
| YYYY-MM-DD | '1998-12-31' | 1998-12-31 00:00:00 |
| YY-MM-DD | '98-12-31' | 1998-12-31 00:00:00 |
| YYYYMMDDHHMMSS | '19970523091528' | 1997-05-23 09:15:28 |
| YYMMDDHHMMSS | '970523091528' | 1997-05-23 09:15:28 |
| YYYYMMDD | '19981231' | 1998-12-31 00:00:00 |
| YYMMDD | '981231' | 1998-12-31 00:00:00 |
| 數字格式(無引號) | 19830905132800 | 1983-09-05 13:28:00 |
| 數字短格式 | 830905132800 | 1983-09-05 13:28:00 |
| 日期數字 | 19830905 | 1983-09-05 00:00:00 |
| 短日期數字 | 830905 | 1983-09-05 00:00:00 |
| fsp(小數秒位數) | 儲存額外空間(Bytes) |
| 0 | 0 |
| 1 \~ 2 | 1 |
| 3 \~ 4 | 2 |
| 5 \~ 6 | 3 |
| 比較 | DATETIME | TIMESTAMP |
| 時區影響 | ❌ 不會變 | ✅ 會轉換 |
| 儲存方式 | 原樣儲存 | 轉成 UTC |
| 讀取時 | 原樣輸出 | 轉回當地時間 |
👉 你存什麼就拿到什麼 TIMESTAMP
👉 會幫你「轉時區」
MySQL函數
SQL函數(SQL Functions)
| 類別 | 說明 | 範例 |
| 執行計算 | 對資料做數學運算 | SELECT price \* quantity FROM table |
| 修改資料 | 改變單一欄位的值 | SELECT UPPER(name) FROM table |
| 格式化輸出 | 將日期或數字轉成特定格式 | SELECT DATE_FORMAT(date, '%Y-%m-%d') |
| 型態轉換 | 將資料轉換成其他型態 | SELECT CAST(price AS CHAR) |
| 群組彙總 | 對多筆資料做統計 | SELECT AVG(price), SUM(price) FROM table |
可接受使用者輸入參數並回傳結果 
| 部分 | 名稱 | 說明 | 對應概念 | 範例 |
| Input | 輸入 | 傳入函式的資料 | 參數 arguments | 3, 5 |
| Function | 函式 | 對輸入資料進行處理或運算 | 程式邏輯 | a + b |
| Output | 輸出 | 函式執行後產生的結果 | 回傳值 return value | 8 |
| arg1 \~ arg n | 多個輸入 | 可以傳入多個參數 | 多參數 | add(3, 5, 7) |
| 類別 | 中文名稱 | 處理對象 | 回傳結果 | 範例 |
| Single-row functions | 單一資料列函數 | 一次處理一筆資料 | 每筆都有一個結果 | UPPER(name) |
| Multiple-row functions | 多重資料列函數 | 一次處理多筆資料 | 只回傳一個結果 | AVG(price) |
| 類別 | 說明 | 範例 |
| 基本用途 | 用來處理單一資料項的運算 | UPPER(name) |
| 參數數量 | 可接受一個或多個參數 | ROUND(price, 2) |
| 執行方式 | 每一筆資料都會執行一次 | 每列 name 都轉大寫 |
| 回傳結果 | 每筆資料回傳一個結果 | 每列都有結果 |
| 語法格式 | function_name(參數) | UPPER(name) |
運算式(Expression)
常值(User-supplied constant)
變數值(Variable value)
函數(Function)
| 類別 | 說明 | 範例 |
| 欄位名稱 | 使用資料表中的欄位 | name |
| 運算式 | 對資料做運算 | price \* 2 |
| 常值 | 固定數值或字串 | 100 或 'A' |
| 變數值 | 程式中的變數 | @price |
| 函數 | 函數可以當參數使用 | ROUND(AVG(price), 2) |
| 類別 | 說明 | 範例 |
| 字串函數(String functions) | 處理文字資料,輸入字串,回傳字串或數值 | UPPER(name)、LENGTH(name) |
| 數值函數(Numeric functions) | 處理數字資料,回傳數值 | ROUND(price, 2)、ABS(-10) |
| 日期/時間函數(Date and Time functions) | 處理日期與時間資料 | NOW()、DATE_FORMAT(date, '%Y-%m-%d') |
| 資料型態轉換函數(Conversion functions) | 將資料轉成不同型態 | CAST(price AS CHAR) |
| 通用函數(General functions) | 流程控制或取得系統資訊 | IF(score \> 60, 'Pass', 'Fail') |
字串函數(String functions)
| 函數 | 功能 | 範例 | 回傳結果 |
| LENGTH(str) | 字串長度(位元組) | LENGTH('測試') | 6 |
| CHAR_LENGTH(str) | 字元個數 | CHAR_LENGTH('測試') | 2 |
| LCASE(str) / LOWER(str) | 轉小寫 | LOWER('ABC') | 'abc' |
| UCASE(str) / UPPER(str) | 轉大寫 | UPPER('abc') | 'ABC' |
| ASCII(str) | 回傳第一個字元的 ASCII 碼 | ASCII('ABC') | 65 |
| CONCAT(str1,str2,...) | 字串連接 | CONCAT('abc','123') | 'abc123' |
| CONCAT_WS(sep,str1,...) | 用分隔符連接字串 | CONCAT_WS('@','abc','123') | 'abc@123' |
| FIELD(str,str1,...) | 回傳位置 | FIELD('q','s','q','1') 找第一個位置的值 EX:找q → 2 |
2 |
| INSERT(str,pos,len,newstr) | 插入字串 | INSERT('[abc.com](http://abc.com)',1,3,'123') (要取代的值,起始位置,要被取代的字元數,要放進去的內容) |
'[123.com](http://123.com)' |
| LEFT(str,len) | 從左取字元 | LEFT('1234567',3) | '123' |
| RIGHT(str,len) | 從右取字元 | RIGHT('1234567',2) | '67' |
| LPAD(str,len,padstr) | 左補字元 | LPAD('123',5,'#') | '##123' |
| RPAD(str,len,padstr) | 右補字元 | RPAD('123',5,'#') | '123##' |
| REVERSE(str) | 字串反轉 | REVERSE('1234567') | '7654321' |
| SUBSTRING(str,pos) | 從指定位置取到結尾 | SUBSTRING('123abcd',4) | 'abcd' |
| SUBSTRING(str,pos,len) | 擷取指定長度字串 | SUBSTRING('123abcd',4,2) | 'ab' |
| REPEAT(str,count) | 重複字串 | REPEAT('abc',2) | 'abcabc' |
| SPACE(N) | 產生 N 個空白 | SPACE(3) | ' ' |
| INSTR(str,substr) | 找字串位置 | INSTR('abcdefg','c') | 3 |
| LOCATE(substr,str) | 找字串位置(類似 INSTR) | LOCATE('c','abcdefg') | 3 |
| REPLACE(str,from,to) | 字串取代 | REPLACE('123abc','123','456') | '456abc' |
| LTRIM(str) | 去除左邊空白 | LTRIM(' abc') | 'abc' |
| RTRIM(str) | 去除右邊空白 | RTRIM('abc ') | 'abc' |
| TRIM(str) | 去除左右空白 | TRIM(' abc ') | 'abc' |
| STRCMP(str1,str2) | 比較字串大小 | STRCMP('abc','abc') | 0 |
| STRCMP('abc','def') | -1 | ||
| STRCMP('def','abc') | 1 |
#左右邊補 # 到長度 10 SELECT ename, sal, LPAD(sal,10,‘#’), RPAD(sal,10,‘#’) FROM emp;
#REPEAT 印出長條圖 轉換成星星 SELECT ename, sal, REPEAT(‘*’, ROUND(sal/100,0)) FROM emp WHERE deptno = 10;
#產生隨機數 SELECT ename, sal, sal + FLOOR(RAND() * 1000) FROM emp WHERE deptno = 20;
<table header-row="true">
<tr>
<td>函數</td>
<td>說明</td>
<td>範例</td>
<td>結果</td>
</tr>
<tr>
<td>CONCAT</td>
<td>字串連接</td>
<td>CONCAT('Good','String')</td>
<td>GoodString</td>
</tr>
<tr>
<td>SUBSTRING</td>
<td>擷取字串</td>
<td>SUBSTRING('String',1,3)</td>
<td>Str</td>
</tr>
<tr>
<td>LENGTH</td>
<td>計算字串長度</td>
<td>LENGTH('String')</td>
<td>6</td>
</tr>
<tr>
<td>INSTR</td>
<td>找字串位置</td>
<td>INSTR('String','r')</td>
<td>3</td>
</tr>
<tr>
<td>LPAD</td>
<td>左側補字元</td>
<td>LPAD(sal,10,'\*')</td>
<td>\*\*\*\*\*\*5000</td>
</tr>
<tr>
<td>TRIM</td>
<td>去除指定字元</td>
<td>TRIM('S' FROM 'SSMITH')</td>
<td>MITH</td>
</tr>
</table>
### 數值函數(Numeric Functions)
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
<td>範例</td>
<td>回傳結果</td>
</tr>
<tr>
<td><span color="yellow_bg">ROUND(X,D)</span></td>
<td>四捨五入到小數第 D 位</td>
<td>ROUND(123.567,2)</td>
<td>123.57</td>
</tr>
<tr>
<td></td>
<td></td>
<td>ROUND(123.567)</td>
<td>124</td>
</tr>
<tr>
<td>TRUNCATE(X,D)</td>
<td>無條件捨去</td>
<td>TRUNCATE(123.567,2)</td>
<td>123.56</td>
</tr>
<tr>
<td><span color="yellow_bg">MOD(N,M)</span></td>
<td>求餘數</td>
<td>MOD(7,3)</td>
<td>1</td>
</tr>
<tr>
<td>CEIL(X)</td>
<td>無條件進位(最小整數)</td>
<td>CEIL(3.6)</td>
<td>4</td>
</tr>
<tr>
<td>FLOOR(X)</td>
<td>無條件捨去(最大整數)</td>
<td>FLOOR(3.6)</td>
<td>3</td>
</tr>
<tr>
<td>POWER(X,Y)</td>
<td>次方運算</td>
<td>POWER(2,3)</td>
<td>8</td>
</tr>
<tr>
<td>SQRT(X)</td>
<td>平方根</td>
<td>SQRT(9)</td>
<td>3</td>
</tr>
<tr>
<td>ABS(X)</td>
<td>絕對值</td>
<td>ABS(-123)</td>
<td>123</td>
</tr>
<tr>
<td>SIGN(X)</td>
<td>判斷正負</td>
<td>SIGN(2), SIGN(0), SIGN(-2)</td>
<td>1, 0, -1</td>
</tr>
<tr>
<td>RAND()</td>
<td>產生亂數(0\~1)</td>
<td>RAND()</td>
<td>0.09(隨機)</td>
</tr>
<tr>
<td>RAND(N)</td>
<td>固定種子亂數</td>
<td>RAND(1)</td>
<td>固定值</td>
</tr>
<tr>
<td>PI()</td>
<td>圓周率</td>
<td>PI()</td>
<td>3.141593</td>
</tr>
<tr>
<td>RADIANS(X)</td>
<td>角度轉弧度</td>
<td>RADIANS(180)</td>
<td>3.141592653589793</td>
</tr>
<tr>
<td>DEGREES(X)</td>
<td>弧度轉角度</td>
<td>DEGREES(1.5)</td>
<td>85.94366926962348</td>
</tr>
</table>
### 日期時間函數
#### 1.傳回目前系統日期時間的函數
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
<td>範例</td>
<td>回傳結果</td>
</tr>
<tr>
<td>CURDATE() / CURRENT_DATE()</td>
<td>目前日期</td>
<td>CURDATE()</td>
<td>'2023-07-03'</td>
</tr>
<tr>
<td>CURTIME() / CURRENT_TIME()</td>
<td>目前時間</td>
<td>CURTIME()</td>
<td>'21:25:30'</td>
</tr>
<tr>
<td>CURRENT_TIMESTAMP()</td>
<td>目前日期與時間</td>
<td>CURRENT_TIMESTAMP()</td>
<td>'2023-07-03 21:25:30'</td>
</tr>
<tr>
<td>NOW()</td>
<td>目前日期與時間</td>
<td>NOW()</td>
<td>'2023-07-03 21:25:30'</td>
</tr>
<tr>
<td>UTC_DATE()</td>
<td>世界標準時間日期</td>
<td>UTC_DATE()</td>
<td>'2023-07-03'</td>
</tr>
<tr>
<td>UTC_TIME()</td>
<td>世界標準時間時間</td>
<td>UTC_TIME()</td>
<td>'13:25:30'</td>
</tr>
<tr>
<td>UTC_TIMESTAMP()</td>
<td>世界標準時間日期與時間</td>
<td>UTC_TIMESTAMP()</td>
<td>'2023-07-03 13:25:30'</td>
</tr>
</table>
#### 2.傳回日期時間部份資料的函數
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
<td>範例</td>
<td>回傳結果</td>
</tr>
<tr>
<td><span color="yellow_bg">YEAR(date)</span></td>
<td>取得年份</td>
<td>YEAR(CURDATE())</td>
<td>2023</td>
</tr>
<tr>
<td>MONTH(date)</td>
<td>取得月份</td>
<td>MONTH(CURDATE())</td>
<td>7</td>
</tr>
<tr>
<td>DAY(date)</td>
<td>取得日期</td>
<td>DAY(CURDATE())</td>
<td>3</td>
</tr>
<tr>
<td>HOUR(time)</td>
<td>取得小時</td>
<td>HOUR(CURTIME())</td>
<td>21</td>
</tr>
<tr>
<td>MINUTE(time)</td>
<td>取得分鐘</td>
<td>MINUTE(CURTIME())</td>
<td>25</td>
</tr>
<tr>
<td>SECOND(time)</td>
<td>取得秒數</td>
<td>SECOND(CURTIME())</td>
<td>30</td>
</tr>
<tr>
<td>TIME(expr)</td>
<td>取得時間部分</td>
<td>TIME(NOW())</td>
<td>'21:25:30'</td>
</tr>
<tr>
<td>MICROSECOND(expr)</td>
<td>取得微秒</td>
<td>MICROSECOND('23:59:59.100045')</td>
<td>100045</td>
</tr>
<tr>
<td>EXTRACT(type FROM date)</td>
<td>取得指定日期單位</td>
<td>EXTRACT(YEAR FROM CURDATE())</td>
<td>2023</td>
</tr>
<tr>
<td></td>
<td></td>
<td>EXTRACT(MONTH FROM CURDATE())</td>
<td>7</td>
</tr>
<tr>
<td></td>
<td></td>
<td>EXTRACT(DAY FROM CURDATE())</td>
<td>3</td>
</tr>
<tr>
<td></td>
<td></td>
<td>EXTRACT(WEEK FROM CURDATE())</td>
<td>27</td>
</tr>
<tr>
<td>DAYNAME(date)</td>
<td>傳回星期名稱</td>
<td>DAYNAME(CURDATE())</td>
<td>Monday</td>
</tr>
<tr>
<td>MONTHNAME(date)</td>
<td>傳回月份名稱</td>
<td>MONTHNAME(CURDATE())</td>
<td>July</td>
</tr>
<tr>
<td>DAYOFWEEK(date)</td>
<td>一週中的第幾天(1=日…7=六)</td>
<td>DAYOFWEEK(CURDATE())</td>
<td>2</td>
</tr>
<tr>
<td>DAYOFMONTH(date)</td>
<td>一個月中的第幾天</td>
<td>DAYOFMONTH(CURDATE())</td>
<td>3</td>
</tr>
<tr>
<td>DAYOFYEAR(date)</td>
<td>一年中的第幾天</td>
<td>DAYOFYEAR(CURDATE())</td>
<td>184</td>
</tr>
<tr>
<td>WEEK(date)</td>
<td>一年中的週數(0\~52)</td>
<td>WEEK(CURDATE())</td>
<td>27</td>
</tr>
<tr>
<td><span color="yellow_bg">WEEKDAY(date)</span></td>
<td>星期索引(0=一…6=日)</td>
<td>WEEKDAY(CURDATE())</td>
<td>0</td>
</tr>
<tr>
<td>WEEKOFYEAR(date)</td>
<td>一年中的第幾週</td>
<td>WEEKOFYEAR(CURDATE())</td>
<td>27</td>
</tr>
<tr>
<td>YEARWEEK(date)</td>
<td>年+週數</td>
<td>YEARWEEK(CURDATE())</td>
<td>202327</td>
</tr>
</table>
#### 3.修改/計算日期和時間的函數
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
<td>範例</td>
<td>回傳結果</td>
</tr>
<tr>
<td><span color="yellow_bg">DATEDIFF(expr1,expr2)</span></td>
<td>計算兩日期差(天數)<br></td>
<td>DATEDIFF('2017-06-25','2017-06-15')<br>後面減前面</td>
<td>10</td>
</tr>
<tr>
<td><span color="yellow_bg">ADDDATE(date, INTERVAL expr type)</span></td>
<td>日期加法</td>
<td>ADDDATE('2017-06-25', INTERVAL 2 DAY)</td>
<td>'2017-06-27'</td>
</tr>
<tr>
<td>SUBDATE(date, INTERVAL expr type)</td>
<td>日期減法</td>
<td>SUBDATE('2017-06-25', INTERVAL 2 DAY)</td>
<td>'2017-06-23'</td>
</tr>
<tr>
<td>ADDTIME(expr1,expr2)</td>
<td>時間加法</td>
<td>ADDTIME('09:34:21','2:10:05')</td>
<td>'11:44:26'</td>
</tr>
<tr>
<td>SUBTIME(expr1,expr2)</td>
<td>時間減法</td>
<td>SUBTIME('09:34:21','2:10:05')</td>
<td>'07:24:16'</td>
</tr>
<tr>
<td>TIMEDIFF(expr1,expr2)</td>
<td>計算兩時間差</td>
<td>TIMEDIFF('13:10:11','13:10:10')</td>
<td>'00:00:01'</td>
</tr>
<tr>
<td>TIMESTAMP(expr1,\[expr2\])</td>
<td>轉成時間戳記</td>
<td>TIMESTAMP('2017-07-23')</td>
<td>'2017-07-23 00:00:00'</td>
</tr>
<tr>
<td>TIMESTAMPADD(interval,n,datetime)</td>
<td>時間戳記加法</td>
<td>TIMESTAMPADD(MONTH,2,'2009-05-18')</td>
<td>'2009-07-18'</td>
</tr>
<tr>
<td>TIMESTAMPDIFF(interval,datetime1,datetime2)</td>
<td>時間差(指定單位)</td>
<td>TIMESTAMPDIFF(MONTH,'2018-01-01','2018-06-01')</td>
<td>5</td>
</tr>
</table>
#### 4.轉換日期時間與字串的函數
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
<td>範例</td>
<td>回傳結果</td>
</tr>
<tr>
<td>DATE(expr)</td>
<td>取出日期部分</td>
<td>DATE('2017-06-15 09:34:21')</td>
<td>'2017-06-15'</td>
</tr>
<tr>
<td>STR_TO_DATE(str,format)</td>
<td>字串轉日期</td>
<td>STR_TO_DATE('August 10 2017','%M %d %Y')</td>
<td>'2017-08-10'</td>
</tr>
<tr>
<td>MAKEDATE(year,dayofyear)</td>
<td>年+第幾天轉日期</td>
<td>MAKEDATE(2017,175)</td>
<td>'2017-06-24'</td>
</tr>
<tr>
<td>MAKETIME(hour,minute,second)</td>
<td>數值轉時間</td>
<td>MAKETIME(11,35,4)</td>
<td>'11:35:04'</td>
</tr>
<tr>
<td><span color="yellow_bg">DATE_FORMAT(date,format)</span></td>
<td>日期轉字串格式</td>
<td>DATE_FORMAT('2017-06-15','%Y')</td>
<td>'2017'</td>
</tr>
<tr>
<td>TIME_FORMAT(time,format)</td>
<td>時間轉字串格式</td>
<td>TIME_FORMAT('19:30:10','%H %i%s')</td>
<td>'19 3010'</td>
</tr>
</table>
#### 5.其他日期和時間的函數
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
<td>範例</td>
<td>回傳結果</td>
</tr>
<tr>
<td>PERIOD_DIFF(P1,P2)</td>
<td>計算月份差(年月-年月)</td>
<td>PERIOD_DIFF(201710,201703)</td>
<td>7</td>
</tr>
<tr>
<td>TO_DAYS(date)</td>
<td>轉換為從起始日的總天數</td>
<td>TO_DAYS('2017-06-20')</td>
<td>736865</td>
</tr>
<tr>
<td>FROM_DAYS(N)</td>
<td>將總天數轉回日期</td>
<td>FROM_DAYS(685467)</td>
<td>'1876-09-29'</td>
</tr>
<tr>
<td>LAST_DAY(date)</td>
<td>該月份最後一天</td>
<td>LAST_DAY('2017-06-20')</td>
<td>'2017-06-30'</td>
</tr>
<tr>
<td>QUARTER(date)</td>
<td>一年中的第幾季</td>
<td>QUARTER('2017-06-20')</td>
<td>2</td>
</tr>
<tr>
<td>TIME_TO_SEC(time)</td>
<td>時間轉總秒數</td>
<td>TIME_TO_SEC('19:30:10')</td>
<td>70210</td>
</tr>
<tr>
<td>SEC_TO_TIME(seconds)</td>
<td>秒數轉時間</td>
<td>SEC_TO_TIME(70210)</td>
<td>'19:30:10'</td>
</tr>
</table>
### 資料型態轉換函數(Conversion Functions)
<table header-row="true">
<tr>
<td>函數</td>
<td>語法</td>
<td>說明</td>
</tr>
<tr>
<td>CAST</td>
<td>CAST(expr AS type)</td>
<td>標準 SQL 寫法(最常用)</td>
</tr>
<tr>
<td><span color="yellow_bg">**CONVERT**</span></td>
<td>CONVERT(expr, type)</td>
<td>MySQL 寫法</td>
</tr>
</table>
<table header-row="true">
<tr>
<td>型態</td>
<td>說明</td>
</tr>
<tr>
<td>BINARY</td>
<td>轉成二進位字串</td>
</tr>
<tr>
<td>CHAR</td>
<td>轉成字串</td>
</tr>
<tr>
<td>DATE</td>
<td>轉成日期</td>
</tr>
<tr>
<td>DATETIME</td>
<td>轉成日期時間</td>
</tr>
<tr>
<td>TIME</td>
<td>轉成時間</td>
</tr>
<tr>
<td>SIGNED</td>
<td>轉成有號整數(可負數)</td>
</tr>
<tr>
<td>UNSIGNED</td>
<td>轉成無號整數(正數)</td>
</tr>
</table>
<table header-row="true">
<tr>
<td>原資料</td>
<td>轉換</td>
<td>用途</td>
</tr>
<tr>
<td>字串 → 整數</td>
<td>SIGNED</td>
<td>計算</td>
</tr>
<tr>
<td>字串 → 日期</td>
<td>DATE</td>
<td>日期比較</td>
</tr>
<tr>
<td>數字 → 字串</td>
<td>CHAR</td>
<td>顯示</td>
</tr>
</table>
### 通用函數(General functions)
查系統狀態
- USER() → 看誰在連線
- DATABASE() → 看目前在哪個資料庫
- VERSION() → 看版本
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
</tr>
<tr>
<td>USER()</td>
<td>顯示目前連線的使用者</td>
</tr>
<tr>
<td>VERSION()</td>
<td>顯示 MySQL 版本</td>
</tr>
<tr>
<td>DATABASE()</td>
<td>顯示目前使用的資料庫</td>
</tr>
<tr>
<td>CONNECTION_ID()</td>
<td>顯示目前連線的 ID</td>
</tr>
<tr>
<td>CHARSET(str)</td>
<td>顯示字串的字元集</td>
</tr>
</table>
### 流程控制函數(Control Flow Functions)
<table header-row="true">
<tr>
<td>函數</td>
<td>語法</td>
<td>功能</td>
</tr>
<tr>
<td><span color="yellow_bg">**IFNULL**</span></td>
<td>IFNULL(expr1, expr2)</td>
<td>如果 expr1 是 NULL → 回傳 expr2</td>
</tr>
<tr>
<td><span color="yellow_bg">**IF**</span></td>
<td>IF(expr1, expr2, expr3)</td>
<td>如果條件成立 → 回傳 expr2,否則 expr3</td>
</tr>
<tr>
<td>NULLIF</td>
<td>NULLIF(expr1, expr2)</td>
<td>如果兩者相等 → 回傳 NULL,否則 expr1</td>
</tr>
</table>
### 多重資料列函數(Multiple-Row Functions)
多筆記錄(rows)執行一次,傳回一個結果 → 如果對多筆資料做平均,只會回傳一筆資料<br>資料彙總
### 群組/ 彙總函數(Group / Aggregate Functions)
<table header-row="true">
<tr>
<td>寫法</td>
<td>功能</td>
<td>是否算 NULL</td>
<td>是否去重複</td>
</tr>
<tr>
<td>COUNT(\*)</td>
<td>計算所有資料列</td>
<td>✅ 包含</td>
<td>❌ 不去重複</td>
</tr>
<tr>
<td>COUNT(column)</td>
<td>計算欄位有值的筆數</td>
<td>❌ 不包含</td>
<td>❌ 不去重複</td>
</tr>
<tr>
<td>COUNT(DISTINCT column)</td>
<td>計算不重複且有值的筆數</td>
<td>❌ 不包含</td>
<td>✅ 去重複</td>
</tr>
</table>
#### COUNT(\*)
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
</tr>
<tr>
<td>COUNT(\*)</td>
<td>計算資料列總數(包含 NULL)</td>
</tr>
</table>
```sql
#顯示部門 10 的「所有資料」
SELECT *
FROM emp
WHERE deptno = 10;
#只回傳「幾筆資料」
SELECT COUNT(*)
FROM emp
WHERE deptno = 10;
COUNT(column | expr)
| 函數 | 功能 |
| COUNT(column) | 計算「不為 NULL」的筆數 |
#1️⃣ 查資料 SELECT comm FROM emp WHERE deptno = 30;
#2️⃣ 計算筆數 SELECT COUNT(comm) FROM emp WHERE deptno = 30;
#### COUNT(DISTINCT column \| expr)
<table header-row="true">
<tr>
<td>函數</td>
<td>功能</td>
</tr>
<tr>
<td>COUNT(DISTINCT column)</td>
<td>計算「不重複且不為 NULL」的筆數</td>
</tr>
</table>
```sql
#顯示不重複 job
SELECT DISTINCT job
FROM emp;
#計算 job 有值的筆數(不含 NULL)
SELECT COUNT(job)
FROM emp;
#計算「不重複」且「不為 NULL」的數量
SELECT COUNT(DISTINCT job)
FROM emp;
MAX(column | expr)
| 函數 | 功能 |
| MAX(column) | 找出欄位中的最大值 |
MIN(column | expr)
| 函數 | 功能 |
| MIN(column) | 找出欄位中的最小值 |
SUM(column | expr)
| 函數 | 功能 |
| SUM(column) | 將欄位數值加總 |
AVG(column | expr)
AVG with IFNULL Function
AVG(column) = SUM(column) / COUNT(column) :NULL Value皆忽略不計入
平均值(Average) = SUM(column) / COUNT(*) 或
= AVG(IFNULL(column|expr, 0))
| 函數 | 功能 |
| AVG(column) | 計算欄位的平均值 |
FROM emp
WHERE deptno = 30; - 使用群組函數(Using Group Functions) ```sql SELECT SUM(sal), MIN(sal), MAX(sal), AVG(sal), COUNT(*) FROM emp WHERE deptno = 30; ```
資料分組
資料分組(Grouping Data): 依資料內容來分組,分組後再做資料彙總
GROUP BY 子句
資料分組使用GROUP BY子句
子句將表格(table)中的記錄(rows)依GROUP BY後資料項的相同內容分為一個群組 特性:
| 項目 | 說明 |
| 分組 | 依欄位值分組 |
| 彙總 | 搭配 AVG、SUM、COUNT 等 |
| 預設排序 | 依 GROUP BY 欄位升冪(ASC) |
MySQL的邏輯流程 1️⃣ FROM → 取資料 2️⃣ WHERE → 篩選資料 3️⃣ SELECT → 顯示結果 4️⃣ GROUP BY → 分組 5️⃣ HAVING → 篩選群組 6️⃣ ORDER BY → 排序
| 子句 | 功能 |
| SELECT | 要顯示的欄位或函數 |
| FROM | 資料來源(資料表) |
| WHERE | 篩選資料(分組前) |
| GROUP BY | 分組 |
| HAVING | 篩選分組結果 |
| ORDER BY | 排序 |
GROUP BY 會把 **NULL 當成一組**
| comm | COUNT(\*) |
| 500 | 2 |
| 300 | 1 |
| NULL | 2 |
| deptno | job | COUNT(\*) |
| 10 | Clerk | 2 |
| 10 | Manager | 1 |
| 20 | Clerk | 1 |
GROUP_CONCAT群組函數
基本語法
GROUP_CONCAT([DISTINCT] expr
[ORDER BY column ASC | DESC]
[SEPARATOR '字串']
)
| 參數 | 功能 |
| DISTINCT | 去除重複值 |
| ORDER BY | 排序串接結果 |
| column / expr | 欄位或運算式 |
| SEPARATOR | 設定分隔符號 |
| string | 分隔字串內容 |
SELECT deptno,
GROUP_CONCAT(DISTINCT job ORDER BY job ASC SEPARATOR ',') AS JOBS
FROM emp
GROUP BY deptno;
| 功能 | 說明 |
| GROUP_CONCAT | 把資料串起來 |
| DISTINCT | 去除重複 job |
| ORDER BY job ASC | 依 job 排序 |
| SEPARATOR ',' | 用逗號分隔 |
CONCAT()→ 橫的串接 GROUP_CONCAT()→ 直的串接
分組資料過濾條件(HAVING子句)
分組運算後結果的篩選
基本語法
基本語法:
SELECT column, group_function
FROM table
[WHERE condition]
GROUP BY group_by_expression
[HAVING group_condition]
[ORDER BY column];
| 項目 | WHERE | HAVING |
| 篩選時機 | 分組前 | 分組後 |
| 篩選對象 | 單筆資料 | 群組結果 |
| 可用彙總函數 | ❌ 不行 | ✅ 可以 |
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno
HAVING AVG(sal) > 2000;
篩選分組資料
📊 執行流程
1️⃣ FROM → 取 emp 2️⃣ GROUP BY job → 分組 3️⃣ COUNT(*) → 計算人數 4️⃣ HAVING → 篩選 > 3
-- 👉 依 job 分組
-- 👉 計算每種職位的人數
-- 👉 只顯示「人數 > 3」的職位
SELECT job, COUNT(*) AS CNT
FROM emp
GROUP BY job
HAVING COUNT(*) > 3;
WHERE vs HAVING 比較
WHERE 篩資料 HAVING 篩結果 執行順序!! FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
| 項目 | WHERE | HAVING |
| 執行時機 | 分組前 | 分組後 |
| 篩選對象 | 單筆資料(row) | 分組結果(group) |
| 是否可用彙總函數 | ❌ 不可以 | ✅ 可以 |
| 是否需 GROUP BY | 不需要 | 通常需要 |
Join
資料查詢–SELECT 敘述
| 子句 (Element) | 表達式 (Expression) | 功能 (Role) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SELECT | \ | 指定要顯示的欄位或資料項目 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| FROM | \
排列組合出來 - 內部連結和外部連結的邏輯基礎 1. 內部連結從Cartesian product開始,使用連結條件來篩選資料 2. 外部連結從Cartesian product開始,使用連結條件來篩選資料,再加回 不匹配的資料列 - 因交叉連結會產生Cartesian product 的結果,所以不具資料查詢的價值 1. 產生測試資料 - 無條件連結 1. 第一個資料表所有的rows會與第二個資料表中每一個row合併(Cartesian Product) 基本語法
結果
真(TRUE)才會合併產生一筆新紀錄(row) 2. 如何設定連結條件 • SQL-92 語法使用ON子句(preferred) • SQL-89 語法使用WHERE 子句 - 為何使用ON 子句來設定連結條件? 1. 可以跟資料查詢條件分開來以免造成混淆 #### 語法 SELECT ... FROM t1 JOIN t2 ON JoinConditions t1 和 t2 可以交換不影響結果 ```sql #92 SELECT e.ename, e.deptno, d.dname FROM dept d JOIN emp e ON d.deptno = e.deptno; #89 SELECT e.ename, e.deptno, d.dname FROM dept d, emp e WHERE d.deptno = e.deptno;
👉 把 emp(員工)
自然連結(Natural Join)
不相等連結(Non-Equijoins)
多表格連結三個表格兩個join
SELECT …
員工表格找到員工→員工有客戶→客戶有訂單→加總訂單$
ename → empno = repid → custid = custid
外部連結(Outer Join)語法
找「沒有任何員工的部門」
自我連結(Self Joins)
語法SELECT …
子查詢(Sub-Queries)概念
語法單筆記錄子查詢(Single Row Subqueries)回傳值只有單欄位單筆紀錄 sal → 2975
子查詢(Sub-Queries)-WHERE 子句列出和JAMES同部門的員工
多個子查詢在SELECT 中
列出薪資>全公司平均薪資的員工
HAVING 👉 找出:
子查詢出現在SELECT子句中
子查詢出現在FROM子句中: 衍生資料表(Derived Table) → 臨時產生的表格,只存在記憶體中,不在硬碟,僅能用在本次指令
多筆記錄子查詢(Multiple Row Subqueries)WHERE {color=“yellow_bg”} 多筆資料用() → 找出單筆資料用 = ** {color=“yellow_bg”} ** →找出多筆資料用 IN 列出公司所有主管
「沒有當主管的員工」—解決方法:排除子查詢空值資料
ANY or ALL
列出薪水比任一個clerk低的員工資料
列出薪水比所有salesman高的員工資料
列出部門與薪水都與Martin 相同之員工
相關子查詢(Correlated Subqueries)
撰寫相關子查詢內部查詢如何接收外部查詢資料表的資料
查詢每個客戶最近跟公司下訂單的日期資料
解釋每筆訂單 → 找同客戶最大日期 → 留下最新訂單
查詢各部門薪資最高的員工資料
使用EXISTS-存在性測試
列出下過訂單的客戶資料
列出從未下過訂單的客戶資料
資料處理語言(DML) CRUD資料處理語言(Data Manipulation Language)
INSERT INTO命令INSERT INTO table [(column,…)]
新增資料-Null 值
新增資料-日期資料
INSERT INTO多筆記錄新增多筆資料 用( ), 區分新的一筆資料INSERT INTO table_name (column_list)
INSERT敘述常發生的錯誤
訂單、已不再交易的銀行帳戶以及已處理完的公文 INSERT INTO table\[(column,...)\] SELECT column,... FROM table WHERE ... {color="gray_bg"} - 若目標表格的欄位名稱、欄位數量與來源表格皆完全相同,可以不必寫column list → 複製一個一模一樣的表格 ```sql INSERT INTO emp_copy SELECT * FROM emp; ``` - 若目標表格的欄位名稱、順序與來源表格並不盡相同(資料型態一定要一樣),必須寫column list →只保留自己想要的欄位 ,並且加入條件 ```sql INSERT INTO emp_copy1(empid, ename, deptno, hiredate, salary) SELECT empno, ename, deptno, hiredate, sal FROM emp WHERE job NOT LIKE '%SA%'; ``` 舉例: ```sql INSERT INTO bonus(ename, job, sal, comm) SELECT ename, job, sal, comm FROM emp WHERE deptno=10; SELECT * FROM bonus;
修改一個欄位資料
同時更新兩個欄位資料
使用子查詢來更新資料
DELETEFROM命令DELETE FROM table
新增修改刪除常見錯誤
result->
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (
新增資料-違反外來鍵新增資料時的錯誤
修改資料時的錯誤
刪除資料-違反外來鍵
DML交易控制(DML Transaction Control)交易中只能有一個USER控制,USER2要等前一個UAER交易結束,所以寫交易要考慮其他USER 資料庫交易 (Database Transactions)簡介● 交易 (Database Transactions)
改變資料庫中現有資料
● 依不同類型的指令所產生的交易:
DML 交易 → 資料操作: 更改資料內容 (沒有動欄位) 更改結構或是權限的時候,直接確定,不能回頭
交易控制 (Transactions Control)目的主要目的: 維持資料庫中資料的
何謂交易(Database Transactions)
交易 ACID 特性所有資料庫交易都必須符合 ACID,確保資料完整性 ACID = 全做或不做、資料正確、互不干擾、結果永久 A(Atomic)單元性
C(Consistency)一致性
I(Isolation)隔離性
D(Durability)持久性
AUTOCOMMIT 自動確認
COMMIT 確認交易
ROLLBACK 放棄交易
SAVEPOINT 設定交易儲存點
交易儲存點 (SAVEPOINT)
資料定義語言(DDL / Data Definition Language)儲存引擎 (Storage Engine)
MyISAM:MySQL早期預設的儲存引擎,支援的功能不像一般的資料庫那麼多(例如沒支援transaction);不過因為比較簡單,所以運作的效率相對也
InnoDB:MySQL目前預設的儲存引擎,所提供的功能已和大型的商用資料庫一樣,像是交易(transaction)、記錄鎖定(row-level locking) 與外來鍵
MEMORY:把資料儲存在紀憶體中,運作的效率是最快的;但只要MySQL伺服器關閉後,儲存的資料就會全部消失
字元集 (Character Set) 與字元序 (Collation)
字元集 (Character Set)
字元序 (Collation)
( ColumnName type,...); {color="gray_bg"}
( ColumnName type,...); {color="gray_bg"} - 若資料表已存在,則不建立資料表 - 若資料表不存在,則建立資料表 ```sql CREATE TABLE IF NOT EXISTS DEPT ( DEPTNO SMALLINT(4), DNAME VARCHAR(14), LOC VARCHAR(13) ); ``` ### 設定資料表儲存引擎 CREATE TABLE TableName ( ColumnName type,...) \{ENGINE = \{BDB\|HEAP\|ISAM\|InnoDB\| {color="gray_bg"} MERGE\|MRG_MYISAM\|MYISAM\}; {color="gray_bg"} ```sql CREATE TABLE IF NOT EXISTS dept ( deptno smallint(4), dname varchar(14), loc varchar(13) ) ENGINE = InnoDB; #註:沒有指定 ENGINE 時,其預定的類型由參數 default-storage-engine 控制
使用LIKE子句建立資料表CREATE TABLE TableName LIKE Source_TableName; {color=“gray_bg”}
衍生欄位 (Generated Column)col_name data_type [GENERATED ALWAYS] AS (expression)
衍生欄位使用規則
enum 資料型態
資料檢查條件 (Database Constraints)
欄位預設值 (Default)
不允許空值 (NOT NULL)
主鍵 (Primary key)
AUTO_INCREMENT 選項
AUTO_INCREMENT 選項
唯一鍵 (Unique key)
( ..., ColumnName type UNIQUE, ..., ); {color="gray_bg"} ```sql CREATE TABLE STUDENT ( SID INT PRIMARY KEY, SEMAIL VARCHAR(30) UNIQUE, SNAME VARCHAR(10) ); ``` - 複合唯一鍵(由多個欄位構成) - const_name 為唯一鍵命名 CREATE TABLE TableName ( ..., ColumnName type, ..., \[CONSTRAINT const_name\] UNIQUE(column,...) ); {color="gray_bg"} ```sql CREATE TABLE ITEM ( ORDID INT NOT NULL, ITEMID SMALLINT NOT NULL, PRODID SMALLINT, CONSTRAINT UK_ITEM_ORDID_PRODID UNIQUE(ORDID,PRODID) ); ``` #### 外來鍵 (Foreign key) #### 外來鍵 - 外來鍵與參考的資料表須是InnoDB 儲存引擎類型 - 外來鍵的欄位數需和 parent table的主鍵或唯一鍵欄位數量相同 ```sql CREATE TABLE T1 ( PK INT NOT NULL PRIMARY KEY, FK INT , CONSTRAINT FK_T1_FK FOREIGN KEY(FK) REFERENCES T1(PK) ) ENGINE =INNODB; CREATE TABLE T2 ( FK INT, CONSTRAINT FK_T2_FK FOREIGN KEY(FK) REFERENCES T1(PK) ) ENGINE =INNODB; ``` ```sql CREATE TABLE DEPARTMENT ( DEPTNO SMALLINT NOT NULL PRIMARY KEY, DNAME VARCHAR(14), LOC VARCHAR(13) ) ENGINE = INNODB; CREATE TABLE EMPLOYEE ( EMPNO SMALLINT NOT NULL PRIMARY KEY, ENAME VARCHAR(14), JOB VARCHAR(13), MGR SMALLINT, HIREDATE DATE, SAL INT, COMM INT, DEPTNO SMALLINT, EMAL VARCHAR(200) UNIQUE, CONSTRAINT FK_EMP_MGR FOREIGN KEY(MGR) REFERENCES EMPLOYEE(EMPNO), CONSTRAINT FK_EMP_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPARTMENT(DEPTNO) ) ENGINE = INNODB; ``` #### 外來鍵資料的刪除與修改 - ON DELETE 資料刪除時 - ON UPDATE 資料更新時 - RESTRICT 限制 - CASCADE 相依性 - SET NULL 設成空值 CREATE TABLE table ( ..., fK_definition \[ON DELETE \{RESTRICT\|CASCADE\|SET NULL\}\]\| \[ON UPDATE \{RESTRICT\|CASCADE\|SET NULL\}\] ); {color="gray_bg"}
ON UPDATE CASCADE
ON UPDATE SET NULL
ON DELETE RESTRICT
ON DELETE CASCADE
ON DELETE SET NULL
資料檢測 (Check) - (MySQL 8.0.16以後版本支援)單一欄位限制無法新增出現錯誤訊息
多欄位限制SHOW CREATE TABLE parts;
無法新增出現錯誤訊息
修改結構資料表的維護 (Managing Tables)
新增一個新欄位 (Adding a Column)
新增多個新欄位 (Adding Columns)
修改欄位定義 (Modifying a column)
更改欄位名稱 (Rename the Name of Column)
刪除欄位 (Dropping a column)
新增資料檢查條件 (Adding a Constraint)
刪除資料檢查條件 (Drop a Constraint)ALTER TABLE table
資料表改名 (Managing the Name of Table)
更改資料表儲存引擎類型
截斷資料表中的資料 (Truncating a Table)
刪除資料表 (Dropping a Table)
視觀表(View)視觀表(View)是藉由SELECT查詢結果動態組合生成的虛擬資料表(Virtual Table)
特性
AS \ \[WITH CHECK OPTION\]; {color="gray_bg"} #### 使用基底資料表(Base Tables)的欄位名稱 ```sql CREATE VIEW empvu10 AS SELECT * FROM emp WHERE deptno = 10; ``` 設定欄位名稱
使用別名當欄位名稱
複雜視觀表
視觀表(View)的使用
視觀表(View) -查詢
可更新的視觀表 (Updateable View)
視觀表(View) –資料更新
視觀表(View) – 新增資料
視觀表(View) – 刪除資料
複雜視觀表 (Complex Views)不能做 DML!!! {color=“yellow_bg”}
修改視觀表 (Altering the Definition of a View)
WITH CHECK OPTION 選項
刪除視觀表 (Removing a View)
索引 (Index)
資料擷取方式
索引的種類叢集索引 (Clustered Index)資料實際存放的方式,所以有PK就有索引
非叢集索引 (Nonclustered Index)
索引的特性
建立索引的考量
ON TableName(column\[length\] \[ASC\|DESC\],.); {color="gray_bg"} ALTER TABLE TableName ADD INDEX(column\[length\] \[ASC\|DESC\],.); {color="gray_bg"} 查看索引SHOW INDEX FROM TableName; {color=“gray_bg”}
Non_unique 建立索引
建立索引 - 複合索引鍵
刪除索引ALTER TABLE table DROP INDEX IndexName; {color=“gray_bg”} DROP INDEX IndexName ON table; {color=“gray_bg”}
叢集索引 (Clustered Index)
叢集索引建立規則
資料搜尋
非叢集索引 (Non-clustered Index)
建立非叢集索引
資料搜尋
資料控制語言(DCL / Data Control Language)資料庫安全使用者權限管控(Controlling User Access)
資料庫安全(Database Security)
權限(Privileges)
MySQL 資料庫安全管理MySQL利用帳號及權限來管理資料庫的安全 帳號管理使用者帳號(User Account)使用者須利用一個使用者帳號來連線 建立使用者帳號(Create an User Account)
使用Workbench管理帳號
MySQL的權限驗證處理帳號及權限記錄在mysql資料庫中的資料表
MySQL 權限的驗證處理順序
權限管理權限授權(Grant命令)授權命令
GRANT [ALL| privs [columns]][,…]
select, insert, update, delete, create, drop 之權限 ```sql GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON yd702.* TO lazycat@'%' ``` ### MySQL權限管理-顯示授權 - 可查特定使用者目前擁有之權限 SHOW GRANTS FOR UserAccount {color="gray_bg"} ```sql SHOW GRANTS FOR mary@localhost; ``` ### 移除權限(Revoking a Privilege) - 使用「REVOKE ON」指令移除使用者權限 - Revoke on 指令只能移除帳號權限,但無法將帳號刪除 REVOKE \[ALL\] privs\[columns\],... ON \{table \| \* \| *.* \| database.\*\} FROM user,...; {color="gray_bg"} ```sql #撤消使用者 odxxx 的所有權限 REVOKE ALL, GRANT OPTION FROM odxxx; #撤消使用者 odxxx 授予其他人權限的能力 REVOKE GRANT OPTION ON sample.emp FROM odxxx;
使用Workbench移除帳號
總複習資料庫設計概念資料庫設計程序ER模型模型轉換詢問君璇的 AI 你可以詢問我的經歷、技能與專案 |



























