MySQL数据库基础 === 函数
前言
在 SQL 世界中,函数是处理数据的强大工具,它们能够帮助我们轻松地对数据进行各种操作和转换。无论是对字符串进行拼接、截取、大小写转换,还是对数值进行四舍五入、取整、求余,亦或是对日期进行格式化、计算日期差,SQL 函数都能提供简洁而高效的解决方案。此外,流程函数则赋予了 SQL 更强的逻辑处理能力,使我们能够根据不同的条件来决定查询结果的走向。熟练掌握这些函数,对于提升 SQL 编程能力、优化数据处理流程具有重要意义。
函数
- 字符串函数
- 数值函数
- 日期函数
- 流程函数
字符串函数
常用函数:
| 函数 | 功能 |
|---|---|
| CONCAT(s1, s2, …, sn) | 字符串拼接,将s1, s2, …, sn拼接成一个字符串 |
| LOWER(str) | 将字符串全部转为小写 |
| UPPER(str) | 将字符串全部转为大写 |
| LPAD(str, n, pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
| RPAD(str, n, pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
| TRIM(str) | 去掉字符串头部和尾部的空格 |
| SUBSTRING(str, start, len) | 返回从字符串str从start位置起的len个长度的字符串 |
| REPLACE(column, source, replace) | 替换字符串 |
-- 拼接
SELECT CONCAT('hello','mysql')
-- 小写
SELECT LOWER('Hello')
-- 大写
SELECT UPPER("hello")
-- 左填充
SELECT LPAD('01', 5, '-')
-- 右填充
SELECT RPAD('01', 5, '-');
-- 去除空格
SELECT TRIM(' Hello World ');
-- 切片(起始索引为1)
SELECT SUBSTRING('Hello World', 1, 5);
-- 工号补零
UPDATE emp SET workno = LPAD(workno, 5, '0');
数值函数
常见函数:
| 函数 | 功能 |
|---|---|
| CEIL(x) | 向上取整 |
| FLOOR(x) | 向下取整 |
| MOD(x, y) | 返回x/y的模 |
| RAND() | 返回0~1内的随机数 |
| ROUND(x, y) | 求参数x的四舍五入值,保留y位小数 |
-- 向上取整
SELECT CEIL(1.1)
-- 向下取整
SELECT FLOOR(1.9)
-- 取余
SELECT MOD(4,2)
-- 随机数 0-1
SELECT RAND()
-- 四舍五入
SELECT ROUND(2.325,2)
-- 六位验证码
SELECT LPAD(ROUND(RAND() * 1000000,0),6,"0")
常用函数:
| 函数 | 功能 |
|---|---|
| CURDATE() | 返回当前日期 |
| CURTIME() | 返回当前时间 |
| NOW() | 返回当前日期和时间 |
| YEAR(date) | 获取指定date的年份 |
| MONTH(date) | 获取指定date的月份 |
| DAY(date) | 获取指定date的日期 |
| DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
| DATEDIFF(date1, date2) | 返回起始时间date1和结束时间date2之间的天数 |
-- 返回当前日期
SELECT CURDATE()
-- 返回当前时间
SELECT CURTIME()
-- 返回当前日期和时间
SELECT NOW()
-- 获取指定date的年份
SELECT YEAR(NOW())
-- 获取指定date的月份
SELECT MONTH(NOW())
-- 获取指定date的日期
SELECT DAY(NOW())
-- 加70年 INTERVAL 为固定值
SELECT DATE_ADD(NOW(),INTERVAL 70 YEAR)
-- 第一个时间 - 第二个时间
SELECT DATEDIFF('2021-01-01','2022-01-01')
-- 入职时间排序
SELECT name,DATEDIFF(CURDATE(),entrydate) AS 'entrydays' FROM emp ORDER BY entrydays DESC;
流程函数
常用函数:
| 函数 | 功能 |
|---|---|
| IF(value, t, f) | 如果value为true,则返回t,否则返回f |
| IFNULL(value1, value2) | 如果value1不为空,返回value1,否则返回value2 |
| CASE WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END | 如果val1为true,返回res1,… 否则返回default默认值 |
| CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END | 如果expr的值等于val1,返回res1,… 否则返回default默认值 |
-- 如果value为true,则返回t,否则返回f
SELECT IF(1 = 1, 't', 'f');
-- 如果value1不为空,返回value1,否则返回value2
SELECT IFNULL("ok","err")
SELECT IFNULL(NULL,"err")
-- 如果val1为true,返回res1,… 否则返回default默认值
select name,(case workaddress
when '北京市' then '一线城市'
when '广州市' then '一线城市'
else '二线城市' end) as '工作地址'
from emp;
-- 如果expr的值等于val1,返回res1,… 否则返回default默认值
select name,(case
when age > 30 then '中年'
else '青年' end)
from emp;
简单 CASE 表达式
简单 CASE 表达式用于基于一个表达式的值来选择结果。其基本语法如下:
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
-
expression:这是要评估的表达式。 -
WHEN value THEN result:如果expression等于value,则返回result。 -
ELSE default_result:如果expression不等于任何WHEN子句中的value,则返回default_result。
搜索 CASE 表达式
搜索 CASE 表达式用于基于多个条件来选择结果。其基本语法如下:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
-
WHEN condition THEN result:如果condition为真,则返回result。 -
ELSE default_result:如果没有任何WHEN子句的条件为真,则返回default_result。
对比总结
-
适用场景 :
-
简单
CASE:适用于基于一个表达式的值进行判断的情况。例如,根据某个字段的值来选择结果。 -
搜索
CASE:适用于基于多个条件进行判断的情况。例如,根据多个不同的条件来选择结果。 -
灵活性 :
-
简单
CASE:只能基于一个表达式的值进行判断,适用于简单的值匹配。 -
搜索
CASE:可以基于复杂的逻辑条件进行判断,适用于更复杂的逻辑判断。
根据具体的需求和场景选择合适的 CASE 表达式形式,可以使 SQL 查询更加清晰和高效。
SQL 函数与表达式总结
字符串函数
-
CONCAT(s1, s2, ..., sn) :拼接多个字符串。
-
LOWER(str) :将字符串转为小写。
-
UPPER(str) :将字符串转为大写。
-
LPAD(str, n, pad) :左填充字符串至指定长度。
-
RPAD(str, n, pad) :右填充字符串至指定长度。
-
TRIM(str) :去除字符串首尾空格。
-
SUBSTRING(str, start, len) :截取指定位置和长度的子字符串。
-
REPLACE(column, source, replace) :替换字符串中的字符。
数值函数
-
CEIL(x) :向上取整。
-
FLOOR(x) :向下取整。
-
MOD(x, y) :计算 x 除以 y 的余数。
-
RAND() :生成 0 到 1 之间的随机数。
-
ROUND(x, y) :将 x 四舍五入到小数点后 y 位。
日期函数
-
CURDATE() :返回当前日期。
-
CURTIME() :返回当前时间。
-
NOW() :返回当前日期和时间。
-
YEAR(date) :获取日期的年份部分。
-
MONTH(date) :获取日期的月份部分。
-
DAY(date) :获取日期的日部分。
-
DATE_ADD(date, INTERVAL expr type) :将时间间隔加到日期上。
-
DATEDIFF(date1, date2) :计算两个日期之间的天数差。
流程函数
-
IF(value, t, f) :条件为真返回 t,否则返回 f。
-
IFNULL(value1, value2) :value1 不为空返回 value1,否则返回 value2。
-
CASE WHEN [val1] THEN [res1] ... ELSE [default] END :根据条件选择结果。
-
CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END :根据表达式值选择结果。
CASE 表达式
-
简单 CASE :基于表达式值选择结果,适用于值匹配。
-
搜索 CASE :基于多个条件选择结果,适用于复杂逻辑判断。