数据连接: 对两张表或者N张表做连接,是SQL里面非常重要的一个内容,也是最容易埋坑的一个坑点 。尽管数据连接只涉及四种方式,七个语法,但其仍然是绝大部分SQL脚本的核心内容 。选择合适的可靠的数据连接方式,应该是一个SQL运动员的基本功了 。
文章插图
4.函数应用
函数库,其实就像是一个数据处理与分析的百宝箱,收藏着各种场景下需要用到的车轮子 。对函数库的熟悉和掌握,可以较好地提升工作效率,也让计算脚本显得轻量而简洁 。毕竟站在通用的函数的肩膀上,很多统计逻辑是可以一步到位的,不需要沉迷于山重水复的自主构造里 。以下参考TDW的函数库分类,将日常所用的函数细分为几个子类别 。
4.1数学函数: SQL里的数学函数主要和数值处理有关,有取值函数和变换函数等 。取值函数包括round四舍五入,abs取绝对值,ceil向上取整等,主要用于对具体数值的细节调整;变换函数则会改变该字段的数据分布形态,如正弦sin,余弦cos,或者开根号sqrt等 。
【一文搞懂 SQL:基础知识和业务实践总结】4.2聚合函数: 在数据聚合中,选择了具体字段作为聚合维度后,之后便是应用各种聚合函数得到汇总值的过程 。其中有简单聚合函数如count计数,sum求和,avg求平均,也可以基于分布特征,max/min取极值,std取标准差,variance取方差,另外若在聚合过程中涉及分区处理的话,也有rank,first/last_value,row_number等函数可以应用 。
4.3时间和日期函数: 对时间数据的处理,同样也是SQL里的一个重要课题,主要细分为时间的加减,取值和转换这么三类 。其中时间加减里,又涉及不同的时间维度,比如按日维度有date_diff,date_add,date_sub等,按月维度有month_between,add_months等 。时间取值函数则是在一个详细的时间戳里,取出自己想要的部分,如year,month,day,hour等 。时间转换函数则是时间形式的切换,如日期格式,格林尼治时间戳格式等 。
4.4文本处理: 数据类型可以粗糙地分为数值数据和文本数据,对于文本数据的处理,也有很多对应的函数 。其中有一些简单取值函数,如通过length和size获得字段长度和数组大小,通过upper和lower可以切换大小写;字符串的切割与拼接,由浅入深有split,substr,concat,wm_concat等;最后正则表达式也是文本处理中一个特别重要的模块 。
4.5其它函数: 除了以上所盘点的一些通用函数外,其实在日常工作中会有很多垂直的业务场景,在这些特定场景下也有一些特定的函数逻辑 。比如涉及数组结构拆分与重构时,可以应用later view函数;涉及字段编码时,也有加密与解析函数;除此之外,还有逻辑函数,转换函数等多种特殊函数,在特定的场景下,这些函数其实也是必要的 。
5.具体开发环境的注意点
和其它众多语言一样,SQL的编写也不能脱离其自身的开发环境,不同的数据库形态,不同的IDE,都会有一些差异点和新特性 。同样的一段脚本,在A环境下可能跑的疾速如飞,在B环境下却可能满屏报错,可以拿出来讨论的,往往只是一些通用的逻辑和思考 。除此之外,具体开发环境里的注意事项,一些细节的加速点,则是要在具体环境里去发现和探索 。
第二部分 业务实践篇
一种语言,一个函数库,就像是厨房里的各种厨具,它们可能或优良或劣质,但本质上还是一些标准化的组件 。基于这些公共的组件,如何去烹制自己的美食,以及在烹制过程中的心得和思考,则属于业务实践的篇章 。在业务实践的过程中,不管怎样去规范化,标准化,每个人输出的脚本内容,难免还是要带上私人的特质的,这同样也是一个需要修习的部分 。
以下通过三个问题点,来引出笔者在实际工作中的一些反思 。其中如何尽量地少给未来挖坑,介绍了一些反面的案例,这些反面的细节在积累之后,容易引起整个系统的不稳定性;如何健康地做数据规划,则是从一个创建者的身份,展开几点数据规划的思考;但不管做了多么缜密和丰富的准备,随着时间推移,总还是会出现变化的,所以在破旧与立新之间要找到平衡点 。这些反思是基于工作实践的层面,难免会有幼稚和纰漏之处,还请读者轻拍 。
1.如何尽量地少给未来挖坑
文章插图
不要起一些奇奇怪怪的名字: SQL里的数据库表,就像是其它语言里的对象,往往是数量极大的,并在时间的推进,业务的发展中,基数会持续放大 。所以对于数据库名,数据表名,字段名,尤其是一些主键,索引的命名,务必要有一套相对统一的规范 。缺乏规范的约束时,你无法想象人的想象力会多么发散,这些奇奇怪怪的名字,最终会把人深深地困住的 。
推荐阅读
- 详解PostgreSQL数据库压测工具之pgbench-tools
- 搞懂 面向对象 的核心思想,JAVA中封装、包和访问权限的知识点
- MySQL查看连接数
- 一文搞懂队列
- 自动补全、回滚!介绍一款可视化 sql 诊断利器
- 一文了解数据仓库
- 我一直以为SQL先执行SELECT语句?一个窗口函数,我突然发现错了
- 两万字深度介绍分布式,一文入魂
- 一文带你弄懂 Java 动态代理
- Linux下的MySQL Proxy 读写分离该怎么操作?