萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 常用日期、字符串、數值處理函數速查手冊

MySQL 常用函數速查手冊:日期、字符串、數值、條件、全文搜索

整理開發高頻使用的 MySQL 內建函數,含語法、參數、示例與實戰技巧,適合作為桌面速查卡。

字符串函數

函數語法示例結果/說明
LEFTLEFT(str, len)LEFT('abcdef', 3)'abc' - 截取左側
RIGHTRIGHT(str, len)RIGHT('abcdef', 3)'def' - 截取右側
SUBSTRINGSUBSTRING(str, pos, len)SUBSTRING('abcdef', 2, 3)'bcd' - 1-based 位置
CONCATCONCAT(str1, str2, ...)CONCAT('a','b','c')'abc' - 任一參數為 NULL 結果為 NULL
CONCAT_WSCONCAT_WS(sep, str1, str2...)CONCAT_WS('-', '2024','01','15')'2024-01-15' - 跳過 NULL
REPLACEREPLACE(str, from, to)REPLACE('a.b.c', '.', '_')'a_b_c' - 全局替換
TRIMTRIM([BOTH|LEADING|TRAILING] rem FROM str)TRIM(' abc ')'abc' - 去除首尾空格
LENGTHLENGTH(str)LENGTH('中文')6 - 字節長度 (UTF-8 中文 3 字節)
CHAR_LENGTHCHAR_LENGTH(str)CHAR_LENGTH('中文')2 - 字符長度
LOWER/UPPERLOWER(str)/UPPER(str)LOWER('ABC')'abc' / 'ABC'
REVERSEREVERSE(str)REVERSE('abc')'cba'
LOCATELOCATE(substr, str, [pos])LOCATE('b', 'abc')2 - 位置,未找到返回 0
STRCMPSTRCMP(str1, str2)STRCMP('a','b')-1/0/1 - 比較結果

日期時間函數

函數語法示例結果/說明
NOW / CURRENT_TIMESTAMPNOW()NOW()2024-01-15 14:30:45 - 日期時間
CURDATE / CURRENT_DATECURDATE()CURDATE()2024-01-15 - 僅日期
CURTIME / CURRENT_TIMECURTIME()CURTIME()14:30:45 - 僅時間
DATEDATE(datetime)DATE(NOW())2024-01-15 - 提取日期部分
DATE_FORMATDATE_FORMAT(date, format)DATE_FORMAT(NOW(), '%Y-%m-%d')格式化輸出
STR_TO_DATESTR_TO_DATE(str, format)STR_TO_DATE('20240115', '%Y%m%d')2024-01-15 - 字符串轉日期
FROM_UNIXTIMEFROM_UNIXTIME(ts, [format])FROM_UNIXTIME(1705312245)時間戳轉日期時間
UNIX_TIMESTAMPUNIX_TIMESTAMP([date])UNIX_TIMESTAMP()當前/指定時間轉時間戳
DATE_ADD / DATE_SUBDATE_ADD(date, INTERVAL expr unit)DATE_ADD(NOW(), INTERVAL 1 DAY)日期加減
DATEDIFFDATEDIFF(date1, date2)DATEDIFF('2024-01-15', '2024-01-01')14 - 日期差(天)
TIMESTAMPDIFFTIMESTAMPDIFF(unit, dt1, dt2)TIMESTAMPDIFF(SECOND, dt1, dt2)精確時間差(秒/分/時/天/月/年)
LAST_DAYLAST_DAY(date)LAST_DAY('2024-02-10')2024-02-29 - 月末日期
DAYOFWEEKDAYOFWEEK(date)DAYOFWEEK(NOW())1=周日 ... 7=周六
WEEKWEEK(date, [mode])WEEK(NOW())年第幾周
QUARTERQUARTER(date)QUARTER(NOW())1-4 季度

常用格式化符號

%Y  四位年份 (2024)    %y  兩位年份 (24)
%m  月份 01-12         %c  月份 1-12
%d  日期 01-31         %e  日期 1-31
%H  小時 00-23         %h  小時 01-12
%i  分鐘 00-59         %s  秒 00-59
%W  星期名稱           %a  縮寫星期
%M  月份名稱           %b  縮寫月份

數值/聚合函數

函數語法示例說明
MAX/MINMAX(col)MAX(salary)最大/最小值
SUMSUM(col)SUM(amount)求和
AVGAVG(col)AVG(score)平均值
COUNTCOUNT(*) / COUNT(col)COUNT(*)行數 / 非NULL值個數
FORMATFORMAT(num, decimals)FORMAT(12345.678, 2)'12,345.68' - 千分位格式化
ROUNDROUND(num, [decimals])ROUND(3.14159, 2)3.14 - 四捨五入
CEIL/FLOORCEIL(num)/FLOOR(num)CEIL(3.2)4 / 3 - 向上/向下取整
MODMOD(n, m)MOD(10, 3)1 - 取模
POWPOW(x, y)POW(2, 10)1024 - 次方
RANDRAND([seed])RAND()0-1 隨機數

條件/流程控制函數

函數語法示例說明
IFIF(cond, true_val, false_val)IF(score>=60, '及格', '不及格')三元運算
CASECASE WHEN cond THEN val ... ELSE val ENDCASE WHEN age<18 THEN '未成年' ELSE '成年' END多分支
COALESCECOALESCE(v1, v2, ...)COALESCE(mobile, email, '無')首個非NULL
NULLIFNULLIF(v1, v2)NULLIF(status, 0)相等返回NULL
IFNULLIFNULL(v1, v2)IFNULL(bonus, 0)MySQL專用,同COALESCE兩參數

NULL 判斷操作符

IS NULL        -- 是NULL
IS NOT NULL    -- 非NULL
<=>            -- NULL安全等價 (NULL<=>NULL 為TRUE)

IN / NOT IN / BETWEEN / LIKE

WHERE id IN (1,2,3,100)
WHERE name IN ('Alice','Bob')
WHERE id NOT IN (SELECT id FROM blacklist)
WHERE age BETWEEN 18 AND 60
WHERE name LIKE '張%'        -- 以張開頭
WHERE name LIKE '%偉'        -- 以偉結尾
WHERE name LIKE '%明%'       -- 包含明
WHERE name LIKE '_偉'        -- 兩字且第二字為偉
WHERE name NOT LIKE '%測試%' -- 排除包含測試

全文搜索 (需 FULLTEXT 索引)

-- 自然語言模式
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('MySQL 優化');

-- 布爾模式
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('+MySQL -舊版' IN BOOLEAN MODE);

-- 查詢擴展模式
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('數據庫' WITH QUERY EXPANSION);

⚠️ MySQL 內置全文索引不支持中文分詞 (5.7+ ngram parser 除外),中文場景建議使用 Elasticsearch。

常用管理命令速查

操作命令
啟動/停止服務service mysqld start/stop / systemctl start/stop mysqld
登錄mysql -u root -p
顯示庫SHOW DATABASES;
選庫USE db_name;
顯示表SHOW TABLES;
表結構DESC table_name; / SHOW COLUMNS FROM table_name;
建庫/刪庫CREATE/DROP DATABASE db_name;
建表CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(50));
插入INSERT INTO t VALUES (1, 'test');
更新UPDATE t SET name='new' WHERE id=1;
刪除/清空DELETE FROM t WHERE id=1; / TRUNCATE TABLE t;
授權GRANT SELECT,INSERT ON db.* TO 'user'@'%' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;
修改密碼ALTER USER 'user'@'host' IDENTIFIED BY 'newpass'; (8.0+)
退出EXIT; / QUIT;

實戰技巧集錦

  • 批量更新域名:UPDATE software SET icon = CONCAT('https://cdn.example.com', icon);
  • 時間戳轉日期查詢:WHERE DATE(FROM_UNIXTIME(create_time)) = '2024-01-15'
  • 月份分組統計:SELECT DATE_FORMAT(create_time, '%Y-%m') AS month, COUNT(*) FROM orders GROUP BY month
  • 去重統計:SELECT DISTINCT city FROM users 或 SELECT city, COUNT(*) FROM users GROUP BY city
  • 左連接找孤兒數據:SELECT a.* FROM users a LEFT JOIN profiles b ON a.id = b.user_id WHERE b.user_id IS NULL
copyright © 萬盛學電腦網 all rights reserved