一 NOW() 用于SELECT
SELECT NOW();
可以获取当前的时间
二 TIMESTAMPDIFF() 用于SELECT
TIMESTAMPDIFF
TIME(时间)
STAMP(戳记)
DIFFERENCE(差异)
所以TIMESTAMPDIFF函数的作用是计算时间差
SELECT name, TIMESTAMPDIFF(YEAR, birthday, NOW()) AS age
FROM account_2c;
1 YEAR
一个参数,计算差值的整数,可以计算:
SECOND - 秒钟
MINUTE - 分钟
HOUR - 小时
DAY - 天
WEEK - 星期
MONTH - 月
QUARTER - 季度
YEAR - 年
2 birthday是之前的日期
3 NOW() 是现在的日期
三 CONCAT() 用于SELECT
作用:把多个列合并成一个列(一个函数,作用是将多个字符串连接为一个字符串。)
SELECT CONCAT(province,city,district,detailed_addr) AS 详细地址,recipient,contact_number
FROM address
WHERE account_id = 1004000054;
第一行代码通过SELECT关键字选择查找recipient,contact_number字段。
并用CONCAT关键字拼接province,city,district,detailed_addr四个字段取别名为详细地址。
第二行代码通过FROM关键字选择address表。
第三行代码通过WHERE关键字设置查询条件为account_id = 1004000054
四 SUBSTR -一般用于WHERE
也是筛选作用所以与WHERE放在一起
比如
SELECT COUNT(*)
FROM invoice
WHERE SUBSTR(express_number,1,2)="FT";
这一段代码的意思就是从invoice表中筛选出列为"express_number"中,从第一个字符串开始,向后面两个(包括第一个)是FT的所有符合要求的行的数据(COUNT(*))
比如举一个简单的例子
从invoice表中查找到运单前两个字母为SN(顺南)的运单总价,并重命名为订单总价。
SELECT SUM(fare) AS 订单总价
FROM invoice
WHERE SUBSTR(express_number,1,2)="SN";
第三行代码的作用就是查找运单(express_number)中前两个字母的SN的总价
那SUBSTR是不是只能再WHERE之后呢?
当然不是,其只是一个普遍规律而已。
要求:帮助公司找出客户的姓氏(此处以名字的第一个字为准),性别,和年龄。并将姓氏取名为"lastname",年龄取名为“age"。
SELECT SUBSTR(name,1,1) AS lastname,gender,TIMESTAMPDIFF(YEAR,birthday,NOW()) AS age
FROM account_2c;
姓氏-第一个字 涉及到准确位置的筛选我们就会想到 SUBSTR
然后还要进行换值--取名为"lastname"所以呢我们要将SUBSTR放在SELECT之中
然后就是获取gender,信息
以及通过TIMESTAMPDIFF函数获得时间差
简洁版:
SQL 核心函数实战指南:从时间处理到字符串操作
引言
在数据处理与分析中,SQL 函数是提升效率的利器。本文聚焦 NOW()、TIMESTAMPDIFF()、CONCAT()、SUBSTR() 四大高频函数,结合实战场景解析其用法,助你快速掌握数据清洗与报表生成技巧。
一、时间函数:NOW () 与 TIMESTAMPDIFF ()
1. NOW ():获取当前时间戳
- 作用:返回数据库服务器的当前日期和时间(
YYYY-MM-DD HH:MM:SS
格式)。 - 语法:
sql
SELECT NOW(); -- 输出:2025-06-03 14:30:00(示例)
- 应用场景:动态生成时间戳(如订单创建时间默认值)。
2. TIMESTAMPDIFF ():计算时间差
- 函数拆解:
TIME
(时间) +STAMP
(戳记) +DIFFERENCE
(差异) → 时间戳差值计算。 - 语法:
sql
TIMESTAMPDIFF(unit, start_time, end_time)
- unit:时间单位(
SECOND/MINUTE/HOUR/DAY/WEEK/MONTH/YEAR
等)。 - start_time/end_time:起始 / 结束时间(支持
NOW()
、日期字符串或字段)。
- unit:时间单位(
- 实战示例:计算用户年龄
sql
SELECT name, TIMESTAMPDIFF(YEAR, birthday, NOW()) AS age -- 生日到现在的年份差 FROM account_2c;
- 注意事项:
- 时间单位大小写不敏感(如
YEAR
与year
等效)。 - 结果为整数(自动取整,如
4.9
年 →4
年)。
- 时间单位大小写不敏感(如
二、字符串拼接:CONCAT ()
1. 函数作用
将多个字符串或字段合并为一个字符串,支持 动态文本生成(如地址拼接、日志描述)。
2. 语法与示例
- 基础拼接:
sql
SELECT CONCAT(province, city, district, detailed_addr) AS 详细地址 FROM address WHERE account_id = 1004000054;
(合并省、市、区、详细地址,生成完整地址) - 处理 NULL 值(MySQL 特性):
sql
SELECT CONCAT('用户:', name, ',余额:', COALESCE(balance, 0)) AS info -- 余额为 NULL 时显示 0 FROM users;
- 拓展:CONCAT_WS ()(带分隔符拼接):
sql
SELECT CONCAT_WS('-', year, month, day) AS date -- 用横线分隔年月日 FROM calendar;
(自动忽略 NULL 字段,仅在全 NULL 时返回 NULL)
3. 应用场景
- 生成唯一标识(如
CONCAT(user_id, '_', order_id)
)。 - 格式化输出(如
CONCAT('订单金额:', total_price, '元')
)。
三、字符串截取:SUBSTR ()
1. 函数作用
从字符串中提取指定位置和长度的子串,支持 正向(从左到右) 和 反向(从右到左) 截取。
2. 语法解析
sql
SUBSTR(str, pos, len) -- pos:起始位置(1-based),len:截取长度(可选,默认到末尾)
- 正向截取:
sql
SELECT SUBSTR('HelloWorld', 1, 5) AS first_5; -- 输出:'Hello'
- 反向截取(负数位置):
sql
SELECT SUBSTR('HelloWorld', -5) AS last_5; -- 输出:'World'(从倒数第5位开始)
3. 实战案例
- 提取姓氏(名字首字):
sql
SELECT SUBSTR(name, 1, 1) AS lastname, -- 取名字第一个字作为姓氏 gender, TIMESTAMPDIFF(YEAR, birthday, NOW()) AS age FROM account_2c;
- 筛选运单前缀(WHERE 子句应用):
sql
SELECT SUM(fare) AS 订单总价 FROM invoice WHERE SUBSTR(express_number, 1, 2) = 'SN'; -- 运单前两位为“SN”
4. 注意事项
- 位置索引从 1 开始(区别于 Python 的 0-based 索引)。
- 越界处理:若
pos
超出字符串长度,返回空字符串。 - 多场景支持:不仅限于
WHERE
,也可用于SELECT
(如字段重组、数据脱敏)。