一、字符串函數??
處理文本數據,常用函數:
-
??CONCAT(str1, str2, ...)??
- ??作用??:拼接字符串。
- ??示例??:
SELECT CONCAT('Hello', ' ', 'World');
?→?Hello World
- ??注意??:若任一參數為?
NULL
,結果為?NULL
。
-
??CONCAT_WS(separator, str1, str2, ...)??
- ??作用??:用分隔符拼接字符串,自動忽略?
NULL
。 - ??示例??:
SELECT CONCAT_WS('-', '2023', NULL, '10');
?→?2023-10
- ??作用??:用分隔符拼接字符串,自動忽略?
-
??SUBSTRING(str, start, length)??
- ??作用??:截取子串,索引從?
1
?開始。 - ??示例??:
SELECT SUBSTRING('MySQL', 3, 2);
?→?SQ
- ??作用??:截取子串,索引從?
-
??REPLACE(str, from_str, to_str)??
- ??作用??:替換字符串中的子串。
- ??示例??:
SELECT REPLACE('foo bar', 'foo', 'hello');
?→?hello bar
-
??TRIM([LEADING|TRAILING|BOTH] trim_str FROM str)??
- ??作用??:去除首尾空格或指定字符。
- ??示例??:
SELECT TRIM(' MySQL ');
?→?MySQL
-
??LENGTH(str)?? 與 ??CHAR_LENGTH(str)??
- ??區別??:
LENGTH
?返回字節數,CHAR_LENGTH
?返回字符數。 - ??示例??:
SELECT LENGTH('中文'), CHAR_LENGTH('中文');
?→?6, 2
(UTF-8編碼)
- ??區別??:
??二、數值函數??
處理數值計算,常用函數:
-
??ROUND(num, decimals)??
- ??作用??:四舍五入,
decimals
?可為負數。 - ??示例??:
SELECT ROUND(123.456, -1), ROUND(123.456, 2);
?→?120, 123.46
- ??作用??:四舍五入,
-
??CEIL(num)?? 與 ??FLOOR(num)??
- ??作用??:向上/向下取整。
- ??示例??:
SELECT CEIL(3.1), FLOOR(3.9);
?→?4, 3
-
??RAND()??
- ??作用??:生成?
[0,1)
?的隨機數。 - ??示例??:
SELECT RAND();
?→ 隨機值如?0.123
- ??注意??:結合?
ORDER BY RAND()
?可隨機排序,但性能較差。
- ??作用??:生成?
-
??POW(x, y)??
- ??作用??:計算?
x
?的?y
?次方。 - ??示例??:
SELECT POW(2, 3);
?→?8
- ??作用??:計算?
??三、日期時間函數??
處理日期和時間,常用函數:
-
??NOW()??
- ??作用??:返回當前日期和時間(格式:
YYYY-MM-DD HH:mm:ss
)。 - ??示例??:
SELECT NOW();
?→?2023-10-10 14:30:00
- ??作用??:返回當前日期和時間(格式:
-
??DATE_FORMAT(date, format)??
- ??作用??:格式化日期。
- ??示例??:
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
?→?2023-10-10
-
??DATEDIFF(date1, date2)??
- ??作用??:計算兩個日期相差的天數。
- ??示例??:
SELECT DATEDIFF('2023-10-10', '2023-10-01');
?→?9
-
??DATE_ADD(date, INTERVAL expr unit)??
- ??作用??:日期加法。
- ??示例??:
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);
?→ 當前日期加一個月。
-
??EXTRACT(unit FROM date)??
- ??作用??:提取日期部分(如年、月、日)。
- ??示例??:
SELECT EXTRACT(YEAR FROM '2023-10-10');
?→?2023
??四、流程控制函數??
處理條件邏輯:
-
??IF(condition, value_if_true, value_if_false)??
- ??示例??:
SELECT IF(score >= 60, 'Pass', 'Fail');
- ??示例??:
-
??CASE??
- ??作用??:多條件分支。
- ??示例??:
SELECT CASE WHEN score >= 90 THEN 'A'WHEN score >= 80 THEN 'B'ELSE 'C'END AS grade FROM students;
-
??COALESCE(value1, value2, ...)??
- ??作用??:返回第一個非?
NULL
?值。 - ??示例??:
SELECT COALESCE(NULL, 'default');
?→?default
- ??作用??:返回第一個非?
??五、聚合函數??
對多行數據進行統計:
-
??SUM(column)??
- ??作用??:求和,忽略?
NULL
。
- ??作用??:求和,忽略?
-
??COUNT(expr)??
- ??示例??:
COUNT(*)
?統計行數,COUNT(DISTINCT column)
?去重計數。
- ??示例??:
-
??GROUP_CONCAT(expr)??
- ??作用??:合并多行結果,默認逗號分隔。
- ??示例??:
SELECT GROUP_CONCAT(name SEPARATOR '|') FROM users;
-
??AVG(column)?? 與 ??MAX(column)/MIN(column)??
- ??注意??:
AVG
?忽略?NULL
,MAX/MIN
?適用于數值、日期和字符串。
- ??注意??:
??六、加密函數??
-
??MD5(str)?? 與 ??SHA1(str)??
- ??示例??:
SELECT MD5('password');
?→ 32位哈希值。
- ??示例??:
-
??SHA2(str, hash_length)??
- ??示例??:
SELECT SHA2('password', 256);
?→ 64位哈希值。
- ??示例??:
??七、注意事項??
- ??索引失效??:避免在?
WHERE
?中對索引列使用函數(如?WHERE YEAR(date) = 2023
)。 - ??NULL 處理??:函數如?
SUM
?忽略?NULL
,而?CONCAT
?遇到?NULL
?返回?NULL
。 - ??版本差異??:窗口函數(如?
ROW_NUMBER()
)僅支持 MySQL 8.0+。 - ??性能優化??:謹慎使用?
ORDER BY RAND()
?或大文本處理函數。
??八、自定義函數??
通過?CREATE FUNCTION
?可定義存儲函數,需注意權限和語法:
DELIMITER $$
CREATE FUNCTION add_tax(price FLOAT) RETURNS FLOAT
BEGINRETURN price * 1.1;
END
$$
DELIMITER ;