数据库——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分析时间间隔、结合聚合函数实现多维统计,能高效解决复杂业务需求。在实际开发中,建议结合业务场景多实践,并关注性能优化技巧,以提升查询效率。

相关推荐
倔强的石头_3 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横3 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二3 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
小猿姐3 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
ClouGence4 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
云技纵横4 天前
Gap Lock 死锁实战:5 秒在本地复现 MySQL 间隙锁死锁
后端·mysql
无响应de神4 天前
三、用户与权限管理
数据库·mysql
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql