MOD() 函數 (SQL MOD() Function)

MOD() 函數用來計算兩數相除後的餘數(模數運算)。

語法

MOD(dividend, divisor)
-- 或使用 % 運算子
dividend % divisor
  • dividend:被除數
  • divisor:除數

各資料庫支援

資料庫MOD()% 運算子
MySQL
SQL Server
PostgreSQL
Oracle

基本範例

-- MySQL / PostgreSQL / Oracle
SELECT MOD(10, 3);
-- 結果: 1(10 ÷ 3 = 3 餘 1)

SELECT MOD(20, 4);
-- 結果: 0(20 ÷ 4 = 5 餘 0)

SELECT MOD(7, 2);
-- 結果: 1(7 ÷ 2 = 3 餘 1)

-- SQL Server / MySQL / PostgreSQL(使用 % 運算子)
SELECT 10 % 3;
-- 結果: 1

實際應用範例

判斷奇偶數

-- 找出所有偶數 ID 的記錄
SELECT * FROM products WHERE MOD(id, 2) = 0;

-- 找出所有奇數 ID 的記錄
SELECT * FROM products WHERE MOD(id, 2) = 1;

-- SQL Server
SELECT * FROM products WHERE id % 2 = 0;

分組輪替(如交替換行顏色)

SELECT 
    id,
    name,
    CASE MOD(ROW_NUMBER() OVER (ORDER BY id), 2)
        WHEN 0 THEN 'even'
        WHEN 1 THEN 'odd'
    END AS row_class
FROM products;

每 N 筆取一筆

-- 每 5 筆取 1 筆
SELECT * FROM products WHERE MOD(id, 5) = 0;

循環分配(如分配到不同伺服器)

-- 將訂單平均分配到 3 台伺服器
SELECT 
    order_id,
    MOD(order_id, 3) + 1 AS server_id
FROM orders;

結果:order_id 1 → server 1, order_id 2 → server 2, order_id 3 → server 3, order_id 4 → server 1...

判斷是否為特定數的倍數

-- 找出數量是 12 的倍數的產品(如一打)
SELECT * FROM products WHERE MOD(quantity, 12) = 0;

-- 找出價格是 100 的倍數的產品
SELECT * FROM products WHERE MOD(price, 100) = 0;

搭配日期使用

-- 找出每月第一週的訂單(假設日期 1-7 號)
SELECT * FROM orders WHERE MOD(DAY(order_date), 7) BETWEEN 1 AND 7;

-- MySQL:找出星期一的訂單
SELECT * FROM orders WHERE MOD(DAYOFWEEK(order_date), 7) = 2;

注意事項

當除數為 0 時,MOD() 會產生錯誤。可以使用 NULLIF() 來避免:

SELECT MOD(10, NULLIF(divisor, 0)) FROM table_name;
-- 當 divisor 為 0 時,結果為 NULL 而非錯誤