Oracle查询优化改写技巧与案例2.0(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-22 15:32:17

点击下载

作者:有教无类,落落

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Oracle查询优化改写技巧与案例2.0

Oracle查询优化改写技巧与案例2.0试读:

前言

因开办了Oracle优化改写的在线培训,在教学和答疑的过程中有很多读者希望我能推荐一些相关的学习书籍。说实话,有关Oracle的书籍非常多,但在给读者推荐书籍时我发现特意针对优化改写的书籍不好找,因为很多资料注重各种语法的实现,对优化方面的知识考虑得较少,而介绍优化知识的书籍对改写知识涉及得也不多。因此,和落落商量后,尝试编写了本书。

本书共分14章,各章的主要内容如下。

◎第1章介绍初学者在NULL上常犯的错误、字符串中单引号的处理方式及模糊查询时对通配符的转义。

◎第2章讲述了ORDER BY的用法及TRANSLATE的特殊用法。

◎第3章是基础知识的重点内容,需要掌握好各种连接的写法及为什么要左联、右联,以及过滤条件错误地放在WHERE里会有什么影响;当数据有重复值时要直接关联还是分组汇总后再关联。

◎第4章介绍了UPDATE语句的正确用法,以及什么时候UPDATE语句应改写为MERGE。

◎第5章以案例的形式讲解了正则表达式的用法,对正则表达式的基础语法不熟悉的读者可以通过官方文档或我的博客来学习,这里面对字符串的拆分方法可以直接套用,而对字符串的分组处理难度稍高,不常处理类似数据的读者可以略过。

◎第6章介绍了常用分析函数的几个案例,在大部分情况下使用分析函数会让查询速度得到很大提升。所以,如果想熟练地改写,就必须熟悉分析函数的应用。另外,本章还对很多人感到模糊的max() keep()语句进行了分析。

◎第7、8章讲了DATE类型的常见用法。

◎第9章仍然介绍分析函数,希望本章内容对范围的处理能给读者一些借鉴。

◎第10章的重点是结果集的分页,要弄清楚如何分页,为什么Oracle的分页会写得那么复杂,等等。

◎第11章讲述了行列转换函数,并对两个函数进行了剖析,理解了其中的原理就可以用UNPIVOT对UNION ALL做一定的优化。本章的另一个重点就是分组汇总小计的统计,熟练掌握ROLLUP及CUBE可以让你少写一些UNION ALL语句。

◎第12章能帮助读者在写树形查询时减少不必要的错误,生成更准确的数据。

◎第13章选取了部分网友的需求案例,希望读者能通过这些案例的启发找到实现自己需求的思路。

◎第14章选取了能覆盖目前大部分改写方法的案例。读者需要在对前面内容熟悉的基础上来学习这些案例。各种改写方法能否提高速度都与对应的环境有关,所以掌握更多的优化知识和改写方法对优化有很大的帮助。

在此要特别感谢白鳝老师和我们的同事道道给本书作序,通过白鳝老师写的序可以看到,他认真阅读了本书并给出非常中肯的评价,能在百忙之中花费大量时间耐心地把我写的书看完,确实非常令人感动。另外,还要感谢出版社的各位编辑,有很多地方词不达意,是他们给我指出了错误的地方,并给出了改正意见。《Oracle查询优化改写技巧与案例2.0》在《Oracle查询优化改写技巧与案例》的基础上进行了如下更新。

◎所有代码都重新执行了一遍,以减少谬误。

◎为了提高清晰度,尽量删除了图片,改用文本方式展示案例结果。

◎为了提高阅读效率,删除了平时较少用到的内容。

◎为了提高可读性,大部分案例都改用了SAMPLE中的数据,这样读者可以更容易地验证代码及思路。

◎删除了实用性不高的实战案例,另增加了部分实战案例(详见最后两章)。因水平有限,本书在编写过程中难免有错漏之处,恳请读者批评、指正。作 者

轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。

◎提交勘误:您对书中内容的修改意见可在 提交勘误处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。

◎交流互动:在页面下方 读者评论处留下您的疑问或观点,与我们和其他读者一同学习交流。

页面入口:http://www.broadview.com.cn/34141第1章单表查询1.1查询表中所有的行与列

进行查询操作之前,我们先看一下表结构:

若领导要看员工的所有信息,这个操作很简单,大家应该都会用。只要用select * 就可以返回目标表中所有的列,查询语句及执行结果如下:1.2从表中检索部分行

若想查看公司有多少销售人员,那么,我们在查询数据时只需加一个过滤条件就可以。职位列是job,销售人员条件就是WHERE job = 'SALESMAN':1.3查找空值

如果要查询某一列为空的数据该怎么办呢?比如,返回提成(comm)为空的数据:

通过1.1节的查询结果可以看到,明显有提成为空的数据,这里却没查到。

问题出在哪里呢?实际上,NULL是不能用“=”运算符的,要用IS NULL判断,正确的写法如下:1.4空值与运算

NULL不支持加、减、乘、除、大小比较、相等比较,否则只能为空:1.5处理空值

因为NULL不支持加、减、乘、除、大小比较、相等比较,所以需要把空值改为有意义的值:

NVL只能处理单个参数,如果要处理多个参数,则可以使用COALESCE。

创建示例数据:

上面示例中C1~C6各列均有空值,要求取出第一个不为空的值,如果要用NVL,则需要嵌套很多层:

而使用COALESCE就简单得多:1.6空值与函数

函数对空值的处理方式各不一样,有些会返回空值:

有些会返回期望的结果:

而在DECOE中还可以比较空值:

可以看到,不同的函数对NULL的支持也不一样,所以大家遇到NULL时最好测试一下结果会受什么影响,不要仅凭想象。1.7查找满足多个条件的行

对于简单的查询,操作起来比较容易,那么复杂一点的呢?比如,我们要查询部门10中的所有员工、所有得到提成的员工,以及部门20中工资不超过2000美元的员工。

这是三个条件的组合,符合上述任一条件即可。

我们把这三个条件整理成逻辑表达式的形式:(部门10中的员工 OR 所有得到提成的员工 OR (工资<=2000 and 部门号=20))。

注意:对于多个条件的组合,要使用括号,这样在更改维护语句时可以不必再考虑优先级问题,而且可以很容易地借助各种工具找到各组合条件的起止位置。

那么我们可以这样写:

如下图所示,该语句的过滤条件加了括号后,可以清楚地看到起止位置。对于复杂的组合条件来说,要方便得多。1.8从表中检索部分列

前面我们都是取表中所有的列,但在实际的场景中,常常只需要返回部分列的数据就可以,比如只需员工编码、员工名称、雇佣日期、工资。所以一般要明确指定查询哪些列,而不是用“*”号来代替。另外,明确要返回的列也会使语句的维护更简单,而不必每次看到语句时都需要查看表结构才知道会返回什么数据。1.9为列取有意义的名称

不是每个人都能看懂那些简写的字母是什么意思,所以应该给列取个别名。你可以如下面所示在as后面跟别名;也可以不要as,直接在列名后跟别名即可。

看看下面这个报表数据,就会一目了然。1.10在WHERE子句中引用取别名的列

写报表时,经常会加上各种条件,而直接在条件中使用别名比列名(如B01、B02、B03)要清晰得多,引用别名时千万别忘了嵌套一层,因为这个别名是在SELECT之后才有效的。

如下示例是寻找那些拖了国家GDP后腿的人:

否则会提示:1.11拼接列

若有人不喜欢看表格式的数据,希望返回的数据都像“CLARK的工作是MANAGER”这样的显示。我们可以用字符串连接符“||”来把各列拼在一起。

当然,拼接列对我们来说还有其他意义。看看下面的例子。

没错,这就是用SQL来生成SQL。当你有大量类似的SQL需要生成时,可以先写一个语句,然后进行修改,直接用基础数据或数据字典来批量生成。不过不要去执行这个例子生成的SQL,否则会丢失数据。

提示:作者的博客中就有一个拼接列处理问题的例子“通过对照表快速建view”,网址为http://blog.csdn.net/jgmydsai/article/details/25893409。1.12在SELECT语句中使用条件逻辑

有时为了更清楚地区分返回的信息,需要做如下处理。

例如,当职员工资小于或等于2000美元时,就返回消息“过低”,大于或等于4000美元时,就返回消息“过高”,如果在这两者之间,就返回“OK”。

类似这种需求也许会经常遇见,处理这样的需求可以用CASE WHEN来判断转化。

这种方式还常用在报表中,比如,要按工资分档次统计人数:1.13限制返回的行数

在查询时,并不要求每次都要返回所有的数据,比如,进行抽查的时候会要求只返回两条数据。

我们可以用伪列rownum来过滤,rownum依次对返回的每一条数据做一个标识。

如果直接用rownum = 2来查询会出现什么情况?

因为rownum是依次对数据做标识的,就像上学时依据考分排名一样,需要有第一名,后面才会有第二名。所以,要先把所有的数据取出来,才能确认第二名。

正确地取第二行数据的查询应该像下面这样,先生成序号:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载