A2 數據庫
數據庫結構
表單
作為一個圖形化介面,簡化輸入記錄(類似Forms)
報告/報表
類似Excel的樞紐分析表
樞紐分析表
在分析大型和複雜的數據集時,我們可能需要計算和匯總數據,以便提出有用的資訊
數據類型
- 文字
- 數字
- 日期
- 貨幣
- 自動編號
- 布爾值
SQL 指令
1. 常數 (Constants)
用於邏輯判斷的布林值:
- TRUE:真(邏輯正確)
- FALSE:假(邏輯錯誤)
2. 運算符 (Operators)
這些符號用於數學計算、比較和邏輯組合:
- 算術運算:
+(加)、-(減)、*(乘)、/(除) - 比較運算:
>(大於)、<(小於)、=(等於)>=(大於或等於)、<=(小於或等於)<>(不等於)
- 萬用字元與符號:
%:匹配任意數量的字元(常用於LIKE)_:匹配單個字元(常用於LIKE)':單引號,用於標註字串常數
- 邏輯運算:
AND:且(兩者皆須成立)OR:或(其中之一成立即可)NOT:非(反轉邏輯狀態)
3. SQL 關鍵字與函數 (SQL Keywords & Functions)
用於構建查詢語句的核心指令:
- 聚合函數
AVG:計算平均值MAX:找出最大值MIN:找出最小值SUM:計算總和COUNT:計算特定紀錄的數量
- 數學函數
INT():將數字向下捨入至最近的整數。ABS():傳回數字的絕對值。LEN() / CHAR_LENGTH():傳回字串的字符數。MID() / SUBSTRING() / SUBSTR():從字串中間的一個特定位置,傳回一連串字符數。LOWER():將字串轉為小寫字母。UPPER():將字串轉為大寫字母。TRIM():移除字串頭和尾的空格。SPACE():傳回一個由若干空格組成的字串。
- 查詢基礎
SELECT:選取欄位FROM:指定資料表WHERE:設定篩選條件DISTINCT:去除重複的資料AS:重新命名欄位或資料表(別名)
- 條件與搜尋
BETWEEN:在特定的範圍之內LIKE:模式搜尋(模糊匹配)NULL:空值(代表沒有資料)IN:指定多於一個值("...", “...”)
- 排序與分組
ORDER BY:對結果進行排序ASC:升序排列(由小到大)DESC:降序排列(由大到小)GROUP BY:依照欄位進行分組HAVING:分組後的篩選條件(配合GROUP BY使用)
| 順序 | 指令 | 用途說明 |
|---|---|---|
| 1 | SELECT | 我要看什麼? |
| 2 | FROM | 從哪裡找? |
| 3 | WHERE | 哪些資料符合條件?(過濾每一列) |
| 4 | GROUP BY | 怎麼分類?(例如按部門、按日期) |
| 5 | HAVING | 分類完後,哪些組要留下來?(過濾組別) |
| 6 | ORDER BY | 最後要怎麼排順序?(由大到小或由小到大) |
實踐例子
一、範例資料表:employees
| id | name | department | salary | hire_date | notes |
|---|---|---|---|---|---|
| 1 | Alice | Sales | 50000 | 2020-01-15 | Manager |
| 2 | Bob | Sales | 45000 | 2020-03-20 | NULL |
| 3 | Charlie | IT | 60000 | 2019-06-01 | Developer |
| 4 | Diana | IT | 65000 | 2018-11-05 | Senior dev |
| 5 | Eve | HR | 48000 | 2021-02-10 | (三個空格) |
| 6 | Frank | HR | NULL | 2021-05-12 | Recruiter |
| 7 | Grace | Marketing | 55000 | 2022-01-01 | Designer |
| 8 | Hank | Marketing | 52000 | 2022-01-01 | NULL |
特點:含有
NULL值、前後空白、大小寫混雜等,方便測試各類函數。
二、查詢基礎
1. SELECT – FROM – WHERE
選取 IT 部門的員工姓名與薪資
SELECT name, salary
FROM employees
WHERE department = 'IT';| name | salary |
|---|---|
| Charlie | 60000 |
| Diana | 65000 |
2. DISTINCT
查詢所有不重複的部門名稱
SELECT DISTINCT department
FROM employees;| department |
|---|
| Sales |
| IT |
| HR |
| Marketing |
3. AS (別名)
查詢員工姓名與年薪(薪資 × 12),並重新命名欄位
SELECT name, salary * 12 AS annual_salary
FROM employees;| name | annual_salary |
|---|---|
| Alice | 600000 |
| Bob | 540000 |
| Charlie | 720000 |
| Diana | 780000 |
| Eve | 576000 |
| Frank | NULL |
| Grace | 660000 |
| Hank | 624000 |
三、條件與搜尋
4. BETWEEN
找出薪資在 45000 到 55000 之間的員工
SELECT name, salary
FROM employees
WHERE salary BETWEEN 45000 AND 55000;| name | salary |
|---|---|
| Alice | 50000 |
| Bob | 45000 |
| Eve | 48000 |
| Grace | 55000 |
| Hank | 52000 |
5. LIKE (模糊比對)
找出名字以 ‘A’ 開頭的員工
SELECT name
FROM employees
WHERE name LIKE 'A%';| name |
|---|
| Alice |
找出 notes 欄位中包含 ‘dev’ 的員工(不分大小寫需搭配函數,此處先示範基本用法)
SELECT name, notes
FROM employees
WHERE notes LIKE '%dev%';| name | notes |
|---|---|
| Diana | Senior dev |
6. NULL 值的判斷
找出薪資尚未填寫(為 NULL)的員工
SELECT name, salary
FROM employees
WHERE salary IS NULL;| name | salary |
|---|---|
| Frank | NULL |
7. IN
找出部門為 ‘IT’ 或 ‘HR’ 的員工
SELECT name, department
FROM employees
WHERE department IN ('IT', 'HR');| name | department |
|---|---|
| Charlie | IT |
| Diana | IT |
| Eve | HR |
| Frank | HR |
四、排序與分組
8. ORDER BY、ASC、DESC
按薪資由高到低排列所有員工
SELECT name, salary
FROM employees
ORDER BY salary DESC;| name | salary |
|---|---|
| Diana | 65000 |
| Charlie | 60000 |
| Grace | 55000 |
| Hank | 52000 |
| Alice | 50000 |
| Eve | 48000 |
| Bob | 45000 |
| Frank | NULL |
預設為
ASC(由小到大),NULL通常會排在最前面或最後面,視資料庫而定。
9. GROUP BY 與 HAVING
查詢各部門的員工人數,但只顯示人數大於 1 的部門
SELECT department, COUNT(*) AS cnt
FROM employees
GROUP BY department
HAVING COUNT(*) > 1;| department | cnt |
|---|---|
| Sales | 2 |
| IT | 2 |
| HR | 2 |
| Marketing | 2 |
因為所有部門皆為 2 人,所以全部顯示;若有人數較少的部門,就會被
HAVING過濾。
五、聚合函數
10. AVG、MAX、MIN、SUM、COUNT
計算全公司的:平均薪資、最高薪資、最低薪資、薪資總和、有薪資資料的人數
SELECT
AVG(salary) AS 平均薪資,
MAX(salary) AS 最高薪資,
MIN(salary) AS 最低薪資,
SUM(salary) AS 薪資總和,
COUNT(salary) AS 有薪資人數
FROM employees;| 平均薪資 | 最高薪資 | 最低薪資 | 薪資總和 | 有薪資人數 |
|---|---|---|---|---|
| 53571.43 | 65000 | 45000 | 375000 | 7 |
COUNT(salary)會忽略NULL,因此結果為 7;COUNT(*)則計算所有列數(8)。
六、數學與字串函數
這些函數通常放在 SELECT 清單中或 WHERE 條件裡。
11. INT() – 向下取整
SELECT INT(3.7) AS result; -- MySQL: 使用 FLOOR(3.7)結果為 3。
(部分資料庫如 SQL Server 無 INT(),可用 FLOOR() 或 CAST;此處沿用題目指示。)
12. ABS() – 絕對值
SELECT ABS(-15) AS absolute_value;結果為 15。
13. LEN() / CHAR_LENGTH() – 字串長度
查詢員工姓名長度與備註長度
SELECT
name,
CHAR_LENGTH(name) AS 姓名長度,
CHAR_LENGTH(notes) AS 備註長度
FROM employees;| name | 姓名長度 | 備註長度 |
|---|---|---|
| Alice | 5 | 10 |
| Bob | 3 | NULL |
| Charlie | 7 | 9 |
| Diana | 5 | 12 |
| Eve | 3 | 3 |
| Frank | 5 | 9 |
| Grace | 5 | 8 |
| Hank | 4 | NULL |
MySQL 使用
CHAR_LENGTH()或LENGTH();SQL Server 則使用LEN()。
14. SUBSTRING() / SUBSTR() / MID() – 擷取子字串
取出員工姓名前三個字母
SELECT name, SUBSTRING(name, 1, 3) AS name_prefix
FROM employees;| name | name_prefix |
|---|---|
| Alice | Ali |
| Bob | Bob |
| Charlie | Cha |
| … | … |
函數可寫作
SUBSTR(name, 1, 3)或MID(name, 1, 3),效果相同。
15. LOWER() 與 UPPER() – 大小寫轉換
將部門名稱轉為小寫顯示
SELECT department, LOWER(department) AS 小寫部門
FROM employees;| department | 小寫部門 |
|---|---|
| Sales | sales |
| IT | it |
| HR | hr |
| Marketing | marketing |
16. TRIM() – 移除前後空白
清除 notes 欄位多餘的空白,並顯示長度變化
SELECT
notes,
CHAR_LENGTH(notes) AS 原始長度,
TRIM(notes) AS 去除空白後,
CHAR_LENGTH(TRIM(notes)) AS 去除後長度
FROM employees;| notes | 原始長度 | 去除空白後 | 去除後長度 |
|---|---|---|---|
| Manager | 10 | Manager | 7 |
| NULL | NULL | NULL | NULL |
| Developer | 9 | Developer | 9 |
| Senior dev | 12 | Senior dev | 10 |
| (三個空格) | 3 | (空字串) | 0 |
| Recruiter | 9 | Recruiter | 9 |
| … | … | … | … |
17. SPACE() – 產生指定數量的空格
產生 5 個空格,並與文字串接
SELECT CONCAT('Hello', SPACE(5), 'World') AS 合併文字;結果為 Hello World。
七、綜合應用範例 – 照 SQL 執行順序
回憶常見的執行順序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
查詢各部門(排除 ‘HR’)的平均薪資,只留下平均薪資大於 50000 的部門,並依平均薪資降冪排序
SELECT
department AS 部門,
AVG(salary) AS 平均薪資
FROM employees
WHERE department <> 'HR'
GROUP BY department
HAVING AVG(salary) > 50000
ORDER BY 平均薪資 DESC;| 部門 | 平均薪資 |
|---|---|
| IT | 62500 |
| Marketing | 53500 |
Sales平均為 47500,不符合HAVING條件,故未顯示。
這個範例同時用到了 SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、AS、AVG 以及條件判斷,可作為整合練習。