1.数值函数
- 说明:查看MySQL全部数值函数搜索mysql numeric function,第一个就是官方文档。
- 常用的数值函数有:ROUND、TRUNCATE、CEILING、FLOOR、ABS、RAND。
- 代码演示如下:
SELECT ROUND(5.7365, 2) -- 四舍五入 5.47
SELECT TRUNCATE(5.7365, 2) -- 截断 5.73
SELECT CEILING(5.2) -- 天花板函数,大于等于此数的最小整数 6
SELECT FLOOR(5.6) -- 地板函数,小于等于此数的最大整数 5
SELECT ABS(-5.2) -- 绝对值 5.2
SELECT RAND() -- 随机函数,0到1的随机值 0.8177690634669448
2.字符串函数
- 常用的字符串函数:
-
- LENGTH, UPPER, LOWER
-
- TRIM, LTRIM, RTRIM
-
- LEFT, RIGHT, SUBSTRING
-
- LOCATE, REPLACE, 【CONCAT】
-
- 代码演示如下:
-- 长度、大小写转换
SELECT LENGTH('sky') -- 字符串字符个数/长度(LENGTH) 3
SELECT UPPER('sky') -- 转大写 SKY
SELECT LOWER('Sky') -- 转小写 sky
SELECT LTRIM(' Sky') -- 去除左边空格 Sky
SELECT RTRIM('Sky ') -- 去除左边空格 Sky
SELECT TRIM(' Sky ') -- 去除左右边两边空格 Sky
-- 取左边,取右边,取中间
SELECT LEFT('Kindergarden', 4) -- 取左边(LEFT)4个字符 Kind
SELECT RIGHT('Kindergarden', 6) -- 取右边(RIGHT)6个字符 garden
SELECT SUBSTRING('Kindergarden', 7, 6) garden
-- 取中间从第7个开始的长度为6的子串(SUBSTRING)
-- 注意是从第1个(而非第0个)开始计数的
-- 省略第3参数(子串长度)则一直截取到最后
SELECT LOCATE('gar', 'Kindergarden') -- 定位(LOCATE)首次出现的位置 7
-- 没有的话返回0(其他编程语言大多返回-1,可能因为索引是从0开始的)
-- 这个定位/查找函数依然是不区分大小写的
SELECT REPLACE('Kindergarten', 'garten', 'garden') -- 替换 Kindergarden
-- 连接
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM customers
3.MySQL中的日期函数
- NOW, CURDATE, CURTIME
- YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, DAYNAME, MONTHNAME
- EXTRACT(单位 FROM 日期时间对象), 如 EXTRACT(YEAR FROM NOW())
- 代码演示如下:
- 当前时间
SELECT
NOW(), -- 2023-07-02 19:27:44
CURDATE(), -- 2023-07-02
CURTIME() -- 19:27:44
- 提取时间日期对象中的元素(2023-07-02)
SELECT YEAR(NOW()) -- 2023
SELECT MONTH(NOW()) -- 7
SELECT DAY(NOW()) -- 2
SELECT DAYNAME(NOW()) -- Sunday
SELECT MONTHNAME(NOW()) -- July
-- 标准SQL语句有一个类似的函数 EXTRACT(),若需要在不同DBMS中录入代码,最好用EXTRACT():
SELECT EXTRACT(YEAR FROM NOW()) -- 2023
4.格式化日期和时间
说明:
-
DATE_FORMAT(date, format)将 date 根据 format 字符串进行格式化。 -
TIME_FORMAT(time, format)类似于 DATE_FORMAT 函数,但这里 format 字符串只能包含用于小时,分钟,秒和微秒的格式说明符。其他说明符产生一个 NULL 值或0。 -
代码演示如下:
SELECT DATE_FORMAT(NOW(), '%M %d, %Y') -- July 02, 2023
-- 格式说明符里,大小写是不同的,这是目前SQL里第一次出现大小写不同的情况
SELECT TIME_FORMAT(NOW(), '%H:%i %p') -- 19:39 PM
5.计算日期和时间
- 有时需要对日期事件对象进行运算,如增加一天或算两个时间的差值之类,介绍一些最有用的日期时间计算函数:
- DATE_ADD, DATE_SUB
- DATEDIFF
- TIME_TO_SEC
- 增加或减少一定的天数、月数、年数、小时数等等
SELECT DATE_ADD(NOW(),INTERVAL 1 YEAR) - 2024-07-02 20:02:55
SELECT DATE_SUB(NOW(),INTERVAL 1 YEAR) -- 2022-07-02 20:03:14
- 计算日期差异
-- 只计算日期部分
SELECT DATEDIFF('2019-01-05','2019-01-01') -- 4
-- 计算00:00到某时间经历的秒数
SELECT TIME_TO_SEC('09:02') --32520
SELECT TIME_TO_SEC('09:02') -TIME_TO_SEC('09:00') -120
6.IFNULL和COALESCE函数
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。- 代码如下:
SELECT
order_id,
IFNULL(shipper_id, 'Not assigned') AS shipper
FROM orders
COALESCE(value,…)是一个可变参函数,可以使用多个参数。作用:接受多个参数,返回从左至右、第一个不为NULL的参数,如果所有参数都为NULL,那么返回NULL;当它使用2个参数时,和IFNULL函数作用相同。- 代码如下:
SELECT
order_id,
COALESCE(shipper_id, comments,'Not assigned') AS shipper
FROM orders
7.IF函数
IF(条件表达式, 返回值1, 返回值2)根据是否满足条件返回不同的值。返回值可以是任何东西,数值 文本 日期时间 空值null 均可- 代码如下:
-- 将订单表中订单按是否是今年的订单分类为active(活跃)和archived(存档)
SELECT
order_id,
order_date,
IF(YEAR(order_date) = YEAR(NOW()),'active','archived')
FROM orders
8.CASE运算符
- CASE语句结构:
CASE
WHEN …… THEN ……
WHEN …… THEN ……
WHEN …… THEN ……
……
[ELSE ……] (ELSE子句是可选的)
END
- 代码如下:
-- 将订单分为三类:今年的是 'Active', 去年的是 'Last Year', 比去年更早的是 'Achived'
SELECT
order_id,
CASE
WHEN YEAR(order_date) = YEAR(NOW()) THEN 'active'
WHEN YEAR(order_date) = YEAR(NOW())-5 THEN 'last year'
WHEN YEAR(order_date) < YEAR(NOW())- 5 THEN 'archived'
ELSE 'future'
END AS category
FROM orders