一、概述
最近公司招了一批新人,做数据库开发,这些新人中不少是工作两年内甚至是应届生。鉴于这种情况,领导要求组内成员轮流每周都做一个技术分享,一是提升大家的专业知识和表达能力,二是让彼此互相熟悉,加强组内的凝聚力。轮到我了,我想给大家讲讲新手如何学习sql,以及工作中的一些小建议。
二、如何学习sql
学习sql可以分为以下三个阶段。
1. 初级
- 掌握sql语法,知道sql语句,如:SELECT col1, col2, count() cnt FROM table1 WHERE col1 = \’XX\’ AND col2 = \’YY\’ GROUP BY col1, col2 HAVING count() > 2 ORDER BY col1 desc, cnt; 这些关键字执行的先后顺序。
- 掌握数据库内置函数,知道这些内置函数的官方文档去哪查。
- 掌握数据库常用的数据类型,例如char和varchar的区别,char与varchar进行表关联的坑在哪里。时间、数字、字符串这些类型如何相互转换。
- 掌握表关联的类型,知道内连接,左外连,右外连,全外连的区别。在这个阶段,主要是能写,能看。在保证结果正确的基础上,尽量做到sql语句简洁,优雅。编写长段的sql语句,分清楚大小写和如何换行,让sql语句清晰。
2. 中级
- 知道什么是执行计划,怎么看。
- 了解索引的结构,知道如何建立合适的索引,使用索引的优缺点,以及什么时候索引sql语句用不到。
- 知道什么是统计信息,统计信息如何收集,统计信息如何影响执行计划。
- 知道锁的类型,什么是表锁和行锁,知道怎么去查数据库里面的锁。
- 知道什么是绑定变量,如何使用,有哪些优缺点。
- 知道什么是分区表,有哪些类型,如何使用。
- 知道什么是临时表,用在哪个场景。在这个阶段,开始注意到sql的性能,试图写出高效的sql。
3. 高级
- 知道表关联有哪些方式,这里的表关联跟初级里面提到的表关联不一样,这里的表关联指的是数据库后台如何对两张表匹配选出最优的执行计划。
- 了解一条sql语句从发出到最后查到结果,数据库后台做了哪些事情。
- 了解体系结构,掌握oracle的内存池,sql语句存在哪里,表的数据缓存存在哪里,sql结果存在哪里等。
- 知道hint的种类,会强制sql按照自己想要的方式执行。
- 对于性能时好时坏的sql语句知道如何固定最优的执行计划。
- 处理一些特定的情况,如文本长度超过varchar的最大长度了该如何处理,怎么存储图片这些大文件,有哪些优缺点,如何改进。在这个阶段,应该是对数据库的体系结构十分清晰,一条sql语句写出来,能在自身脑海中想出它的最优执行计划,如果数据库实际情况不是这样,能分析原因,最后实在是找不到原因,还能强迫它按照自己想象的剧本走。
三、工作建议
上面所讲的都是些纯技术方面的,接下来我想跟大家谈谈工作的感想。主要是以下几点。
1. 创造劳动价值
公司给员工提供工作岗位并且给员工发工资,员工在这个岗位上给公司干活拿钱,这属于一个共赢的局面。作为员工,我们其实要思考我们的价值在哪里,是辛苦劳动产生价值,还是提升自己实力产生价值,其实都不是。辛苦劳动,要看你每天劳动的这些内容是否是重复的,是否有意义,有没有更优化的方案。提升自己,一个人考一堆的证书,学一堆的技术,杂而不精,生产上面根本不敢用或者用不到,别人问起来似是而非,价值又在哪里。真正的价值应该是在有限的工作时间里,将自己的工作内容高效完成,同时优化他人的工作内容。举个例子,不少企业对服务器和数据库的监控还是靠人去定时执行脚本来巡检,如果数量多了,那么这个人可能一整天都要干这个事,有没有优化方案呢,有,通过自动化平台去实现。不会咋办,学,东西做出来之后,是不是节省了人力,自己也学到了东西,这就是避免重复劳动和只学有用的知识。再举个例子,运营每天晚上发送账单,深圳通和邮件很慢,因为一直都慢,所以她们也习惯了,导致她们在做下一波事情前,只能干等。是不是有优化方案,怎么提速呢?我们在解决其它部门问题的时候,自己是不是也学到了技术,这就是价值。
2. 不挑活,认真对待手上的每一件事
古人学问无遗力,少壮工夫老始成纸上得来终觉浅,绝知此事要躬行