欢迎光临散文网 会员登陆 & 注册

Oracle查询优化改写技巧与案例 第一章 单表查询

2022-03-22 16:24 作者:泉来啦  | 我要投稿

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空值与函数

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

有些会返回期望的结果:

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

可以看到,不同的函数对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是依次对数据做标识的,就像上学时依据考分排名一样,需要有第一名,后面才会有第二名。所以,要先把所有的数据取出来,才能确认第二名。

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






Oracle查询优化改写技巧与案例 第一章 单表查询的评论 (共 条)

分享到微博请遵守国家法律