本文整理出一些 MySQL 的內建函數,能夠在查詢時,對結果中的欄位值做調整。比方說四捨五入、計算相差天數、轉大小寫等,都能讓資料看起來更有意義。
此篇亦轉載到個人部落格。
假設我們有以下的資料表。
|| id || first_name || last_name ||
|-|-|-|
|1|Vincent|Zheng|
在查詢的 SELECT 語法後方,可呼叫函數,並將欄位名稱作為參數傳入,進行運算。
以下的語法,是將「first_name」與「last_name」的欄位值,傳遞給叫做 CONCAT 的函數串接起來。
SELECT CONCAT(`first_name`, `last_name`) AS `full_name`
FROM `employee`;
本文接下來的例子,參數值都是寫死的,實際使用時,替換為資料表的欄位名稱即可。
CEIL 能讓數值往正方向無條件進位。
SELECT CEIL(2.1); -- 3
SELECT CEIL(-2.1); -- -2
FLOOR 能讓數值往負方向無條件進捨去。
SELECT FLOOR(2.8); -- 2
SELECT FLOOR(-2.8); -- -3
ROUND 能讓數值四捨五入到指定的小數位。
SELECT ROUND(30.2368, 3); -- 30.237
SELECT ROUND(30.2361, 3); -- 30.236
SELECT ROUND(-4.52, 1); -- -4.5
MOD 能取餘數。
SELECT MOD(24, 6); -- 0
SELECT MOD(24, 7); -- 3
RAND 能產生大於等於 0,而且小於 1 的亂數。
SELECT CEIL(RAND() * 10);
以下的使用方式能產生範圍為 1 ~ 10 的亂數。
SELECT CEIL(RAND() * 10);
CONCAT 可以串接字串。例如將姓氏與名字組合成全名。
SELECT CONCAT("Vincent", " ", "van", " ", "Gogh");
UPPER 可將英文轉為大寫。
SELECT UPPER("mssql 資料庫"); -- MSSQL 資料庫
LOWER 可將英文轉為小寫。
SELECT LOWER("Mongo DB"); -- mongo db
LPAD 可針對未達指定長度的字串,將指定的字串填充在左方,直到滿足該長度。
SELECT LPAD("493", 5, "0"); -- 00493
SELECT LPAD(10, 2, 0); -- 10
SELECT LPAD("7468", 3, "0"); -- 746
至於 RPAD 則是將字串填充在右方。
這兩個函數的參數,可以傳入數值或字串型態,而回傳的結果固定為字串。
TRIM 可以去除字串首尾的半形空白。
SELECT TRIM(" Hello World "); -- Hello World
LENGTH 可以取得字串的長度。
SELECT LENGTH("Hello World"); -- 11
SUBSTRING 可以擷取字串的一部份。
SELECT SUBSTRING("Hello World", 1, 7); -- Hello W
CURDATE 可取得現在日期(UTC+0)。
SELECT CURDATE(); -- 2024-01-22
CURTIME 可取得現在時間(UTC+0)。
SELECT CURTIME(); -- 03:07:18
NOW 可取得現在日期與時間(UTC+0)。
SELECT CURTIME(); -- 2024-01-22 03:07:18
YEAR、MONTH、DAY 分別可取得日期的年、月、日部份。
SELECT YEAR("2024-01-22"); -- 2024
SELECT MONTH("2024-01-22 03:07:18"); -- 1
SELECT DAY(NOW()); --22
HOUR、MINUTE、SECOND 分別可取得日期的時、分、秒部份。
SELECT HOUR("03:07:18"); -- 3
SELECT MINUTE("2024-01-22 03:07:18"); -- 7
SELECT SECOND(NOW()); --18
DATE_ADD 可對日期時間進行增減。
SELECT DATE_ADD("2024-01-22", INTERVAL 180 DAY); -- 2024-07-20
SELECT DATE_ADD(NOW(), INTERVAL -3 HOUR); -- 2024-07-20 00:07:18
其中 INTERVAL 是固定要寫上的關鍵字。而 DAY 與 HOUR 為單位。
DATE_DIFF 可計算相差的天數。
SELECT DATEDIFF("2024-01-22", "2024-01-05"); -- 17
SELECT DATEDIFF("2024-01-05", "2024-01-22"); -- -17
SELECT DATEDIFF("2024-01-22 00:00:01", "2024-01-21 23:59:59"); -- 1
此函數的計算方式,是第一個參數減去第二個。且只看日期部份,忽略時間。
IF 能夠傳入判斷式,當結果為 true 或 false,傳回各自指定的值,
SELECT IF(1 > 0, "大於", "小於"); -- 大於
SELECT IF(NOW() < "2024-01-01", "未到期", "已到期"); -- 已到期
IFNULL 可在傳入的值為 null 時,回傳另一個指定的值。
SELECT IFNULL(null, "Unknown");
最後要介紹的不算是函數,但也是一種條件判斷語法。
CASE ... WHEN ... THEN ... ELSE ... END 語法可實現多重選擇,有兩種寫法。
第一種是提供多個條件依序判斷,遇到第一個符合的條件,就回傳值。
SELECT
CASE
WHEN NOW() < "2024-07-01" THEN "短期"
WHEN NOW() < "2025-01-01" THEN "中期"
ELSE "長期"
END;
第二種是給定一個值,根據它的值為何,來決定回傳值。
SELECT
CASE YEAR("2026-01-15")
WHEN 2024 THEN "一年內"
WHEN 2025 THEN "兩年內"
ELSE "兩年以上"
END;
今日文章到此結束!
最後宣傳一下自己的部落格,我是「新手工程師的程式教室」的作者,主要發表後端相關文章,請多指教![]()