SQL 函數完整指南:字串、日期、數學、聚合函數總整理【2025】

SQL 函數完整指南:字串、日期、數學、聚合函數總整理【2025】
SQL 內建函數是資料庫開發的利器,能讓你在查詢過程中直接處理字串、日期、數值等各種資料類型。熟練運用這些函數,可以大幅簡化程式邏輯,將原本需要在應用程式端處理的運算直接在資料庫完成,提升整體效能。
本文將系統性介紹 SQL 最常用的內建函數,包括字串函數、日期函數、數學函數、轉換函數與聚合函數。每個函數都附有語法說明與實際範例,並在文末提供快速查閱的函數速查表。
插圖:SQL 函數分類總覽圖,展示五大類函數及其常用功能
場景描述: 心智圖展示 SQL 函數五大分類(字串、日期、數學、轉換、聚合),每個分類下列出 4-5 個常用函數名稱。
視覺重點:
- 主要內容清晰呈現
必須出現的元素:
- 依據描述中的關鍵元素
需要顯示的中文字: 無
顏色調性: 專業、清晰
避免元素: 抽象圖形、齒輪、發光特效
Slug:
sql-functions-categories-mind-map
SQL 函數分類總覽
SQL 函數依據處理的資料類型可分為以下幾大類:
| 函數類型 | 用途 | 常用函數 |
|---|---|---|
| 字串函數 | 處理文字資料 | CONCAT, SUBSTRING, REPLACE, TRIM |
| 日期函數 | 處理日期時間 | GETDATE, DATEADD, DATEDIFF, FORMAT |
| 數學函數 | 數值運算 | ROUND, CEILING, FLOOR, ABS |
| 轉換函數 | 資料型別轉換 | CAST, CONVERT, COALESCE |
| 聚合函數 | 多列彙總計算 | COUNT, SUM, AVG, MAX, MIN |
注意: 不同資料庫(SQL Server、MySQL、PostgreSQL)的函數語法可能略有差異,本文主要以 SQL Server 語法為主,並在重要差異處標註。
字串函數
字串函數用於處理文字資料,包括串接、擷取、替換、去除空白等操作。
CONCAT - 字串串接
將多個字串合併為一個字串。
-- 語法
CONCAT(字串1, 字串2, ...)
-- 範例:合併姓名
SELECT CONCAT(FirstName, ' ', LastName) AS FullName
FROM Employees;
-- 結果:Alice Chen
-- 範例:組合地址
SELECT CONCAT(City, ', ', Country) AS Location
FROM Customers;
-- 結果:Taipei, Taiwan
各資料庫差異:
| 資料庫 | 語法 |
|---|---|
| SQL Server | CONCAT(a, b) 或 a + b |
| MySQL | CONCAT(a, b) |
| PostgreSQL | CONCAT(a, b) 或 `a |
LEN / LENGTH - 字串長度
取得字串的字元數。
-- SQL Server 使用 LEN
SELECT LEN('Hello World') AS StringLength;
-- 結果:11
-- MySQL / PostgreSQL 使用 LENGTH
SELECT LENGTH('Hello World') AS StringLength;
-- 結果:11
-- 實務範例:找出名稱過長的商品
SELECT ProductName, LEN(ProductName) AS NameLength
FROM Products
WHERE LEN(ProductName) > 50;
SUBSTRING / SUBSTR - 擷取子字串
從字串中擷取指定位置與長度的子字串。
-- 語法
SUBSTRING(字串, 起始位置, 長度)
-- 範例:擷取前 3 個字元
SELECT SUBSTRING('Hello World', 1, 3) AS Result;
-- 結果:Hel
-- 範例:擷取身分證字號前 1 碼(地區碼)
SELECT SUBSTRING(IDNumber, 1, 1) AS AreaCode
FROM Citizens;
-- 範例:擷取 Email 的使用者名稱(@ 之前)
SELECT SUBSTRING(Email, 1, CHARINDEX('@', Email) - 1) AS Username
FROM Users;
REPLACE - 字串替換
將字串中的指定文字替換為其他文字。
-- 語法
REPLACE(原始字串, 要替換的文字, 替換後的文字)
-- 範例:替換空格為底線
SELECT REPLACE('Hello World', ' ', '_') AS Result;
-- 結果:Hello_World
-- 範例:移除電話號碼中的橫線
SELECT REPLACE(PhoneNumber, '-', '') AS CleanPhone
FROM Customers;
-- 原始:02-1234-5678 → 結果:0212345678
-- 範例:敏感資料遮罩
SELECT REPLACE(CreditCard, SUBSTRING(CreditCard, 5, 8), '****-****') AS MaskedCard
FROM Payments;
TRIM / LTRIM / RTRIM - 去除空白
移除字串前後的空白字元。
-- TRIM:去除前後空白
SELECT TRIM(' Hello World ') AS Result;
-- 結果:Hello World
-- LTRIM:只去除左邊空白
SELECT LTRIM(' Hello') AS Result;
-- 結果:Hello
-- RTRIM:只去除右邊空白
SELECT RTRIM('Hello ') AS Result;
-- 結果:Hello
-- 實務範例:清理匯入資料
UPDATE Customers
SET CustomerName = TRIM(CustomerName),
Email = LOWER(TRIM(Email));
UPPER / LOWER - 大小寫轉換
-- 轉為大寫
SELECT UPPER('hello') AS Result; -- HELLO
-- 轉為小寫
SELECT LOWER('HELLO') AS Result; -- hello
-- 實務範例:Email 標準化(全部小寫)
SELECT LOWER(Email) AS NormalizedEmail FROM Users;
-- 實務範例:首字母大寫(SQL Server)
SELECT UPPER(LEFT(Name, 1)) + LOWER(SUBSTRING(Name, 2, LEN(Name))) AS ProperName
FROM Employees;
字串函數速查
| 函數 | 功能 | 範例 |
|---|---|---|
CONCAT(a, b) | 串接字串 | CONCAT('A', 'B') → 'AB' |
LEN(s) | 字串長度 | LEN('Hello') → 5 |
SUBSTRING(s, start, len) | 擷取子字串 | SUBSTRING('Hello', 1, 3) → 'Hel' |
REPLACE(s, old, new) | 替換文字 | REPLACE('AB', 'B', 'C') → 'AC' |
TRIM(s) | 去除空白 | TRIM(' A ') → 'A' |
UPPER(s) / LOWER(s) | 大小寫轉換 | UPPER('abc') → 'ABC' |
LEFT(s, n) | 取左邊 n 字元 | LEFT('Hello', 2) → 'He' |
RIGHT(s, n) | 取右邊 n 字元 | RIGHT('Hello', 2) → 'lo' |
CHARINDEX(find, s) | 尋找位置 | CHARINDEX('l', 'Hello') → 3 |
REVERSE(s) | 反轉字串 | REVERSE('ABC') → 'CBA' |
日期函數
日期函數用於處理日期與時間資料,包括取得當前時間、日期運算、格式化等。
GETDATE / NOW - 取得當前時間
-- SQL Server
SELECT GETDATE() AS CurrentDateTime;
-- 結果:2025-01-15 14:30:45.123
-- MySQL
SELECT NOW() AS CurrentDateTime;
-- PostgreSQL
SELECT CURRENT_TIMESTAMP AS CurrentDateTime;
-- 只取日期部分(SQL Server)
SELECT CAST(GETDATE() AS DATE) AS CurrentDate;
-- 結果:2025-01-15
DATEADD - 日期加減運算
在日期上加減指定的時間間隔。
-- 語法
DATEADD(間隔單位, 數量, 日期)
-- 間隔單位:YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
-- 範例:加 7 天
SELECT DATEADD(DAY, 7, '2025-01-15') AS Result;
-- 結果:2025-01-22
-- 範例:減 1 個月
SELECT DATEADD(MONTH, -1, '2025-01-15') AS Result;
-- 結果:2024-12-15
-- 實務範例:計算會員到期日(1 年後)
SELECT
MemberName,
JoinDate,
DATEADD(YEAR, 1, JoinDate) AS ExpiryDate
FROM Members;
-- 實務範例:查詢最近 30 天的訂單
SELECT * FROM Orders
WHERE OrderDate >= DATEADD(DAY, -30, GETDATE());
DATEDIFF - 日期差距計算
計算兩個日期之間的差距。
-- 語法
DATEDIFF(間隔單位, 開始日期, 結束日期)
-- 範例:計算天數差
SELECT DATEDIFF(DAY, '2025-01-01', '2025-01-15') AS DaysDiff;
-- 結果:14
-- 範例:計算月份差
SELECT DATEDIFF(MONTH, '2024-06-15', '2025-01-15') AS MonthsDiff;
-- 結果:7
-- 實務範例:計算員工年資
SELECT
EmployeeName,
HireDate,
DATEDIFF(YEAR, HireDate, GETDATE()) AS YearsOfService
FROM Employees;
-- 實務範例:計算訂單處理時間
SELECT
OrderID,
OrderDate,
ShipDate,
DATEDIFF(DAY, OrderDate, ShipDate) AS ProcessingDays
FROM Orders;
DATEPART / YEAR / MONTH / DAY - 擷取日期部分
-- 使用 DATEPART
SELECT DATEPART(YEAR, '2025-01-15') AS Year; -- 2025
SELECT DATEPART(MONTH, '2025-01-15') AS Month; -- 1
SELECT DATEPART(DAY, '2025-01-15') AS Day; -- 15
SELECT DATEPART(WEEKDAY, '2025-01-15') AS WeekDay; -- 4 (週三)
-- 使用專用函數
SELECT YEAR('2025-01-15') AS Year; -- 2025
SELECT MONTH('2025-01-15') AS Month; -- 1
SELECT DAY('2025-01-15') AS Day; -- 15
-- 實務範例:按月份統計銷售額
SELECT
YEAR(OrderDate) AS OrderYear,
MONTH(OrderDate) AS OrderMonth,
SUM(TotalAmount) AS MonthlySales
FROM Orders
GROUP BY YEAR(OrderDate), MONTH(OrderDate)
ORDER BY OrderYear, OrderMonth;
FORMAT / CONVERT - 日期格式化
將日期轉換為指定格式的字串。
-- SQL Server FORMAT 函數(較直觀)
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd') AS DateStr;
-- 結果:2025-01-15
SELECT FORMAT(GETDATE(), 'yyyy/MM/dd HH:mm:ss') AS DateTimeStr;
-- 結果:2025/01/15 14:30:45
SELECT FORMAT(GETDATE(), 'yyyy年MM月dd日') AS ChineseDateStr;
-- 結果:2025年01月15日
-- SQL Server CONVERT 函數(使用樣式代碼)
SELECT CONVERT(VARCHAR, GETDATE(), 23) AS DateStr; -- 2025-01-15
SELECT CONVERT(VARCHAR, GETDATE(), 111) AS DateStr; -- 2025/01/15
SELECT CONVERT(VARCHAR, GETDATE(), 112) AS DateStr; -- 20250115
-- MySQL 使用 DATE_FORMAT
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS DateStr;
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日') AS ChineseDateStr;
日期函數速查
| 函數 | 功能 | 範例 |
|---|---|---|
GETDATE() | 當前日期時間 | GETDATE() → 2025-01-15 14:30:45 |
DATEADD(unit, n, date) | 日期加減 | DATEADD(DAY, 7, '2025-01-15') → 2025-01-22 |
DATEDIFF(unit, d1, d2) | 日期差距 | DATEDIFF(DAY, '2025-01-01', '2025-01-15') → 14 |
YEAR(date) | 取得年份 | YEAR('2025-01-15') → 2025 |
MONTH(date) | 取得月份 | MONTH('2025-01-15') → 1 |
DAY(date) | 取得日期 | DAY('2025-01-15') → 15 |
FORMAT(date, fmt) | 格式化日期 | FORMAT(GETDATE(), 'yyyy-MM-dd') |
數學函數
數學函數用於數值運算,包括四捨五入、取整、絕對值等。
ROUND - 四捨五入
-- 語法
ROUND(數值, 小數位數)
-- 範例
SELECT ROUND(3.14159, 2) AS Result; -- 3.14
SELECT ROUND(3.145, 2) AS Result; -- 3.15(四捨五入)
SELECT ROUND(3.144, 2) AS Result; -- 3.14
-- 四捨五入到整數
SELECT ROUND(3.7, 0) AS Result; -- 4
-- 實務範例:價格四捨五入
SELECT
ProductName,
Price,
ROUND(Price * 0.9, 0) AS DiscountPrice -- 9 折後取整數
FROM Products;
CEILING / FLOOR - 無條件進位與捨去
-- CEILING:無條件進位(取較大整數)
SELECT CEILING(3.1) AS Result; -- 4
SELECT CEILING(3.9) AS Result; -- 4
SELECT CEILING(-3.1) AS Result; -- -3
-- FLOOR:無條件捨去(取較小整數)
SELECT FLOOR(3.1) AS Result; -- 3
SELECT FLOOR(3.9) AS Result; -- 3
SELECT FLOOR(-3.1) AS Result; -- -4
-- 實務範例:計算需要的箱數(每箱 12 個)
SELECT
OrderID,
Quantity,
CEILING(Quantity / 12.0) AS BoxesNeeded
FROM OrderDetails;
ABS - 絕對值
SELECT ABS(-10) AS Result; -- 10
SELECT ABS(10) AS Result; -- 10
-- 實務範例:計算價差絕對值
SELECT
ProductName,
OriginalPrice,
CurrentPrice,
ABS(CurrentPrice - OriginalPrice) AS PriceDifference
FROM Products;
POWER / SQRT - 次方與平方根
-- POWER:次方運算
SELECT POWER(2, 3) AS Result; -- 8(2 的 3 次方)
SELECT POWER(10, 2) AS Result; -- 100
-- SQRT:平方根
SELECT SQRT(16) AS Result; -- 4
SELECT SQRT(2) AS Result; -- 1.4142...
-- 實務範例:計算複利
-- 本金 10000,年利率 5%,3 年後本利和
SELECT 10000 * POWER(1.05, 3) AS FutureValue;
-- 結果:11576.25
MOD / % - 取餘數
-- SQL Server 使用 %
SELECT 10 % 3 AS Result; -- 1
-- MySQL / PostgreSQL 也支援 MOD 函數
SELECT MOD(10, 3) AS Result; -- 1
-- 實務範例:判斷奇偶數
SELECT
Number,
CASE WHEN Number % 2 = 0 THEN '偶數' ELSE '奇數' END AS Type
FROM Numbers;
轉換函數
轉換函數用於資料型別轉換與 NULL 值處理。
CAST - 型別轉換
標準 SQL 的型別轉換函數。
-- 語法
CAST(運算式 AS 目標型別)
-- 數字轉字串
SELECT CAST(123 AS VARCHAR(10)) AS Result; -- '123'
-- 字串轉數字
SELECT CAST('456' AS INT) AS Result; -- 456
-- 字串轉日期
SELECT CAST('2025-01-15' AS DATE) AS Result;
-- 實務範例:計算平均值(避免整數除法)
SELECT CAST(SUM(Quantity) AS DECIMAL(10,2)) / COUNT(*) AS AvgQuantity
FROM OrderDetails;
CONVERT - 型別轉換(含格式)
SQL Server 特有的轉換函數,支援日期格式化。
-- 語法
CONVERT(目標型別, 運算式, 樣式代碼)
-- 數字轉字串
SELECT CONVERT(VARCHAR(10), 123) AS Result;
-- 日期格式化(常用樣式代碼)
SELECT CONVERT(VARCHAR, GETDATE(), 23) AS Result; -- 2025-01-15(ISO 格式)
SELECT CONVERT(VARCHAR, GETDATE(), 111) AS Result; -- 2025/01/15
SELECT CONVERT(VARCHAR, GETDATE(), 112) AS Result; -- 20250115
SELECT CONVERT(VARCHAR, GETDATE(), 120) AS Result; -- 2025-01-15 14:30:45
常用日期樣式代碼:
| 代碼 | 格式 | 範例 |
|---|---|---|
| 23 | yyyy-mm-dd | 2025-01-15 |
| 111 | yyyy/mm/dd | 2025/01/15 |
| 112 | yyyymmdd | 20250115 |
| 120 | yyyy-mm-dd hh:mi:ss | 2025-01-15 14:30:45 |
| 108 | hh:mi:ss | 14:30:45 |
COALESCE - 回傳第一個非 NULL 值
-- 語法
COALESCE(值1, 值2, 值3, ...)
-- 範例
SELECT COALESCE(NULL, NULL, 'Hello') AS Result; -- 'Hello'
SELECT COALESCE(NULL, 'A', 'B') AS Result; -- 'A'
-- 實務範例:顯示預設值
SELECT
CustomerName,
COALESCE(Phone, Mobile, '無電話') AS ContactPhone
FROM Customers;
-- 實務範例:計算含預設值
SELECT
ProductName,
Price * COALESCE(Discount, 1) AS FinalPrice
FROM Products;
ISNULL / IFNULL / NVL - NULL 值替換
-- SQL Server:ISNULL
SELECT ISNULL(NULL, '預設值') AS Result; -- '預設值'
-- MySQL:IFNULL
SELECT IFNULL(NULL, '預設值') AS Result;
-- Oracle:NVL
SELECT NVL(NULL, '預設值') AS Result;
-- 實務範例:處理可能為 NULL 的折扣
SELECT
ProductName,
Price,
ISNULL(Discount, 0) AS Discount,
Price * (1 - ISNULL(Discount, 0)) AS FinalPrice
FROM Products;
聚合函數
聚合函數用於對多筆資料進行彙總計算,通常搭配 GROUP BY 使用。
COUNT - 計算筆數
-- 計算所有列數
SELECT COUNT(*) AS TotalRows FROM Orders;
-- 計算非 NULL 值的數量
SELECT COUNT(ShipDate) AS ShippedOrders FROM Orders;
-- 計算不重複值的數量
SELECT COUNT(DISTINCT CustomerID) AS UniqueCustomers FROM Orders;
-- 實務範例:各部門員工數
SELECT
DepartmentID,
COUNT(*) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID;
SUM - 加總
-- 基本加總
SELECT SUM(TotalAmount) AS TotalSales FROM Orders;
-- 搭配條件
SELECT SUM(TotalAmount) AS JanuarySales
FROM Orders
WHERE MONTH(OrderDate) = 1;
-- 實務範例:各類別銷售額
SELECT
CategoryID,
SUM(Price * Quantity) AS CategorySales
FROM OrderDetails od
JOIN Products p ON od.ProductID = p.ProductID
GROUP BY CategoryID;
AVG - 平均值
-- 基本平均
SELECT AVG(Price) AS AvgPrice FROM Products;
-- 注意:AVG 會忽略 NULL 值
-- 若要將 NULL 視為 0,需先轉換
SELECT AVG(ISNULL(Score, 0)) AS AvgScore FROM Students;
-- 實務範例:各部門平均薪資
SELECT
DepartmentID,
AVG(Salary) AS AvgSalary,
COUNT(*) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID;
MAX / MIN - 最大值與最小值
-- 數值最大最小
SELECT MAX(Price) AS MaxPrice, MIN(Price) AS MinPrice FROM Products;
-- 日期最大最小
SELECT MAX(OrderDate) AS LatestOrder, MIN(OrderDate) AS EarliestOrder FROM Orders;
-- 字串最大最小(按字母順序)
SELECT MAX(ProductName) AS Last, MIN(ProductName) AS First FROM Products;
-- 實務範例:各類別價格範圍
SELECT
CategoryID,
MIN(Price) AS MinPrice,
MAX(Price) AS MaxPrice,
MAX(Price) - MIN(Price) AS PriceRange
FROM Products
GROUP BY CategoryID;
常見問題 FAQ
Q1:SQL 如何將日期轉換成字串格式?
有多種方式可以將日期轉換為字串:(1) SQL Server FORMAT 函數:FORMAT(GETDATE(), 'yyyy-MM-dd') 可得到 '2025-01-15',格式代碼與 .NET 一致,最直觀;(2) SQL Server CONVERT 函數:CONVERT(VARCHAR, GETDATE(), 23) 使用樣式代碼,23 代表 ISO 格式 yyyy-mm-dd;(3) MySQL DATE_FORMAT 函數:DATE_FORMAT(NOW(), '%Y-%m-%d');(4) PostgreSQL TO_CHAR 函數:TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')。選擇建議:SQL Server 2012+ 建議用 FORMAT(較直觀),舊版本用 CONVERT。
Q2:CAST 和 CONVERT 有什麼差別?
兩者都是型別轉換函數,主要差異:(1) 標準性:CAST 是 ANSI SQL 標準語法,所有資料庫都支援;CONVERT 是 SQL Server 特有語法;(2) 日期格式:CONVERT 支援樣式代碼,可直接指定日期輸出格式(如 CONVERT(VARCHAR, date, 23));CAST 不支援格式化,需搭配其他函數;(3) 語法:CAST 用 AS 關鍵字(CAST(x AS INT)),CONVERT 用逗號(CONVERT(INT, x))。選擇建議:需要跨資料庫相容用 CAST;需要日期格式化用 CONVERT 或 FORMAT。
延伸學習資源
深入學習 SQL 查詢技巧,建議參考以下資源:
SQL 基礎語法:
- SQL 完整指南:從入門到精通的資料庫查詢語言教學
- SQL 語法大全:SELECT、JOIN、WHERE 完整查詢指令教學
- SQL JOIN 完整教學:INNER、LEFT、RIGHT、FULL JOIN 圖解
- SQL CRUD 操作完整指南:INSERT、UPDATE、DELETE 語法教學
進階主題:
結論
SQL 內建函數是資料庫開發的重要工具,熟練運用可以大幅提升開發效率。本文介紹的函數涵蓋了日常開發最常用的情境:
- 字串函數:CONCAT、SUBSTRING、REPLACE、TRIM 處理文字資料
- 日期函數:DATEADD、DATEDIFF、FORMAT 處理日期運算與格式化
- 數學函數:ROUND、CEILING、FLOOR 處理數值運算
- 轉換函數:CAST、CONVERT、COALESCE 處理型別轉換與 NULL 值
- 聚合函數:COUNT、SUM、AVG、MAX、MIN 進行資料彙總
建議將本文收藏作為參考手冊,遇到需要使用函數時快速查閱。
想要隨時查閱 SQL 函數? — 下載我們整理的 SQL 函數速查表 PDF,包含所有常用函數的語法與範例,列印出來放在桌邊隨時參考。
參考資料
- Microsoft SQL Server Functions Reference - https://docs.microsoft.com/sql/t-sql/functions/functions
- MySQL Functions Reference - https://dev.mysql.com/doc/refman/8.0/en/functions.html
- PostgreSQL Functions Reference - https://www.postgresql.org/docs/current/functions.html
- W3Schools SQL Functions - https://www.w3schools.com/sql/sql_ref_sqlserver.asp
相關文章
雲端 SQL 資料庫比較:Azure SQL、Cloud SQL、AWS RDS 完整評比【2025】
全面比較三大雲端 SQL 資料庫服務:Azure SQL Database、Google Cloud SQL、AWS RDS。涵蓋功能特色、高可用性、定價模式、遷移策略,幫助企業選擇最適合的雲端資料庫方案。
SQLSQL CRUD 操作完整指南:INSERT、UPDATE、DELETE 語法教學【2025】
系統性介紹 SQL 資料操作語言(DML)核心指令。涵蓋 INSERT 新增、UPDATE 更新、DELETE 刪除的完整語法,以及 TRUNCATE 差異比較、交易控制、常見錯誤提醒。
SQLSQL Injection 完整攻防指南:原理解析與防範實戰【2025】
深入解析 SQL Injection 攻擊原理與防範策略。涵蓋 Classic、Blind、Union-based 攻擊類型、參數化查詢實作、WAF 防護設定,以及 SQLMap 安全測試工具使用教學。