每天学一点之MySQL中函数的使用及其应用

函数

一、单行函数

  • 只对一行进行变换,每行返回一个结果
  • 可以嵌套
  • 参数可以是一字段或一个表达式或一个值

1、字符串函数

函数 用法
CONCAT(S1,S2,…,Sn) 连接S1,S2,…,Sn为一个字符串
CONCAT_WS(s, S1,S2,…,Sn) 同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上s
CHAR_LENGTH(s) 返回字符串s的字符数
LENGTH(s) 返回字符串s的字节数,和字符集有关
INSERT(str, index , len, instr) 将字符串str从第index位置开始,len个字符长的子串替换为字符串instr
UPPER(s) 或 UCASE(s) 将字符串s的所有字母转成大写字母
LOWER(s) 或LCASE(s) 将字符串s的所有字母转成小写字母
LEFT(s,n) 返回字符串s最左边的n个字符
RIGHT(s,n) 返回字符串s最右边的n个字符
LPAD(str, len, pad) 用字符串pad对str最左边进行填充,直到str的长度为len个字符
RPAD(str ,len, pad) 用字符串pad对str最右边进行填充,直到str的长度为len个字符
LTRIM(s) 去掉字符串s左侧的空格
RTRIM(s) 去掉字符串s右侧的空格
TRIM(s) 去掉字符串s开始与结尾的空格
TRIM(【BOTH 】s1 FROM s) 去掉字符串s开始与结尾的s1
TRIM(【LEADING】s1 FROM s) 去掉字符串s开始处的s1
TRIM(【TRAILING】s1 FROM s) 去掉字符串s结尾处的s1
REPEAT(str, n) 返回str重复n次的结果
REPLACE(str, a, b) 用字符串b替换字符串str中所有出现的字符串a
STRCMP(s1,s2) 比较字符串s1,s2
SUBSTRING(s,index,len) 返回从字符串s的index位置其len个字符

常用举例:

/*
CONCAT(S1,S2,......,Sn):连接S1,S2,......,Sn为一个字符串
LEFT(s,n):返回字符串s最左边的n个字符
RIGHT(s,n):返回字符串s最右边的n个字符
*/
#将"hello"和"world"拼接为"helloworld"
SELECT 'hello'+'world';  -- 0
SELECT CONCAT('hello','world'); -- helloworld

#查询所有员工的姓氏并去重(去冗余)
select distinct left(ename,1from t_employee;

#查询员工的姓名、手机号和真实薪资,真实薪资=salary*(1+kpi),要求员工姓名保密,例如"周**",要求手机号保密,例如"185****9977"
select 
concat(left(ename,1,'**') 员工姓名,
salary*(1+ifnull(kpi,0)) 真实薪资,
concat(left(tel,3),'****',right(tel,4)) 手机号
from t_employee;

2、数值函数/数学函数

函数 用法
ABS(x) 返回x的绝对值
CEIL(x) 返回大于x的最小整数值
FLOOR(x) 返回小于x的最大整数值
MOD(x,y) 返回x/y的模
RAND() 返回0~1的随机值
ROUND(x,y) 返回参数x的四舍五入的有y位的小数的值
TRUNCATE(x,y) 返回数字x截断为y位小数的结果
SQRT(x) 返回x的平方根
POW(x,y) 返回x的y次方

常用举例:

/*
ROUND(x,y)    | 返回参数x的四舍五入的有y位的小数的值 
TRUNCATE(x,y) | 返回数字x截断为y位小数的结果 
*/
#查询员工的姓名和员工每天的工资(一月31天),要求使用四舍五入和截断
select ename,salary/31,round(salary/31,2),truncate(salary/31,2) from t_employee;

3、日期函数

函数 用法
CURDATE() 或 CURRENT_DATE() 返回当前日期
CURTIME() 或 CURRENT_TIME() 返回当前时间
NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP() 返回当前系统日期时间
YEAR(date) / MONTH(date) / DAY(date) / HOUR(time) / MINUTE(time) / SECOND(time) 返回具体的时间值
WEEK(date) / WEEKOFYEAR(date) 返回一年中的第几周
DAYOFWEEK() 返回周几,注意:周日是1,周一是2,。。。周六是7
WEEKDAY(date) 返回周几,注意,周1是0,周2是1,。。。周日是6
DAYNAME(date) 返回星期:MONDAY,TUESDAY…SUNDAY
MONTHNAME(date) 返回月份:January,。。。。。
DATEDIFF(date1,date2) / TIMEDIFF(time1, time2) 返回date1 - date2的日期间隔 / 返回time1 - time2的时间间隔
DATE_ADD(datetime, INTERVAL expr type) 返回与给定日期时间相差INTERVAL时间段的日期时间
DATE_FORMAT(datetime ,fmt) 按照字符串fmt格式化日期datetime值
STR_TO_DATE(str, fmt) 按照字符串fmt对str进行解析,解析为一个日期

DATE_FORMAT(datetime,fmt) 和 STR_TO_DATE(str, fmt)

格式符 说明 格式符 说明
%Y 4位数字表示年份 %y 表示两位数字表示年份
%M 月名表示月份(January,…) %m 两位数字表示月份(01,02,03。。。)
%b 缩写的月名(Jan.,Feb.,…) %c 数字表示月份(1,2,3,…)
%D 英文后缀表示月中的天数(1st,2nd,3rd,…) %d 两位数字表示月中的天数(01,02…)
%e 数字形式表示月中的天数(1,2,3,4,5…)
%H 两位数字表示小数,24小时制(01,02…) %h和%I 两位数字表示小时,12小时制(01,02…)
%k 数字形式的小时,24小时制(1,2,3) %l 数字形式表示小时,12小时制(1,2,3,4…)
%i 两位数字表示分钟(00,01,02) %S和%s 两位数字表示秒(00,01,02…)
%W 一周中的星期名称(Sunday…) %a 一周中的星期缩写(Sun.,Mon.,Tues.,…)
%w 以数字表示周中的天数(0=Sunday,1=Monday…)
%j 以3位数字表示年中的天数(001,002…) %U 以数字表示年中的第几周,(1,2,3。。)其中Sunday为周中第一天
%u 以数字表示年中的第几周,(1,2,3。。)其中Monday为周中第一天
%T 24小时制,%H:%i:%s %r 12小时制
%p AM或PM %% 表示%

常用案例:

/*
CURDATE() 或 CURRENT_DATE():返回当前日期
CURTIME() 或 CURRENT_TIME():返回当前时间
NOW() / SYSDATE() / CURRENT_TIMESTAMP() :返回当前系统日期时间
YEAR(date) / MONTH(date) / DAY(date) / HOUR(time) / MINUTE(time) / SECOND(time):返回具体的时间值
DATE_FORMAT(datetime ,fmt):按照字符串fmt格式化日期datetime值
*/
#获取当前的日期
select curdate(),current_date();
#获取当前的时间
select curtime(),current_time();
#获取当前日期和时间
select now(),sysdate(),current_timestamp();
#获取当前时间的年,月,日,时,分,秒
select year(now()),month(now()),day(now()),hour(now()),minute(now()),second(now());
#获取员工的入职时长(年)
select ename,hiredate,year(now())-year(hiredate) 入职时长 from t_employee;
#查询今天生日的员工
select ename from t_employee where month(birthday)=month(now()) and  day(birthday)=day(now());
#查询当前日期,以“xxxx年xx月xx日”的格式输出
select date_format(now(),'%Y年%m月%d日 %H时%i分%S秒');

4、流程函数

函数 用法
IF(value,t ,f) 如果value是真,返回t,否则返回f
IFNULL(value1, value2) 如果value1不为空,返回value1,否则返回value2
CASE WHEN 条件1 THEN result1 WHEN 条件2 THEN result2 … [ELSE resultn] END 相当于Java的if…else if…else…
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 … [ELSE 值n] END 相当于Java的switch…case…

案例:

#分别使用if和ifnull查询员工的真实薪资
select ename,salary*(1+if(kpi is null,0,kpi)) 真实薪资 from t_employee;
#根据员工的入职时长,展示不同的信息,入职时长>=20-->老鸟,入职时长>=10-->大神,其他-->菜鸟
SELECT ename,YEAR(NOW())-YEAR(hiredate) 入职时长,
CASE 
   WHEN YEAR(NOW())-YEAR(hiredate)>=20 THEN '老鸟'
   WHEN YEAR(NOW())-YEAR(hiredate)>=10 THEN '大神'
   ELSE '菜鸟'
   END description
   FROM t_employee;
   
#根据员工的部门为员工分组,1-->A,2-->B,其他-->C
SELECT ename,did,
CASE did 
WHEN did=1 THEN 'A'
WHEN did=2 THEN 'B'
ELSE 'C'
END 部门
FROM t_employee;

5、其他函数

函数 用法
database() 返回当前数据库名
version() 返回当前数据库版本
user() 返回当前登录用户名
password(str) 返回字符串str的加密版本,41位长的字符串
md5(str) 返回字符串str的md5值,也是一种加密方式

二、 分组函数

分组函数作用于一组数据,并对一组数据返回一个值。

/*
avg():求平均值
sum():求总和
max():求最大值
min():求最小值
count():求总数量
*/

#求所有员工的平均薪资
select avg(salary) from t_employee;
#求所有员工的平均年龄
select avg(year(now())-year(birthday)) from t_employee;
#求该公司一个月要发的工资总和
select sum(salary*(1+ifnull(kpi,0))) from t_employee;
#求最高薪资的员工
select ename,salary from t_employee where salary=(select max(salary) from t_employee); 

#查询员工表中总数量
SELECT COUNT(*) FROM t_employee; --适用于任意数据类型。
SELECT COUNT(0) FROM t_employee;
-- 以上两种SQL查询的结果一致
-- 下面的两个SQL查询的结果不一样,当通过某个字段查询总数量时,该字段的值为null的数据不会记录在内
SELECT COUNT(eid) FROM t_employee; --30
SELECT COUNT(kpi) FROM t_employee;  --25
  • 问题:用count(*),count(1)谁好呢?

    其实,对于myisam引擎的表是没有区别的。这种引擎内部有一计数器在维护着行数。

    Innodb引擎的表用count(*)直接读行数,效率很低,因为innodb真的要去数一遍。

猜你喜欢

转载自blog.csdn.net/qq_52370789/article/details/129537684