数值函数
ROUND(数值) 四舍五入
ROUND(数值, 位数) 保留相应位数的四舍五入
TRUNCATE(数值,位数) 截断函数,截断至相应位数
CEILING(数值) 向上取整
FLOOR(数值) 向下取整
ABS(数值) 绝对值
RAND() 随机数,生成0-1间随机浮点数
其它更多函数搜索 mysql numeric functions
字符串函数
LENGTH() 返回字符串长度
UPPER() 将字符串转化为大写
LOWER() 将字符串转化为小写
LTRIM() 移除字符串前导的空白字符
RTRIM() 移除字符串尾随的空白字符
TRIM() 移除字符串前导或尾随的空白字符
LEFT(字符串,数值) 返回字符串从左起的对应数值的字符
RIGHT(字符串,数值) 返回字符串从右起的对应数值的字符
SUBSTRING(字符串,起始数值,长度) 返回字符串从起始数值开始长度为对应值的字符
LOCATE(要搜索的字符,字符串) 返回要搜索的字符在字符串的位置(不区分大小写),若要搜索的字符不是单个字符则会返回要搜索字符出现的第一个字符位置,若没有则会返回0。
REPLACE(字符串,被替换的字符,替换的字符) 将字符串中的指定字符替换成其它字符。
CONCAT(字符串,字符串) 将多个字符串合并为一个
注意:字符串中第一个字符是从1开始编号
日期函数
NOW() 返回当前时间和日期
CURDATE() 返回当前日期
CURTIME() 返回当前时间
YEAR() 返回括号内日期的年份(数值格式),MONTH,DAY,HOUR,MINUTE,SECOND同理
DAYNAME() 返回括号内字符串格式的星期数,MONTH等同理
EXTRACT( 时间单位 FROM 时间日期值) 从日期中提取对应单位的时间,如YEAR、MONTH等
格式化日期和时间
DATE_FORMAT(NOW(), '%m %d %Y')
y对应年份后两位数,Y对应年份四位数,d对应日期
m对应两位数月份,M对应月份名称
TIME_FORMAT(NOW(), '%H:%i %p')同理
更多搜索mysql date format string
计算日期和时间
DATE_ADD(NOW(), INTERVAL 1 DAY) 在NOW时间日期的基础上加了1 天,YEAR,MONTH等同理,数值也可以为负数表示过去。
DATE_SUB(NOW(), INTERVAL 数值 时间单位) 与上一个相似,不过是减去数值。
DATEDIFF(日期1, 日期2) 日期1-日期2,返回两个日期的间隔天数,不考虑具体时间点
TIME_TO_SEC() 返回时间点对应的秒数
IFNULL和COALESCE函数
IFNULL
USE sql_store;
SELECT
order_id,
IFNULL(shipper_id, 'NOT assigned') AS shipper
FROM orders
COALESCE
COALESCE(列,空返回值1,空返回值2) 若在该列中有空值,先返回1,若1非空返回1,若1也为空则返回2
USE sql_store;
SELECT
order_id,
COALESCE(shipper_id, comments, 'NOT assigned') AS shipper
FROM orders
IF函数
IF(expression, first, second) 如果表达式为真返回第一个结果,如果表达式为假则返回第二个结果
USE sql_store;
SELECT
order_id,
order_date,
IF(YEAR(order_date) = 2019, 'Active','Archived') AS category
FROM orders
前面用UNION实现了同样的功能,可以看出IF更简单。
CASE运算符
USE sql_store;
SELECT
order_id,
order_date,
CASE
WHEN YEAR(order_date) = 2019 THEN 'Active'
WHEN YEAR(order_date) = 2019-1 THEN 'Last Year'
WHEN YEAR(order_date) < 2019-1 THEN 'Archived'
ELSE 'Future'
END AS category
FROM orders