1. 程式人生 > >Oracle單表查詢(二)

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 '\'

 

雙寫處表示此處確實有'\'這個字元,不雙寫的依然作為轉義字元。

對於“%”,跟“_”的處理方法是一樣的。