首頁專案文章關於我

資料庫體驗營 #09 分析與應用

ORDER BY 排序資料、GROUP BY 分組資料、子查詢 (Subquery)

課程紀錄

新增日期:2025/12/30 17:30 (UTC+8)

更新日期:2025/12/30 18:02 (UTC+8)

資料庫體驗營 #09 分析與應用 文章主視覺

order by 排序資料

order by 排序方法

ASC 從小到大、DESC 從大到小、LIMIT 筆數設定

範例:薪資從大到小,最多兩筆

SELECT name AS 姓名, salary AS 薪資
FROM users ORDER BY salary DESC LIMIT 2;

多條件排序方法

範例:先依照部門 id 從小到大排序,再依照薪資從小到大排序

SELECT name AS 姓名, salary AS 薪資, team_id AD 部門ID
FROM users ORDER BY team_id ASC, salary ASC;

Join 組合+排序技巧

範例:先找出人事部的資料,再依照薪資從小到大排序

SELECT
  users.name AS 姓名, users.salary AS 薪資,
  teams.name AS 部門名稱
FROM users
INNER JOIN teams ON users.team_id = teams.id
WHERE teams.name = '人事部'
ORDER BY salary ASC;

group by 分組資料

為什麼要學 group by 分組?

實務上可能會需要每幾筆資料分成一組,每個組別分開計算並輸出查詢結果

group by 語法教學

GROUP BY 適合將資料進行分組

範例:查詢所有部門 ID

SELECT team_id AS 部門ID FROM users;

查詢結果

部門id
1
1
2
2
1

範例:查詢不重複部門 ID

SELECT team_id AS 部門ID
FROM users GROUP BY team_id;

查詢結果

部門id
2
1

搭配聚合函數 (Aggregate Functions) (COUNT、SUM、AVG、MAX、MIN) 來進行分組計算

範例:查詢各部門人數

SELECT team_id AS 部門ID, COUNT(*) AS 人數
FROM users GROUP BY team_id;

查詢結果

部門id人數
22
13

group by + join 整合教學

範例:查詢不重複部門名稱

SELECT teams.name AS 部門名稱, COUNT(*) AS 人數
FROM users
JOIN teams ON users.team_id = teams.id
GROUP BY teams.name;

查詢結果

部門名稱人數
人事部2
開發部3

group by 延伸運用

範例:查詢各部門薪資數據

SELECT
  teams.name AS 部門名稱,
  COUNT(*) AS 人數,
  SUM(users.salary) AS 薪資總和,
  AVG(users.salary) AS 平均薪資,
  MAX(users.salary) AS 最高薪資,
  MIN(users.salary) AS 最低薪資,
FROM users
JOIN teams ON users.team_id = teams.id
GROUP BY teams.name;

查詢結果

部門名稱人數薪資總和平均薪資最高薪資最低薪資
人事部298000490005500043000
開發部3140000466664800045000

子查詢 (Subquery)

為什麼要學子查詢?

  • 可在一個 SQL 指令使用多個 SELECT
  • 在開頭使用的 SELECT 是主要的部分,所以稱為「主查詢」,其餘 SELECT 稱為「子查詢」

實務上可能會需要將第一次查詢取得的資料用在第二次查詢,轉換成 SQL 指令就會變成先執行子查詢再執行主查詢

where 子查詢應用

範例:查詢高於平均值的薪資

SELECT name, salary
FROM users
WHERE salary > (SELECT AVG(salary) FROM users);

查詢結果

namesalary
王大明48000
陳小玉55000

多個子查詢應用方式

範例:用 email 找薪水,用部門名稱來找 teams.id

INSERT INTO users (name, email, salary, team_id) VALUES
(
  '新同事',
  'new1@gmail.com',
  (SELECT salary FROM users WHERE email = 'a@gmail.com'),
  (SELECT id FROM teams WHERE name = '開發部')
);