Oracle查询优化改写技巧与案例2.0 - (EPUB全文下载)
文件大小:0.12 mb。
文件格式:epub 格式。
书籍内容:
Oracle查询优化改写技巧与案例2.0
第1章 单表查询
第2章 给查询结果排序
第3章 操作多个表
第4章 插入、更新与删除
第5章 使用字符串
第6章 使用数字
第7章 日期运算
第8章 日期操作
第9章 范围处理
第10章 高级查找
第11章 报表和数据仓库运算
第12章 分层查询
第13章 应用案例实现
第14章 改写调优案例分享
封底
第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是依次对数据做标识的,就像上学时依据考分排名一样,需要有第一名,后面才会有第二名。所以,要先把所有的数据取出来,才能确认第二名。
正确地取第二行数据的查询应该像下面这样,先生成序号:
第2章 给查询结果排序
2.1 以指定的次序返回查询结果
实际提取数据或生成报表时,一般都要根据一定的顺序查看,比如,想查看单位所雇员工的信息:
这种语句很多人都会写,但除了“ORDER BY hiredate ASC”这种写法,还可以写成“ORDER BY 3 ASC”,意思是按第三列排序。
当取值不定时,用这种方法就很方便,比如,有时取sal,有时要取comm来显示:
对于这种需求,如果在order by 后使用列名,就需要注意前后保持一致,否则会给开发软件带来“小麻烦”。 ............
以上为书籍内容预览,如需阅读全文内容请下载EPUB源文件,祝您阅读愉快。
书云 Open E-Library » Oracle查询优化改写技巧与案例2.0 - (EPUB全文下载)