承接基礎查詢教學,本文深入探討 SELECT 陳述式的核心修飾子句與關鍵字,掌握它們能讓您精準控制資料輸出形式與彙總邏輯。
| 類別 | 關鍵字/子句 | 功能 |
|---|---|---|
| 子句 | ORDER BY | 指定排序順序 |
| 子句 | GROUP BY | 分組彙總 |
| 關鍵字 | DISTINCT | 移除重複列 |
| 彙總函數 | COUNT | 計算符合列數 |
| 彙總函數 | AVG | 計算平均值 |
| 彙總函數 | SUM | 計算總和 |
| 彙總函數 | MIN | 最小非 NULL 值 |
| 彙總函數 | MAX | 最大值 |
語法:ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
必須置於查詢語句末尾。預設遞增 (ASC),DESC 為遞減。
-- 單欄排序
SELECT * FROM Contacts ORDER BY first_name;
-- 結合 WHERE 子句
SELECT first_name, last_name FROM Contacts
WHERE first_name BETWEEN 'a' AND 'k'
ORDER BY last_name;
SELECT * FROM Contacts ORDER BY company, last_name, first_name;
優先序由左至右遞減:先依 company 排序,相同者再依 last_name,以此類推。
SELECT * FROM Sales
ORDER BY net_amount DESC, last_name, first_name;
net_amount 遞減 (金額高者優先),同金額則依姓名遞增排序。
SELECT company, first_name, net_amount FROM Sales
ORDER BY start_date, last_name;
只要欄位存在於資料表即可作為排序依據。
作用於 整個 SELECT 清單,僅回傳唯一組合:
SELECT DISTINCT company FROM Sales;
注意:若 SELECT DISTINCT company, salesperson,同一公司不同業務員仍會分別列出。
| 函數 | 說明 | 範例 |
|---|---|---|
| COUNT(*) | 列總數 (含 NULL) | SELECT COUNT(*) FROM Sales |
| COUNT(column) | 非 NULL 值計數 | SELECT COUNT(email) FROM Contacts |
| AVG(column) | 數值平均 | SELECT AVG(price) FROM Products |
| SUM(column) | 數值總和 | SELECT SUM(qty) FROM Orders |
| MIN(column) | 最小非 NULL 值 | SELECT MIN(hire_date) FROM Employees |
| MAX(column) | 最大值 | SELECT MAX(salary) FROM Employees |
配合彙總函數,依指定欄位分組計算:
SELECT department, COUNT(*) AS emp_count, AVG(salary) AS avg_salary
FROM Employees
GROUP BY department;
鐵律:SELECT 清單中非彙總函數的欄位,必須出現在 GROUP BY 中。
SELECT department, AVG(salary) AS avg_salary
FROM Employees
GROUP BY department
HAVING AVG(salary) > 50000;
WHERE 過濾原始列,HAVING 過濾分組後的彙總結果。
-- 找出每個業務員的總銷售額、平均單價、交易筆數,且總額超過 100 萬者
SELECT salesperson,
SUM(amount) AS total_sales,
AVG(amount) AS avg_deal,
COUNT(*) AS deal_count
FROM Sales
WHERE year = 2024
GROUP BY salesperson
HAVING SUM(amount) > 1000000
ORDER BY total_sales DESC;
ORDER BY 掌控輸出順序,DISTINCT 去重,彙總函數提供統計摘要,GROUP BY 實現分組分析。這些工具組合起來,能直接在資料庫層完成大部分報表邏輯,減少應用層處理負擔。