数据库——MySQL字符、日期函数
一、字符函数详解
1. CONCAT()
- 字符串拼接
作用:连接多个字符串,类似Java中的+
号。
语法:
CONCAT(string1, string2, ...)
示例:
SELECT CONCAT('Hello', ' ', 'World') AS greeting;
-- 输出:'Hello World'
2. UPPER()
/LOWER()
- 大小写转换
作用:将字符串转换为全大写或全小写。
语法:
UPPER(string) -- 转大写
LOWER(string) -- 转小写
示例:
SELECT UPPER('hello') AS upper_case; -- 输出:'HELLO'
SELECT LOWER('HELLO') AS lower_case; -- 输出:'hello'
3. LENGTH()
- 字符串长度
作用:返回字符串的字符数。
语法:
LENGTH(string)
示例:
SELECT LENGTH('MySQL') AS str_length; -- 输出:5
4. SUBSTRING()
- 截取子串
作用:从指定位置截取特定长度的子字符串。
语法:
SUBSTRING(string, start, length)
示例:
SELECT SUBSTRING('Hello World', 1, 5) AS sub_str;
-- 输出:'Hello'
5. REPLACE()
- 替换子串
作用:将字符串中的指定子串替换为新内容。
语法:
REPLACE(string, old_substr, new_substr)
示例:
SELECT REPLACE('Hello World', 'World', 'SQL') AS new_str;
-- 输出:'Hello SQL'
6. TRIM()
- 去除两端空格
作用:清除字符串首尾的空格(中间空格保留)。
语法:
TRIM(string)
示例:
SELECT TRIM(' Hello ') AS trimmed; -- 输出:'Hello'
二、日期函数详解
1. CURDATE()
/NOW()
- 当前日期与时间
作用:获取当前日期或日期时间。
语法:
CURDATE() -- 当前日期(如 '2023-10-01')
NOW() -- 当前日期时间(如 '2023-10-01 14:30:00')
示例:
SELECT CURDATE() AS today;
-- 输出:当前日期(如 '2023-10-01')
2. DATEDIFF()
- 日期差值计算
作用:计算两个日期之间的天数差。
语法:
DATEDIFF(date1, date2) -- 返回 date1 - date2 的天数
示例:
SELECT DATEDIFF('2023-10-01', '2023-09-01') AS days;
-- 输出:30
3. YEAR()
/MONTH()
/DAY()
- 提取日期部分
作用:从日期中提取年、月、日。
语法:
YEAR(date) -- 提取年份
MONTH(date) -- 提取月份(1-12)
DAY(date) -- 提取日(1-31)
示例:
SELECT YEAR('2023-05-20') AS year; -- 输出:2023
4. DATE_ADD()
/DATE_SUB()
- 日期加减
作用:对日期进行加减操作。
语法:
DATE_ADD(date, INTERVAL n unit) -- 加
DATE_SUB(date, INTERVAL n unit) -- 减
示例:
SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH) AS new_date;
-- 输出:'2023-02-01'
三、实战案例:员工信息表(emp)
1. 表结构与测试数据
CREATE TABLE emp (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
salary DECIMAL(10, 2),
hire DATE,
dept VARCHAR(50)
);
INSERT INTO emp (name, salary, hire, dept) VALUES
('张三', 60000, '2020-01-15', '技术部'),
('李四', 75000, '2019-03-22', '市场部'),
('王五', 50000, '2021-06-30', '人事部'),
('赵六', 80000, '2018-11-11', '财务部'),
('钱七', 90000, '2022-02-01', '技术部'),
('孙八', 65000, '2020-05-20', '市场部');
2. 基础查询
(1) 查询所有员工姓名和薪资
SELECT name, salary FROM emp;
(2) 查询薪资大于60000的员工姓名
SELECT name FROM emp WHERE salary > 60000;
-- 输出:李四、赵六、钱七、孙八
3. 字符函数应用
(1) 查询员工姓名长度
SELECT name, LENGTH(name) AS name_length FROM emp;
-- 示例输出:'张三' → 2
(2) 将姓名转换为大写
SELECT UPPER(name) AS upper_name FROM emp;
-- 示例输出:'张三' → '张三'(中文字符不受影响)
(3) 替换姓名字符
SELECT REPLACE(name, '张', '李') AS new_name FROM emp;
-- 示例输出:'张三' → '李三'
4. 日期函数应用
(1) 查询员工入职年份
SELECT name, YEAR(hire) AS hire_year FROM emp;
-- 示例输出:'张三' → 2020
(2) 计算在职天数
SELECT name, DATEDIFF(CURDATE(), hire) AS days_in_office FROM emp;
-- 输出:当前日期与入职日期的差值
(3) 查询入职超过3年的员工
SELECT name FROM emp
WHERE DATEDIFF(CURDATE(), hire) > 3*365;
-- 输出:李四、赵六
5. 聚合与分组
(1) 按部门统计平均薪资
SELECT dept, AVG(salary) AS avg_salary
FROM emp
GROUP BY dept;
-- 示例输出:技术部 → 75000.00
(2) 按入职年份统计人数
SELECT YEAR(hire) AS year, COUNT(*) AS emp_count
FROM emp
GROUP BY YEAR(hire);
-- 示例输出:2020 → 2
四、关键概念与注意事项
-
字符函数
-
TRIM()
仅去除首尾空格,中间空格需用REPLACE
处理。 -
中文字符在
UPPER()
/LOWER()
中不会变化。
-
-
日期函数
-
DATEDIFF()
忽略时间部分,仅计算日期差。 -
DATE_ADD
支持单位:YEAR
,MONTH
,DAY
,HOUR
等。
-
-
性能优化
-
避免在
WHERE
子句中对字段使用函数(如YEAR(hire) > 2020
),改用范围查询。 -
对频繁使用的日期计算字段可添加索引。
-
五、总结
字符和日期函数是MySQL数据处理的核心工具。通过CONCAT
拼接信息、DATEDIFF
分析时间间隔、结合聚合函数实现多维统计,能高效解决复杂业务需求。在实际开发中,建议结合业务场景多实践,并关注性能优化技巧,以提升查询效率。