Oracle单表查询(二)

1.1在where子句中引用取别名的列

       有时候在做报表的时候,会加上一些条件筛选,直接在别名上加判断会比在列名上加判断更加直观。例如我们要查询工资大于1500的人的工资和提成。

写法如下:

select * from (select SAL AS 工资,coalesce(COMM ,0)AS 提成  from EMP) x WHERE x.工资>1500

 

要注意此处的()不可缺少,因为别名是在执行完
‘select SAL AS 工资,coalesce(COMM ,0)AS 提成  from EMP’这条语句以后才生成的,如果不使用()则会出现:

 

 

1.2限制返回的行数

        例如我们要做一个分页查询,就可以使用rownum这个伪列来过滤,rownum会对查询出的每条数据做一个标识。

先看一下rownum的简单用法,

select * FROM EMP WHERE ROWNUM<5

 

按照正常的逻辑应该是返回第一到第四条数据,没有问题。现在我们想查一下rownum大于3的,照刚才的经验应该是

 

select * FROM EMP WHERE ROWNUM>3;

 

nothing here,这是因为rownum是一个伪列,他会对所查出来的数据排名,只有有了第一个,才会有第二个,所以我们需要把所有的数据取出来才能确认名次。
正确的写法如下:
SELECT * FROM (select ROWNUM AS r,emp.* FROM EMP) e WHERE e.r>3

select ROWNUM AS r,emp.* FROM EMP这句SQL首先将EMP表中所有的数据以及他们对应的ROWNUM取出来了,这时我们就可以从这里面判断哪些行是rownum大于3的了。

这样就可以实现模拟分页功能了,例如我们每次想查三条数据(pageSize),想要显示第二页(pageNumber),这样就是从[pageSize*(pageNumber-1)+1]到
(pageSize*pageNumber),也就是4~6条。SQL如下:
SELECT * FROM (select ROWNUM AS r,emp.* FROM EMP WHERE ROWNUM<=6) e WHERE e.r>=4

 

1.3从表中随即返回N条数据

我们可以使用bdms_random来对数据随机排列,然后再取三条查看一下

先这样写一条,并多次查询看看

SELECT ENAME,EMPNO FROM EMP WHERE ROWNUM<=3 ORDER BY dbms_random.value

 

 

 

可能大家发现了,每次取出来的都是这三条只不过是这三条的顺序不一样而已,那我们就需要改进。正确写法如下:
SELECT EMPNO,ENAME FROM (SELECT EMPNO,ENAME FROM EMP ORDER BY dbms_random.value) WHERE ROWNUM<4;

查询语句的执行顺序应为:

select最先
rownum次之
order by最后
也就是说先查询出全部,然后给全部的数据执行随机排列,最后取出排在最前面的三个。我们第一个写的相当于是,查出前三条数据,然后对三条数据进行随机排列,显然是不符合要求的。

1.4模糊查询

首先我们创建一个视图

CREATE OR REPLACE VIEW V2 AS
SELECT 'ABCDEF' AS vname from dual
UNION ALL
SELECT '_BCEFG' AS vname from dual
UNION ALL
SELECT '_BCEDF' AS vname from dual
UNION ALL
SELECT '_\BCEDF' AS vname from dual
UNION ALL
SELECT 'XYCEG' AS vname FROM dual;

查询视图中的所有内容
SELECT * from V2;

 

 


 1.查询出所有包含字符“CED”的

SELECT * FROM V2 WHERE VNAME LIKE '%CED%'

 

2.查询包含字符“_BCE”的,
SELECT * FROM V2 WHERE VNAME LIKE '%_BCE%'

 

       这时发现多了一个“ABCEDF”和“_\BCEDF”这时因为LIKE子句中有两个通配符“%”表示替代0个或多个字符,“_”表示替代一个字符。

在这里“_”被当做通配符了,我们可以使用转义字符。

SELECT * FROM V2 WHERE VNAME LIKE '%\_BCE%' ESCAPE '\'
escape把‘\’标识为转义符,‘\’把‘_’转义为普通字符。

那如果要查询包含_\BCEDF的呢(查询包含转义字符的内容)

只需双写转义字符即可:

SELECT * FROM V2 WHERE VNAME LIKE '%\_\\BCE%' ESCAPE '\'

 

双写处表示此处确实有'\'这个字符,不双写的依然作为转义字符。

对于“%”,跟“_”的处理方法是一样的。

posted @ 2018-11-13 21:54  大熊不清新  阅读(384)  评论(0编辑  收藏  举报