跳至主要內容

MySQL 常用函数(对比 JavaScript)

Mr.Dingmysql函数字符串日期前端转后端大约 4 分钟约 1062 字

MySQL 常用函数(对比 JavaScript)

1. 字符串函数

-- CONCAT:拼接(≈ + 或模板字符串)
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
`${firstName} ${lastName}`
-- LENGTH:字节长度(注意:中文占3个字节!)
SELECT LENGTH('Hello');     -- 5
SELECT LENGTH('你好');      -- 6(UTF-8 下每个中文 3 字节)

-- CHAR_LENGTH:字符长度
SELECT CHAR_LENGTH('你好');  -- 2(字符数)
'你好'.length  // 2
-- SUBSTRING:截取(≈ slice)
SELECT SUBSTRING('Hello World', 1, 5);   -- 'Hello'(SQL 索引从 1 开始!)
SELECT SUBSTRING('Hello', -3);           -- 'llo'(MySQL 支持负索引)
'Hello World'.slice(0, 5)  // 'Hello'
-- REPLACE:替换(≈ replaceAll)
SELECT REPLACE('hello world', 'world', 'mysql');  -- 'hello mysql'
'hello world'.replaceAll('world', 'mysql')
-- UPPER / LOWER:大小写转换
SELECT UPPER('hello');  -- 'HELLO'
SELECT LOWER('HELLO');  -- 'hello'
'hello'.toUpperCase()
'HELLO'.toLowerCase()
-- TRIM:去空格(≈ trim)
SELECT TRIM('  hello  ');   -- 'hello'
SELECT LTRIM('  hello');    -- 'hello'(去左空格)
SELECT RTRIM('hello  ');    -- 'hello'(去右空格)
'  hello  '.trim()

字符串函数对照表

MySQLJavaScript说明
CONCAT(a, b)a + b拼接
LENGTH(str)new Blob([str]).size字节长度
CHAR_LENGTH(str)str.length字符长度
SUBSTRING(str, 1, 5)str.slice(0, 5)截取(SQL 从1开始!)
REPLACE(str, a, b)str.replaceAll(a, b)替换
UPPER(str)str.toUpperCase()转大写
LOWER(str)str.toLowerCase()转小写
TRIM(str)str.trim()去空格
LOCATE('a', str)str.indexOf('a')查找位置
LEFT(str, 3)str.slice(0, 3)取左边 N 个
RIGHT(str, 3)str.slice(-3)取右边 N 个

⚠️ SQL 索引从 1 开始,不是从 0!这是新手最容易犯错的地方


2. 日期时间函数

-- 获取当前时间
SELECT NOW();        -- 2026-06-29 14:30:00
SELECT CURDATE();    -- 2026-06-29
SELECT CURTIME();    -- 14:30:00
new Date()           // 当前时间
new Date().toISOString().split('T')[0]  // 当前日期
-- 提取日期部分
SELECT YEAR('2026-06-29');    -- 2026
SELECT MONTH('2026-06-29');   -- 6
SELECT DAY('2026-06-29');     -- 29
SELECT HOUR('14:30:00');      -- 14
SELECT MINUTE('14:30:00');    -- 30
SELECT WEEKDAY('2026-06-29'); -- 0=周一, 1=周二...
const d = new Date('2026-06-29');
d.getFullYear();   // 2026
d.getMonth() + 1;  // 6(JS 从 0 开始!)
d.getDate();       // 29

⚠️ JS 的 getMonth() 从 0 开始,SQL 的 MONTH() 从 1 开始

-- 日期计算
SELECT DATE_ADD('2026-06-29', INTERVAL 7 DAY);    -- 2026-07-06(加7天)
SELECT DATE_SUB('2026-06-29', INTERVAL 1 MONTH);  -- 2026-05-29(减1月)
SELECT DATEDIFF('2026-07-01', '2026-06-29');      -- 2(相差天数)
SELECT TIMESTAMPDIFF(YEAR, '2000-01-01', NOW());  -- 26(年龄)
const d = new Date('2026-06-29');
d.setDate(d.getDate() + 7);       // 加7天
d.setMonth(d.getMonth() - 1);     // 减1月
const diff = (d2 - d1) / 86400000; // 相差天数
-- 日期格式化
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');         -- 2026-06-29
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日');      -- 2026年06月29日
SELECT DATE_FORMAT(NOW(), '%H:%i:%s');         -- 14:30:00
// JS 需要自己格式化或用 day.js
dayjs().format('YYYY-MM-DD');

日期函数对照表

MySQLJavaScript说明
NOW()new Date()当前时间
CURDATE()dayjs().format('YYYY-MM-DD')当前日期
YEAR(date)d.getFullYear()取年
MONTH(date)d.getMonth() + 1取月(SQL从1,JS从0)
DAY(date)d.getDate()取日
DATE_ADD(d, INTERVAL n DAY)d.setDate(d.getDate() + n)加天数
DATEDIFF(a, b)(a - b) / 86400000日期差
DATE_FORMAT(d, '%Y-%m-%d')dayjs().format('YYYY-MM-DD')格式化

3. 数值函数

SELECT ROUND(3.14159, 2);    -- 3.14(四舍五入)
SELECT CEILING(3.14);        -- 4(向上取整 ≈ Math.ceil)
SELECT FLOOR(3.14);          -- 3(向下取整 ≈ Math.floor)
SELECT ABS(-10);             -- 10(绝对值)
SELECT MOD(10, 3);           -- 1(取模 ≈ %)
SELECT RAND();               -- 0~1 随机数 ≈ Math.random()

4. 条件函数

-- IF:简单条件(≈ 三元运算符)
SELECT name, IF(score >= 60, '及格', '不及格') AS result FROM students;
score >= 60 ? '及格' : '不及格'
-- IFNULL:处理 NULL(≈ ??)
SELECT name, IFNULL(phone, '未填写') AS phone FROM users;
user.phone ?? '未填写'
-- COALESCE:返回第一个非 NULL 值(≈ a ?? b ?? c)
SELECT COALESCE(phone, email, '无联系方式') FROM users;
user.phone ?? user.email ?? '无联系方式'
-- NULLIF:如果相等则返回 NULL
SELECT NULLIF(a, b);
-- 如果 a = b 就返回 NULL,否则返回 a
-- 常用于避免除零错误:
SELECT 100 / NULLIF(quantity, 0) FROM products;

5. 类型转换

-- CAST(≈ Number() / String())
SELECT CAST('123' AS SIGNED);        -- 123(字符串转数字)
SELECT CAST(123 AS CHAR);            -- '123'(数字转字符串)
SELECT CAST('2026-06-29' AS DATE);  -- 2026-06-29(字符串转日期)
Number('123')
String(123)
new Date('2026-06-29')

实践:常用查询模式

-- 最近7天注册的用户
SELECT * FROM users
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);

-- 本月订单统计
SELECT
    DATE_FORMAT(created_at, '%Y-%m-%d') AS day,
    COUNT(*) AS orders,
    SUM(amount) AS total
FROM orders
WHERE MONTH(created_at) = MONTH(NOW())
  AND YEAR(created_at) = YEAR(NOW())
GROUP BY day
ORDER BY day;

-- 手机号脱敏(138****1234)
SELECT CONCAT(
    LEFT(phone, 3),
    '****',
    RIGHT(phone, 4)
) AS masked_phone FROM users;

-- 计算年龄
SELECT
    name,
    TIMESTAMPDIFF(YEAR, birthday, NOW()) AS age
FROM users;
上次编辑于:
贡献者: dingyongya