MySQL 數據庫(基礎)- 函數
介紹
函數 是指一段可以被另一段程序調用的程序或代碼。也意味著,這一段程序或代碼在 MySQL 中已經給我們提供了,我們需要做的就是在合適的業務場景調用對應的函數,完成對應的業務需求即可。
MySQL 中的函數主要分為一下四類:字符串函數,數值函數,日期函數,流程函數。
- 字符串函數
MySQL 中提供了很多的字符串函數,常用的幾個如下:
函數 功能
concat(s1,s2,....sn) 字符串拼接,將S1,S2,... Sn拼接成一個字符串
lower(str) 將字符串str全部轉為小寫
upper(str) 將字符串str全部轉為大寫
lpad(str,n,pad) 左填充,用字符串pad對str的左邊進行填充,達到n個字符串長度
rpad(str,n,pad) 右填充,用字符串pad對str的右邊進行填充,達到n個字符串長度
trim(str) 去掉字符串頭部和尾部的空格
substring(str,start,len) 返回從字符串str從start位置起的len個長度的字符串
演示代碼:
- concat : 字符串拼接
select concat('Hello' , ' MySQL');
- lower : 全部轉小寫
select lower('Hello');
- upper : 全部轉大寫
select upper('Hello');
- lpad : 左填充
select lpad('01', 5, '-');
- rpad : 右填充
select rpad('01', 5, '-');
- trim : 去除空格
select trim(' Hello MySQL ');
- substring : 截取子字符串
select substring('Hello MySQL',1,5);
- 數值函數
常見的數值函數如下:
函數 功能
ceil(x) 向上取整
floor(x) 向下取整
mod(x,y) 返回x/y的模
rand() 返回0~1內的隨機數
round(x,y) 求參數x的四舍五入的值,保留y位小數
演示代碼:
- ceil:向上取整
select ceil(1.1);
- floor:向下取整
select floor(1.9);
- mod:取模
select mod(7,4);
- rand:獲取隨機數
select rand();
- round:四舍五入
select round(2.344,2);
- 日期函數
常見的日期函數如下:
函數 功能
curdate() 返回當前日期
curtime() 返回當前時間
now() 返回當前日期和時間
year(date) 獲取指定date的年份
month(date) 獲取指定date的月份
day(date) 獲取指定date的日期
date_add(date,interval exprtype) 返回一個日期/時間值加上一個時間間隔expr后的時間值
datediff(date1,date2) 返回起始時間date1 和 結束時間date2之間的天數
演示代碼:
- curdate:當前日期
select curdate();
- curtime:當前時間
select curtime();
- now:當前日期和時間
select now();
- YEAR , MONTH , DAY:當前年、月、日
select YEAR(now());
select MONTH(now());
select DAY(now());
- date_add:增加指定的時間間隔
select date_add(now(), INTERVAL 70 YEAR );
- datediff:獲取兩個日期相差的天數
select datediff('2021-10-01', '2021-12-01');
- 流程函數
流程函數也是很常用的一類函數,可以在 SQL 語句中實現條件篩選,從而提高語句的效率。
函數 功能
if(value,t,f) 如果value為true,則返回t,否則返回f
ifnull(value1,value2) 如果value1不為空,返回value1,否則返回value2
case when [vall] then [res1] ... eles [default] end 如果val1為true,返回res1,... 否則返回default默認值
case [expr] when [vall] then [res1] ... else [default] end 如果expr的值等于val1,返回res1,... 否則返回default默認值
演示代碼:
- if
select if(false, 'Ok', 'Error');
- ifnull
select ifnull('Ok','Default');
select ifnull('','Default');
select ifnull(null,'Default');
- case when then else end
需求: 查詢emp表的員工姓名和工作地址 (北京/上海 ----> 一線城市 , 其他 ----> 二線城市)
select
name,
( case workaddress when '北京' then '一線城市' when '上海' then '一線城市' else
'二線城市' end ) as '工作地址'
from emp;
案例:
create table score(id int comment 'ID',name varchar(20) comment '姓名',math int comment '數學',english int comment '英語',chinese int comment '語文'
) comment '學員成績表';insert into score(id, name, math, english, chinese) VALUES (1, 'Tom', 67, 88, 95
), (2, 'Rose' , 23, 66, 90),(3, 'Jack', 56, 98, 76);
具體的SQL語句如下:
select
id,
name,
(case when math >= 85 then '優秀' when math >=60 then '及格' else '不及格' end )
'數學',
(case when english >= 85 then '優秀' when english >=60 then '及格' else '不及格'
end ) '英語',
(case when chinese >= 85 then '優秀' when chinese >=60 then '及格' else '不及格'
end ) '語文'
from score;