ORACLE数据库,刚进电信实习,一个经营分析系统的项目组,主要做运维、数据仓库。最基本的事情就是完成电信方要求的各种报表,需要的能力就是写SQL。目前对简单的SQL语句,关键字都了解,问题是对于复杂SQL很头疼,基本上看不懂,即使拿到别人写的几十行几百行的SQL也是摸不着头脑(我们的报表SQL经常使用多个临时表分步查询来得到目标表)。我知道,关于报表SQL,对表结构、统计口径的熟悉是很重要的,但是我现在即使熟悉,也缺乏写复杂SQL的能力,一个多月还在帮其他人核对数据,太没意思了,所以现在有以下几个问题请教:
1、拿到复杂SQL,看懂它需要一个什么样的思路;
2、写复杂SQL,特别是关于电信行业报表SQL,各种all union,decode来处理很多字段,以实现目标表,各种头痛;
3、另外就是如果有做相同工作的前辈,请教一些需要自己多学哪些知识,如果锻炼能力,比如一些流程SHELL,稽核SHELL,流程配置等等工作。(本人刚去,很多东西知识接触到,不熟悉,不会,但是很想长久做这个工作,并且能够独当一面)
4、请推荐一本关于数据库的书,主要是提高写SQL能力的,基础语法及简单SQL语句最好简略带过的那种。准备在春节期间自己多看看,收假以后找项目经理,希望安排一些实际的工作,比如先从写报表开始。
我现在时间很多,没有什么任务,自己又很想学,也许是因为能力不强,也没找到正确的学习方法,感觉没有提高,又不敢找经理要工作安排。对于我这样一个实习生,真的很困惑。
------解决思路----------------------
Oracle?发错区了。不过基于你的问题,我说说我的看法:
问题1:化繁为简,看看有没有if/else,如果有,那么先看懂if,else自然也没啥问题了。如果没有,只是一大片,那么你要从上到下,一部分一部分拆出来看,比如第一步干啥,第二步是在第一步上怎么做加工,一般的复杂sql都会有一些判断,从判断入手,从整体去找入口,不要一开始就从头看到尾,不然到了中间可能你就忘了开始时是干嘛的了,注意一些变量的定义。
问题2:每个union一般都有where条件,先从from中看是用到什么表,然后看where是筛选什么数据,最后才看select是如何实现。每个union单独看,先不要一批看。
问题3:我没做过BI,这个不懂,多问,多思考,这是关键。但是不要什么都问,前提是你思考过了。不然拿来主义会让你停滞不前。
问题4:这里是SQLServer专区,所以我说的书都不适合你,你最好到Oracle问问吧。不过记住扎实的基础是成长的关键。不要想着靠实践来积累,那个东西零零碎碎,不合适。
最后,规范化编程,让代码规范、清晰,哪怕是别人写的,你也可以重新整理一下样子,这样你看起来会更容易懂。
------解决思路----------------------
首先问一点,你的基础语法都懂没,如果语法上面都还不熟悉,就去业务的大型过程里面想要提高是有点难的
所谓的复杂的过程,其实都不复杂,仅仅是功能较多而已,只要你懂的如何拆分,将大的功能拆成多个小的。
最后再讲一点,数据库讲究的是集合的思想,有些过程很繁琐的,实际上可能是使用了非集合的思路来写
新学习的话,最好避免使用游标,循环之类的非集合思路
------解决思路----------------------
楼上都是好人啊。
我也经历过这种情况。我的是ERP系统。
我是从主体需求入手的。首先看这个SQL取出了哪些数据,就是这个SQL跑出来的报表是要干什么的,监测哪些KPI的等等。这些数据都来自哪些表,那些表的都是包含哪些主要数据的。表之间的联系是什么样。 同时了解了解业务是什么样的,搞清这些那么以后开发维护报表就知道哪里入手了。
举个例子:
比如一个关于某个物料的区域销售情况。
这里会涉及物料主数据 A,客户主数据 B,销售订单 C。 分别找到这些数据的相关表,A B C。看看A 与 C用哪些条件链接,B 与 C 如何链接。各个表的主键是什么(避免以后写SQL出现重复数据)。 哪些值就可以确定一条数据是唯一的。这样你就可以根据需求找到各个表中的相应字段。
还有楼主可以问问项目组是否有相关的元数据的报表或者表,就是表的描述,字段描述。 这个很有用。看看有没有该SQL的文档,公司有没有knowledge bank这样的知识共享系统。
谦虚,多问,多练习。耐心是关键。
------解决思路----------------------
我的经验和楼上的差不多,我的做法是
1、熟悉现在的流程,根据用户需求,将软件功能走下来
比如,我们做的考试系统,先要创建试题-》创建试卷-》创建考试人员等等,你最少要将基础的工作流摸清楚
2、记录,找一个本子,用数据库监控软件(我知道的mssql有,其他的就不清楚了),将上边的工作流中,做的每一步的存储过程记录下来。一定要用记的,用脑子肯定短路(我们的代码里面充斥着CopyUnitSettingByBranchTemplateID这样的存储过程,光看是远远不够的),了解每一个存储过程是做什么的
3、找出一个存储过程进行分析,按照DBA_Huangz的分析方法进行分析
我的个人理解,数据库无外乎插入,删除,更新,根据什么条件插入到什么表格中,语句很简单,语法也不难,唯一要求的就是你要有耐心和恒心,多看,多想,时间长了就好了。
------解决思路----------------------
个人感觉大神们说的都很有道理:1、搞清楚代码的展示目的和数据来源; 2、从外到内,一层层剥开,从外到内看时先看懂每一层的结果内容,再从底层开始分析算法; 3、代码混乱的时候先调格式,很多复杂的代码如果格式规范,就好看多了; 4、遇到没见过的写法,可以找简单的数据表自己做测试,体会新代码用法 5、就是多练习了,然后就熟了。