写复杂SQL语句能力(电信行业报表SQL、数据仓库)

chenenxiong 技术支持  2013-01-23 10:48:02
ORACLE数据库,刚进电信实习,一个经营分析系统的项目组,主要做运维、数据仓库。最基本的事情就是完成电信方要求的各种报表,需要的能力就是写SQL。目前对简单的SQL语句,关键字都了解,问题是对于复杂SQL很头疼,基本上看不懂,即使拿到别人写的几十行几百行的SQL也是摸不着头脑(我们的报表SQL经常使用多个临时表分步查询来得到目标表)。我知道,关于报表SQL,对表结构、统计口径的熟悉是很重要的,但是我现在即使熟悉,也缺乏写复杂SQL的能力,一个多月还在帮其他人核对数据,太没意思了,所以现在有以下几个问题请教:
1、拿到复杂SQL,看懂它需要一个什么样的思路;
2、写复杂SQL,特别是关于电信行业报表SQL,各种all union,decode来处理很多字段,以实现目标表,各种头痛;
3、另外就是如果有做相同工作的前辈,请教一些需要自己多学哪些知识,如果锻炼能力,比如一些流程SHELL,稽核SHELL,流程配置等等工作。(本人刚去,很多东西知识接触到,不熟悉,不会,但是很想长久做这个工作,并且能够独当一面)
4、请推荐一本关于数据库的书,主要是提高写SQL能力的,基础语法及简单SQL语句最好简略带过的那种。准备在春节期间自己多看看,收假以后找项目经理,希望安排一些实际的工作,比如先从写报表开始。

我现在时间很多,没有什么任务,自己又很想学,也许是因为能力不强,也没找到正确的学习方法,感觉没有提高,又不敢找经理要工作安排。对于我这样一个实习生,真的很困惑。
...全文
2026 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cy2889792 2014-12-19
说实话,看书肯定是没有实践学的快的, 你在工作中多写一些SQL语句,多用SQL语句做一些报表,然后多看看那些高手怎样写SQL语句,这样才学得快,书上最多只是教你一些SQL语法知识。
回复
天善智能 2014-12-18
Oracle的 itpub搞的多,,sqlserver来 CSDN啦。。
回复
發糞塗牆 2014-12-17
《SQL Server 2008 编程入门经典》
引用 14 楼 Amina_L 的回复:
[quote=引用 1 楼 DBA_Huangzj 的回复:] Oracle?发错区了。不过基于你的问题,我说说我的看法: 问题1:化繁为简,看看有没有if/else,如果有,那么先看懂if,else自然也没啥问题了。如果没有,只是一大片,那么你要从上到下,一部分一部分拆出来看,比如第一步干啥,第二步是在第一步上怎么做加工,一般的复杂sql都会有一些判断,从判断入手,从整体去找入口,不要一开始就从头看到尾,不然到了中间可能你就忘了开始时是干嘛的了,注意一些变量的定义。 问题2:每个union一般都有where条件,先从from中看是用到什么表,然后看where是筛选什么数据,最后才看select是如何实现。每个union单独看,先不要一批看。 问题3:我没做过BI,这个不懂,多问,多思考,这是关键。但是不要什么都问,前提是你思考过了。不然拿来主义会让你停滞不前。 问题4:这里是SQLServer专区,所以我说的书都不适合你,你最好到Oracle问问吧。不过记住扎实的基础是成长的关键。不要想着靠实践来积累,那个东西零零碎碎,不合适。 最后,规范化编程,让代码规范、清晰,哪怕是别人写的,你也可以重新整理一下样子,这样你看起来会更容易懂。
推荐一本SQL的书吧!我也想学,尤其存储过程谢谢[/quote]
回复
Amina_L 2014-12-17
引用 1 楼 DBA_Huangzj 的回复:
Oracle?发错区了。不过基于你的问题,我说说我的看法: 问题1:化繁为简,看看有没有if/else,如果有,那么先看懂if,else自然也没啥问题了。如果没有,只是一大片,那么你要从上到下,一部分一部分拆出来看,比如第一步干啥,第二步是在第一步上怎么做加工,一般的复杂sql都会有一些判断,从判断入手,从整体去找入口,不要一开始就从头看到尾,不然到了中间可能你就忘了开始时是干嘛的了,注意一些变量的定义。 问题2:每个union一般都有where条件,先从from中看是用到什么表,然后看where是筛选什么数据,最后才看select是如何实现。每个union单独看,先不要一批看。 问题3:我没做过BI,这个不懂,多问,多思考,这是关键。但是不要什么都问,前提是你思考过了。不然拿来主义会让你停滞不前。 问题4:这里是SQLServer专区,所以我说的书都不适合你,你最好到Oracle问问吧。不过记住扎实的基础是成长的关键。不要想着靠实践来积累,那个东西零零碎碎,不合适。 最后,规范化编程,让代码规范、清晰,哪怕是别人写的,你也可以重新整理一下样子,这样你看起来会更容易懂。
推荐一本SQL的书吧!我也想学,尤其存储过程谢谢
回复
岁岁年年 2014-12-17
个人感觉大神们说的都很有道理:1、搞清楚代码的展示目的和数据来源; 2、从外到内,一层层剥开,从外到内看时先看懂每一层的结果内容,再从底层开始分析算法; 3、代码混乱的时候先调格式,很多复杂的代码如果格式规范,就好看多了; 4、遇到没见过的写法,可以找简单的数据表自己做测试,体会新代码用法 5、就是多练习了,然后就熟了。
回复
ahhfql 2014-08-04
回复
「已注销」 2014-08-01
学习了 大家真的给力
回复
引用 楼主 chenenxiong 的回复:
ORACLE数据库,刚进电信实习,一个经营分析系统的项目组,主要做运维、数据仓库。最基本的事情就是完成电信方要求的各种报表,需要的能力就是写SQL。目前对简单的SQL语句,关键字都了解,问题是对于复杂SQL很头疼,基本上看不懂,即使拿到别人写的几十行几百行的SQL也是摸不着头脑(我们的报表SQL经常使用多个临时表分步查询来得到目标表)。我知道,关于报表SQL,对表结构、统……
我就是主要写SQL来做报表的,不过用的是SQL Server。 其中,报表的逻辑有简单的,也有复杂的,简单的可能100多行吧,复杂的2-3千行左右。 除了开发一些新的报表外,也有修改其他人开发的,我觉得首先第一步就是要格式化代码,这样看上去整齐一点,其次就是你得明白里面每个表存放的是什么业务数据,每个字段大概的意思,where中的查询过滤条件是什么意思。 然后就是结合报表本身的需求来理解整个语句的含义。 其中为了提高sql语句的运行效率,对某些语句也会拆分成临时表,每次把计算的一个结果集插入到临时表中,最后通过关联多个临时表,来计算最后的结果集。
回复
haitao 2013-01-29
对于1,可以找一个sql代码格式化工具帮助 提供一个: http://211.162.123.246:443/httpdisk/haitaosoft/?app=sqlformat
回复
fcuandy 2013-01-29
学习。 .
回复
bcc222 2013-01-29
我的经验和楼上的差不多,我的做法是 1、熟悉现在的流程,根据用户需求,将软件功能走下来 比如,我们做的考试系统,先要创建试题-》创建试卷-》创建考试人员等等,你最少要将基础的工作流摸清楚 2、记录,找一个本子,用数据库监控软件(我知道的mssql有,其他的就不清楚了),将上边的工作流中,做的每一步的存储过程记录下来。一定要用记的,用脑子肯定短路(我们的代码里面充斥着CopyUnitSettingByBranchTemplateID这样的存储过程,光看是远远不够的),了解每一个存储过程是做什么的 3、找出一个存储过程进行分析,按照DBA_Huangz的分析方法进行分析 我的个人理解,数据库无外乎插入,删除,更新,根据什么条件插入到什么表格中,语句很简单,语法也不难,唯一要求的就是你要有耐心和恒心,多看,多想,时间长了就好了。
回复
DBA_磊仔 2013-01-24
首先问一点,你的基础语法都懂没,如果语法上面都还不熟悉,就去业务的大型过程里面想要提高是有点难的 所谓的复杂的过程,其实都不复杂,仅仅是功能较多而已,只要你懂的如何拆分,将大的功能拆成多个小的。 最后再讲一点,数据库讲究的是集合的思想,有些过程很繁琐的,实际上可能是使用了非集合的思路来写 新学习的话,最好避免使用游标,循环之类的非集合思路
回复
duoxu1983 2013-01-24
写报表的话首先明确需求。然后熟悉表的字段。
回复
十林 2013-01-24
楼上都是好人啊。 我也经历过这种情况。我的是ERP系统。 我是从主体需求入手的。首先看这个SQL取出了哪些数据,就是这个SQL跑出来的报表是要干什么的,监测哪些KPI的等等。这些数据都来自哪些表,那些表的都是包含哪些主要数据的。表之间的联系是什么样。 同时了解了解业务是什么样的,搞清这些那么以后开发维护报表就知道哪里入手了。 举个例子: 比如一个关于某个物料的区域销售情况。 这里会涉及物料主数据 A,客户主数据 B,销售订单 C。 分别找到这些数据的相关表,A B C。看看A 与 C用哪些条件链接,B 与 C 如何链接。各个表的主键是什么(避免以后写SQL出现重复数据)。 哪些值就可以确定一条数据是唯一的。这样你就可以根据需求找到各个表中的相应字段。 还有楼主可以问问项目组是否有相关的元数据的报表或者表,就是表的描述,字段描述。 这个很有用。看看有没有该SQL的文档,公司有没有knowledge bank这样的知识共享系统。 谦虚,多问,多练习。耐心是关键。
回复
forcyever 2013-01-24
真正做到掌握了基础语法,再难再痛苦的SQL语句都可以读懂,需要的只是一个化繁为简,化整为零的过程
回复
zbdzjx 2013-01-24
个人习惯:先按自己的习惯整理SQL语句的格式,对语句进行分块(如union all,就是前面的是一块,后面的是一块,中间用空行分开),并进行缩进(如from () a01,则将()及中间的内容分成几行,()中间的内容缩进,可以看出层次)。最后,对每一块进行标注,说明其功能。如果内容算法复杂,则可对一段算法进行标注。
回复
發糞塗牆 2013-01-23
Oracle?发错区了。不过基于你的问题,我说说我的看法: 问题1:化繁为简,看看有没有if/else,如果有,那么先看懂if,else自然也没啥问题了。如果没有,只是一大片,那么你要从上到下,一部分一部分拆出来看,比如第一步干啥,第二步是在第一步上怎么做加工,一般的复杂sql都会有一些判断,从判断入手,从整体去找入口,不要一开始就从头看到尾,不然到了中间可能你就忘了开始时是干嘛的了,注意一些变量的定义。 问题2:每个union一般都有where条件,先从from中看是用到什么表,然后看where是筛选什么数据,最后才看select是如何实现。每个union单独看,先不要一批看。 问题3:我没做过BI,这个不懂,多问,多思考,这是关键。但是不要什么都问,前提是你思考过了。不然拿来主义会让你停滞不前。 问题4:这里是SQLServer专区,所以我说的书都不适合你,你最好到Oracle问问吧。不过记住扎实的基础是成长的关键。不要想着靠实践来积累,那个东西零零碎碎,不合适。 最后,规范化编程,让代码规范、清晰,哪怕是别人写的,你也可以重新整理一下样子,这样你看起来会更容易懂。
回复
相关推荐
发帖
community_281
创建于2021-05-27

170

社区成员

申请成为版主
帖子事件
创建了帖子
2013-01-23 10:48
社区公告
暂无公告