这些都是我自学时手打到文本文档,在复制粘贴到博客的,有一些命令格式不对,但全部百分百原创,如果有疑问或者不对的地方,欢迎评论区指正,也可以加q群592383030来探讨(我就是自学的普通人,不卖课,不涉及补习机构)
我会出一整套mysql的学习过程,从基础的sql语句,约束,函数,事务。到进阶的存储引擎,sql优化,索引,存储过程,锁,触发器,视图甚至lnnoDB引擎的详解和一些运维方面的比如,mha主从,读写分离;mmm双主,pxc MySQL高可用,zabbix,elk监控MySQL。如果有需要来我主页,有帮助到您就关注我点个赞。
一,字符串函数
函数是指一段可以直接被另一段程序调用的程序或代码
所有函数都是MySQL内置好的,我们只需要按需求调用即可
两个问题,数据库中只存学生成绩,具体分数,那该如何快速判断分数是否及格呢?
数据库中,只记录入职日期,如何快速计算出入职多少天了呢?
这些问题都可以依靠MySQL的内置函数来快速解决。
1,字符串函数(太多了,只了解常用的)
concat(字符1,字符2,字符3) 字符串拼接,将三个字符串拼成一个字符串
lower(字符1,字符2,字符3) 将字符串全部转换为小写
upper(字符1,字符2,字符3) 将字符串转换为大写
lpad(str,n,pad) 左填充,用字符串pad对str左边进行填充,达到n个字符串长度
rpad(str,n,pad) 右填充,用字符串pad对str右边进行填充,达到n个字符串长度
trim(str) 去掉字符串头部和尾部的空格
substring(str,start,len) 返回从字符串str从start位置起的len个长度的字符串
例子,企业员工工号,全部统一为五位整数,不足五位在前面补零
通过调用lpad函数:update 表名 set 字段 =lpad(要填充字段名,5要填充到多少位,‘0’用这个值来填充);
二,数值函数
ceil(x) 向上取整值(就是只要输入的值有小数位,不管小数位是多少。整数位都向上走一位,比如1.1到1.9向上取整都是2)
floor(x) 向下取整值(只要输入的值有小数位,不管小数位是多少,整数位都向下走一位,1.1和1.9向下取整都是1)
mod(x,y) 返回x除以y的值
rand() 返回0~1内随机数
round(x,y) 求x的四舍五入值,保留到y数位
例子,通过数据库函数,生成一个6位整数随机验证码
select rand() 这一步是调用rand函数,随机生成数,但固定零点几,不是整数也没法固定6位
因为round函数固定零点几,所以最简单的方法要多少位整数就乘以多少个零,要六位整数,就直接乘以1后六个零
select rand()*1000000;这一步之后发现有6为整数了,但是后面还有一串小数位,这是我们不需要的
通过调用round函数来实现去掉小数
select round(rand()*1000000),0);调用了round函数限制小数位,rand函数就是round函数的x,通过x来四舍五入;自己写的0就是round函数的y,通过y来决定保留几位小数。
但是到这一步还有bug,雀氏能算出符合要求的六位整数并且后面没有小数位了。但是rand函数是1~0之间的随机数,第二步乘以六个零得到六位整数,适用于零点几;但是零点零几依旧是0~1之间随机数,也有可能出现,如果零点零几乘以六个零就会得出5位整数
解决方法就是调用上一章的lpad函数,补零
select lpad(round(rand()*1000000,0),6,’0‘);
这里的(rand()*1000000),0)段得出的值为lpad函数的str,就是指定目标;6是lpad函数的n,把对应目标填充到多少位指定;0是lpad函数的pad,用pad进行填充
如果本身就够到6位,就不填充;不够就用0填充到够为止。
三,日期函数
1,认识常见的日期函数
curdate() 返回当前日期
curtime() 返回当前时间
now() 返回当前日期和时间
year() 获取年份
month() 获取月份
day() 获取日期
date_add(date,interval expr type) 返回一个日期或时间值加上一个时间间隔expr后的时间值
datedlff(date1,date2) 返回起始时间date1和结束时间date2之间天数
例子:查询所有员工入职天数,并且根据入职天数倒叙排序
第一步先把员工信息查出来:select * from 表名;
第二步:select name,datediff(curdate(),entrydate)from 表名 order by desc
四,流程函数
流程函数主要用于条件筛选,提供sql语句效率
先认识四个常用流程函数
1,if(value,t,f) 我也不太理解,用不到。应该value是一个自定义的表达式,这个表达式结果等于true就报t,否则报f
2,ifnull(value,value2) 用来判断value1是否为空,如果value1不为空,返回value1,否则返回value2
3,case when 【vall】 then【res1】....else【default】end vall为自定义表达式,如果它等于自定义条件res1,返回res1,.....否则返回default默认值
例子:查询此表的员工姓名和工作地址(北京上海,一线城市)(其它二线城市)
肯定用到case when then else end的语法
select name,case 工作地址 when‘北京’then‘一线城市’注意!!when,then循环可重复使用,这里只写一组只有北京是一线,不符合要求,解决方法就是加一组when,then循环
when‘上海’then‘一线城市’到这里已经可以完成要求的一线城市了,但是还有二线城市,解决方法就是写否则回报,也就是else‘二线城市’end
最后加上form 表名就完成了。
4,case【expr】when【vall】then【res1】...else【default】end 如果expr值等于val1,...否则返回default默认值
例子:查成绩表,大于等于80优秀,大于等于60及格,否则不及格。
因为分数是范围不是具体,所以继续使用第三种语法
第一步:select 序号,名字, from 表名 查询这个表里的序号和名字(因为查成绩除了各科是否合格还需要知道对应的序号,名字)
第二步加上要求的条件限定:select 序号,名字,(case when 数学 >=85 then‘优秀’when 数学 >=60 then ‘及格’else‘不及格’end)(case when 语文 >=85 then‘优秀’when 语文 >=60 then ‘及格’else‘不及格’end)(case when 英语 >=85 then‘优秀’when 英语 >=60 then ‘及格’else‘不及格’end)from 表名;