返回首頁SQL

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

19 min 分鐘閱讀

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 ServerCONCAT(a, b)a + b
MySQLCONCAT(a, b)
PostgreSQLCONCAT(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

常用日期樣式代碼:

代碼格式範例
23yyyy-mm-dd2025-01-15
111yyyy/mm/dd2025/01/15
112yyyymmdd20250115
120yyyy-mm-dd hh:mi:ss2025-01-15 14:30:45
108hh:mi:ss14: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 內建函數是資料庫開發的重要工具,熟練運用可以大幅提升開發效率。本文介紹的函數涵蓋了日常開發最常用的情境:

  • 字串函數:CONCAT、SUBSTRING、REPLACE、TRIM 處理文字資料
  • 日期函數:DATEADD、DATEDIFF、FORMAT 處理日期運算與格式化
  • 數學函數:ROUND、CEILING、FLOOR 處理數值運算
  • 轉換函數:CAST、CONVERT、COALESCE 處理型別轉換與 NULL 值
  • 聚合函數:COUNT、SUM、AVG、MAX、MIN 進行資料彙總

建議將本文收藏作為參考手冊,遇到需要使用函數時快速查閱。


想要隨時查閱 SQL 函數? — 下載我們整理的 SQL 函數速查表 PDF,包含所有常用函數的語法與範例,列印出來放在桌邊隨時參考。

免費下載 SQL 函數速查表 PDF →


參考資料

需要專業的雲端建議?

無論您正在評估雲平台、優化現有架構,或尋找節費方案,我們都能提供協助

預約免費諮詢

相關文章