数据库——MySQL字符、日期函数

一、字符函数详解

1. CONCAT() - 字符串拼接

作用 :连接多个字符串,类似Java中的+号。
语法

sql 复制代码
CONCAT(string1, string2, ...)

示例

sql 复制代码
SELECT CONCAT('Hello', ' ', 'World') AS greeting; 
-- 输出:'Hello World'

2. UPPER()/LOWER() - 大小写转换

作用 :将字符串转换为全大写或全小写。
语法

sql 复制代码
UPPER(string)  -- 转大写
LOWER(string)  -- 转小写

示例

sql 复制代码
SELECT UPPER('hello') AS upper_case;  -- 输出:'HELLO'
SELECT LOWER('HELLO') AS lower_case;  -- 输出:'hello'

3. LENGTH() - 字符串长度

作用 :返回字符串的字符数。
语法

sql 复制代码
LENGTH(string)

示例

sql 复制代码
SELECT LENGTH('MySQL') AS str_length; -- 输出:5

4. SUBSTRING() - 截取子串

作用 :从指定位置截取特定长度的子字符串。
语法

sql 复制代码
SUBSTRING(string, start, length)

示例

sql 复制代码
SELECT SUBSTRING('Hello World', 1, 5) AS sub_str; 
-- 输出:'Hello'

5. REPLACE() - 替换子串

作用 :将字符串中的指定子串替换为新内容。
语法

sql 复制代码
REPLACE(string, old_substr, new_substr)

示例

sql 复制代码
SELECT REPLACE('Hello World', 'World', 'SQL') AS new_str; 
-- 输出:'Hello SQL'

6. TRIM() - 去除两端空格

作用 :清除字符串首尾的空格(中间空格保留)。
语法

sql 复制代码
TRIM(string)

示例

sql 复制代码
SELECT TRIM('   Hello   ') AS trimmed; -- 输出:'Hello'

二、日期函数详解

1. CURDATE()/NOW() - 当前日期与时间

作用 :获取当前日期或日期时间。
语法

sql 复制代码
CURDATE()  -- 当前日期(如 '2023-10-01')
NOW()      -- 当前日期时间(如 '2023-10-01 14:30:00')

示例

sql 复制代码
SELECT CURDATE() AS today; 
-- 输出:当前日期(如 '2023-10-01')

2. DATEDIFF() - 日期差值计算

作用 :计算两个日期之间的天数差。
语法

sql 复制代码
DATEDIFF(date1, date2)  -- 返回 date1 - date2 的天数

示例

sql 复制代码
SELECT DATEDIFF('2023-10-01', '2023-09-01') AS days; 
-- 输出:30

3. YEAR()/MONTH()/DAY() - 提取日期部分

作用 :从日期中提取年、月、日。
语法

sql 复制代码
YEAR(date)   -- 提取年份
MONTH(date)  -- 提取月份(1-12)
DAY(date)    -- 提取日(1-31)

示例

sql 复制代码
SELECT YEAR('2023-05-20') AS year; -- 输出:2023

4. DATE_ADD()/DATE_SUB() - 日期加减

作用 :对日期进行加减操作。
语法

sql 复制代码
DATE_ADD(date, INTERVAL n unit)  -- 加
DATE_SUB(date, INTERVAL n unit)  -- 减

示例

sql 复制代码
SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH) AS new_date; 
-- 输出:'2023-02-01'

三、实战案例:员工信息表(emp)

1. 表结构与测试数据

sql 复制代码
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) 查询所有员工姓名和薪资
sql 复制代码
SELECT name, salary FROM emp;
(2) 查询薪资大于60000的员工姓名
sql 复制代码
SELECT name FROM emp WHERE salary > 60000;
-- 输出:李四、赵六、钱七、孙八

3. 字符函数应用

(1) 查询员工姓名长度
sql 复制代码
SELECT name, LENGTH(name) AS name_length FROM emp;
-- 示例输出:'张三' → 2
(2) 将姓名转换为大写
sql 复制代码
SELECT UPPER(name) AS upper_name FROM emp;
-- 示例输出:'张三' → '张三'(中文字符不受影响)
(3) 替换姓名字符
sql 复制代码
SELECT REPLACE(name, '张', '李') AS new_name FROM emp;
-- 示例输出:'张三' → '李三'

4. 日期函数应用

(1) 查询员工入职年份
sql 复制代码
SELECT name, YEAR(hire) AS hire_year FROM emp;
-- 示例输出:'张三' → 2020
(2) 计算在职天数
sql 复制代码
SELECT name, DATEDIFF(CURDATE(), hire) AS days_in_office FROM emp;
-- 输出:当前日期与入职日期的差值
(3) 查询入职超过3年的员工
sql 复制代码
SELECT name FROM emp 
WHERE DATEDIFF(CURDATE(), hire) > 3*365;
-- 输出:李四、赵六

5. 聚合与分组

(1) 按部门统计平均薪资
sql 复制代码
SELECT dept, AVG(salary) AS avg_salary 
FROM emp 
GROUP BY dept;
-- 示例输出:技术部 → 75000.00
(2) 按入职年份统计人数
sql 复制代码
SELECT YEAR(hire) AS year, COUNT(*) AS emp_count 
FROM emp 
GROUP BY YEAR(hire);
-- 示例输出:2020 → 2

四、关键概念与注意事项

  1. 字符函数

    • TRIM()仅去除首尾空格,中间空格需用REPLACE处理。

    • 中文字符在UPPER()/LOWER()中不会变化。

  2. 日期函数

    • DATEDIFF()忽略时间部分,仅计算日期差。

    • DATE_ADD支持单位:YEAR, MONTH, DAY, HOUR等。

  3. 性能优化

    • 避免在WHERE子句中对字段使用函数(如YEAR(hire) > 2020),改用范围查询。

    • 对频繁使用的日期计算字段可添加索引。


五、总结

字符和日期函数是MySQL数据处理的核心工具。通过CONCAT拼接信息、DATEDIFF分析时间间隔、结合聚合函数实现多维统计,能高效解决复杂业务需求。在实际开发中,建议结合业务场景多实践,并关注性能优化技巧,以提升查询效率。

相关推荐
我有医保我先冲4 分钟前
SQL复杂查询与性能优化全攻略
数据库·sql·性能优化
烧瓶里的西瓜皮13 分钟前
Go语言从零构建SQL数据库引擎(2)
数据库·sql·golang
SelectDB30 分钟前
拉卡拉 x Apache Doris:统一金融场景 OLAP 引擎,查询提速 15 倍,资源直降 52%
大数据·数据库·数据分析
爱的叹息32 分钟前
华为高斯(GaussDB) 集中式数据库 的开发技术手册,涵盖核心功能、开发流程、优化技巧及常见问题解决方案
数据库·gaussdb
背太阳的牧羊人36 分钟前
使用 PyMuPDF(fitz)库打开 PDF 文件,并且是从内存中的字节流(BytesIO)读取 PDF 内容
数据库·pdf·文件处理·pymupdf·fitz
@淡 定2 小时前
MySQL MVCC 机制解析
数据库·mysql
Chandler242 小时前
Redis:内存淘汰原则,缓存击穿,缓存穿透,缓存雪崩
数据库·redis·缓存
SRC_BLUE_172 小时前
Python GUI 编程 | QObject 控件基类详解 — 定时器
开发语言·数据库·python
DBWYX3 小时前
MySQL 进阶 面经级
数据库·mysql
喝醉酒的小白3 小时前
SQL Server:触发器
数据库