这个blog我们来聊聊MySQL的开发
很多同学熟悉的MySQL sql的基本知识,sql的增删改查、表连接、分组聚合、常用函数等之后,就开始是想要进阶了。
最近抽时间整理了一下MySQL sql进阶以及MySQL存储过程编程的blog,由于个人能力有限,如有错误的地方,欢迎指正。
如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本
文章目录
一.MySQL 行转列
MySQL行转列
MySQL行转列是MySQL岗位笔试的一个入门级别的考试题目,做一些日常的统计分析报表的时候经常会被使用到。
很多刚开始学MySQL开发都卡在了行转列这个需求上了,之前B站免费的MySQL高级视频教程(面向java开发的),居然花了2个课时,接近2个小时来讲解MySQL行转列和列转行,可见这个知识点的重要性。
二.MySQL 常用的函数
MySQL常用流程控制函数小结
MySQL常用数值函数小结
MySQL常用日期时间函数小结
MySQL常用日期时间函数拓展
MySQL常用字符函数小结
每个数据库都有自己的函数,语法和数量上存在一定的差异。
我遇到过开发(例如java开发,.net开发)的同学,不熟悉数据库间的差异,将Oracle或SqlServer数据库的特定函数用在MySQL里,然后问DBA为何报错,DBA只能改写成MySQL自己支持的函数来实现需求。
也遇到过开发(例如java开发,.net开发)的同学,不熟悉MySQL的函数,然后重复造轮子,耗时较久的通过多层case when、通过多个表连接、通过java集合、java循环来实现本来通过MySQL函数就可以轻松完成的事情。
也遇到过开发(例如java开发,.net开发)的同学遇到搞不定的sql,咨询DBA,结果DBA不熟悉MySQL的函数,通过百度或其它论坛等地提问来解决此类问题。
综上所述,无论是DBA还是开发人员,甚至数据分析人员,都需要熟悉掌握MySQL的常用函数,对自己的实际工作有很大的帮助。
三.MySQL 表连接
作为DBA,经常遇到初中级开发提问关于表连接的,问题无外乎如下几种:
1.表连接一对多或者多对多,为什么会有重复数据
2.我用了left join 但是where后面有其它条件,为什么还是少数据
3.我的in、exists很慢,能否优化下
其实通过几个简单的实验,可以快速的弄懂表连接的语法,上述的问题也就比较容易的解决。
MySQL的 全连接、左连接、右连接、内连接
以及基于这些连接在where子句加上 col is null,可以实现去交集等操作
如果可以用表连接实现的,尽量通过表连接实现,在一定的使用场景下,性能会优于in和exists
四.MySQL分组语句小结
MySQL分组语句小结
MySQL的高级分组在OLAP应用,如业务报表、数据仓库等,应用得非常广泛。
我就见过不用rollup,然后各种union 的代码
学会这些高级分组函数,进行多维度、多层级分组汇总的时候,可以大大减少代码行数,提升代码的可读性及可维护性。
五.MySQL with语句
MySQL with语句
个人强烈推荐大家使用with语句。
没有with语句,进行复杂查询的时候,from子句后面一堆的临时表,而且面临特别复杂的需求的时候,from里的临时表里面可能还会嵌套临时表,代码量可读性、可维护性特别差。
with语句推出后,可以通过with语句封装好各个临时表,临时表直接可以根据顺序相互引用。
大大简化了代码的复杂程度,提升代码的可读性、可维护性
with语句的递归,在一些场景也非常有用
六.MySQL高级窗口函数
MySQL高级窗口函数
MySQL高级分析函数与统计函数结合使用
个人强烈推荐大家学习并使用高级分析函数。
MySQL的高级分析函数简直太给力了,往往通过几层临时表的复杂统计分析需求,高级分析函数,往往简单的几行代码就可以搞定,而且性能上也有一定程度的提升。
七.MySQL正则表达式
MySQL正则表达式
MySQL的正则表达式相对于其他编程语言而言,比较弱,但是有总比没有强。
MySQL的正则表达式由于要遍历字符串,所以往往性能并不是特别好。
但是,面对复杂、无规则的文本处理的时候,正则表达式可以发挥作用,往往几行简单的代码可以实现复杂的匹配规则。
当然,正则表达式的应用场景较为广泛,我的blog只是简单介绍了下几个正则函数的使用方法,需要在这方面提升的,还需要找寻其它的资料进行练习。
八.MySQL编程
MySQL视图
MySQL流程控制语句
MySQL游标
MySQL存储过程
MySQL函数编程
MySQL触发器
MySQL事件
MySQL编程的存储过程,相较于Oracle、SQLServer等数据库较弱,但是有总比没有强。
面对一些复杂的需求,sql不好解决或者解决起来比较麻烦的时候,可以尝试用自定义函数进行解决。
面对一些逻辑特别复杂的,可以通过 事件+存储过程+游标 来解决,能在数据库里面实现的,会比在编程语言里面实现速度更快。
当然,如果是生产环境,使用MySQL的存储过程和游标,要注意性能的开销,个人建议如果是高并发的环境,就不要使用了。