跳至內容
A2 數據庫

A2 數據庫

數據庫結構

數據庫數據表行與列欄位 \begin{array}{c} \text{數據庫} \\\\ \downarrow \\\\ \text{數據表} \\\\ \downarrow \\\\ \text{行與列} \\\\ \downarrow \\\\ \text{欄位} \end{array}

表單

作為一個圖形化介面,簡化輸入記錄(類似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 使用)

順序指令用途說明
1SELECT我要看什麼?
2FROM從哪裡找?
3WHERE哪些資料符合條件?(過濾每一列)
4GROUP BY怎麼分類?(例如按部門、按日期)
5HAVING分類完後,哪些組要留下來?(過濾組別)
6ORDER BY最後要怎麼排順序?(由大到小或由小到大)

實踐例子

一、範例資料表:employees

idnamedepartmentsalaryhire_datenotes
1AliceSales500002020-01-15Manager
2BobSales450002020-03-20NULL
3CharlieIT600002019-06-01Developer
4DianaIT650002018-11-05Senior dev
5EveHR480002021-02-10(三個空格)
6FrankHRNULL2021-05-12Recruiter
7GraceMarketing550002022-01-01Designer
8HankMarketing520002022-01-01NULL

特點:含有 NULL 值、前後空白、大小寫混雜等,方便測試各類函數。


二、查詢基礎

1. SELECTFROMWHERE

選取 IT 部門的員工姓名與薪資

SELECT name, salary
FROM employees
WHERE department = 'IT';
namesalary
Charlie60000
Diana65000

2. DISTINCT

查詢所有不重複的部門名稱

SELECT DISTINCT department
FROM employees;
department
Sales
IT
HR
Marketing

3. AS (別名)

查詢員工姓名與年薪(薪資 × 12),並重新命名欄位

SELECT name, salary * 12 AS annual_salary
FROM employees;
nameannual_salary
Alice600000
Bob540000
Charlie720000
Diana780000
Eve576000
FrankNULL
Grace660000
Hank624000

三、條件與搜尋

4. BETWEEN

找出薪資在 45000 到 55000 之間的員工

SELECT name, salary
FROM employees
WHERE salary BETWEEN 45000 AND 55000;
namesalary
Alice50000
Bob45000
Eve48000
Grace55000
Hank52000

5. LIKE (模糊比對)

找出名字以 ‘A’ 開頭的員工

SELECT name
FROM employees
WHERE name LIKE 'A%';
name
Alice

找出 notes 欄位中包含 ‘dev’ 的員工(不分大小寫需搭配函數,此處先示範基本用法)

SELECT name, notes
FROM employees
WHERE notes LIKE '%dev%';
namenotes
DianaSenior dev

6. NULL 值的判斷

找出薪資尚未填寫(為 NULL)的員工

SELECT name, salary
FROM employees
WHERE salary IS NULL;
namesalary
FrankNULL

7. IN

找出部門為 ‘IT’ 或 ‘HR’ 的員工

SELECT name, department
FROM employees
WHERE department IN ('IT', 'HR');
namedepartment
CharlieIT
DianaIT
EveHR
FrankHR

四、排序與分組

8. ORDER BYASCDESC

按薪資由高到低排列所有員工

SELECT name, salary
FROM employees
ORDER BY salary DESC;
namesalary
Diana65000
Charlie60000
Grace55000
Hank52000
Alice50000
Eve48000
Bob45000
FrankNULL

預設為 ASC(由小到大),NULL 通常會排在最前面或最後面,視資料庫而定。

9. GROUP BYHAVING

查詢各部門的員工人數,但只顯示人數大於 1 的部門

SELECT department, COUNT(*) AS cnt
FROM employees
GROUP BY department
HAVING COUNT(*) > 1;
departmentcnt
Sales2
IT2
HR2
Marketing2

因為所有部門皆為 2 人,所以全部顯示;若有人數較少的部門,就會被 HAVING 過濾。


五、聚合函數

10. AVGMAXMINSUMCOUNT

計算全公司的:平均薪資、最高薪資、最低薪資、薪資總和、有薪資資料的人數

SELECT
  AVG(salary) AS 平均薪資,
  MAX(salary) AS 最高薪資,
  MIN(salary) AS 最低薪資,
  SUM(salary) AS 薪資總和,
  COUNT(salary) AS 有薪資人數
FROM employees;
平均薪資最高薪資最低薪資薪資總和有薪資人數
53571.4365000450003750007

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姓名長度備註長度
Alice510
Bob3NULL
Charlie79
Diana512
Eve33
Frank59
Grace58
Hank4NULL

MySQL 使用 CHAR_LENGTH()LENGTH();SQL Server 則使用 LEN()

14. SUBSTRING() / SUBSTR() / MID() – 擷取子字串

取出員工姓名前三個字母

SELECT name, SUBSTRING(name, 1, 3) AS name_prefix
FROM employees;
namename_prefix
AliceAli
BobBob
CharlieCha

函數可寫作 SUBSTR(name, 1, 3)MID(name, 1, 3),效果相同。

15. LOWER()UPPER() – 大小寫轉換

將部門名稱轉為小寫顯示

SELECT department, LOWER(department) AS 小寫部門
FROM employees;
department小寫部門
Salessales
ITit
HRhr
Marketingmarketing

16. TRIM() – 移除前後空白

清除 notes 欄位多餘的空白,並顯示長度變化

SELECT
  notes,
  CHAR_LENGTH(notes) AS 原始長度,
  TRIM(notes) AS 去除空白後,
  CHAR_LENGTH(TRIM(notes)) AS 去除後長度
FROM employees;
notes原始長度去除空白後去除後長度
Manager10Manager7
NULLNULLNULLNULL
Developer9Developer9
Senior dev12Senior dev10
(三個空格)3(空字串)0
Recruiter9Recruiter9

17. SPACE() – 產生指定數量的空格

產生 5 個空格,並與文字串接

SELECT CONCAT('Hello', SPACE(5), 'World') AS 合併文字;

結果為 Hello World


七、綜合應用範例 – 照 SQL 執行順序

回憶常見的執行順序:
FROMWHEREGROUP BYHAVINGSELECTORDER BY

查詢各部門(排除 ‘HR’)的平均薪資,只留下平均薪資大於 50000 的部門,並依平均薪資降冪排序

SELECT
  department AS 部門,
  AVG(salary) AS 平均薪資
FROM employees
WHERE department <> 'HR'
GROUP BY department
HAVING AVG(salary) > 50000
ORDER BY 平均薪資 DESC;
部門平均薪資
IT62500
Marketing53500

Sales 平均為 47500,不符合 HAVING 條件,故未顯示。

這個範例同時用到了 SELECTFROMWHEREGROUP BYHAVINGORDER BYASAVG 以及條件判斷,可作為整合練習。

Last updated on