1. 程式人生 > >Oracle資料庫——限定查詢,範圍查詢,NULL判斷-02

Oracle資料庫——限定查詢,範圍查詢,NULL判斷-02

限定查詢

簡單查詢會將一張資料表之中的全部資料行進行返回,如果說現在表中的資料行過多,那麼肯定無法進行瀏覽,所以必須對顯示的資料行的返回做一個限定。
限定查詢的是在簡單查詢的基礎上增加若干個查詢的限定條件,所有的限定條件使用WHERE子句表示,此時
的語法如下


SELECT [DISTINCT] * | 列名稱 [別名],...  ==<確定資料顯示列
FROM 表名稱 [別名]
WHERE 限定條件(s);

此時給出的三個子句執行順序如下


第一步:執行FROM子句確定資料的來源
第二步:執行WHERE子句,對要顯示的資料進行條件過濾
第三步:執行SELECT子句,對要顯示的資料列進行控制

在使用WHERE子句的時候可以同時設定多個條件,而這多個條件主要就是通過邏輯運算連線,邏輯運算分為
以下三種


AND:表示與操作,所有的判斷條件全部返回true,才表示通過過濾,有一個false就不顯示
OR:表示或操作,若干個判斷條件之中有一個返回true,那麼最終的結果就是true.
NOT:表示取反操作,即true變為flase,flase變為true。

但是除了邏輯的連線條件之外,也可以使用以下的一些判斷符號,關係運算符,範圍運算,模糊查詢。

關係運算符
關係運算符主要以下的幾種符號表示:<,>,<=,>=,<>(!=).
範例:要求查詢出所有工資高於1500的僱員編號,姓名,職位,工資
工資高於1500意味著表示所有的資料行都顯示,需要執行過濾,使用“sal>1500”表示;
現在要求查詢的是部分欄位,所以要SELECT來控制顯示的資料列


SELECT empno,ename,job,sal
FROM emp
WHERE sal>1500;

範例:查詢smith的完整資訊
這個時候給出的smith是僱員的姓名,所以自然發出瞭如下的查詢


SELECT * FROM emp WHERE ename='smith';

發現這個時候並沒有任何的資料返回,因為Oracle資料庫之中的資料是區分大小寫的(命令不區分)
這個時候就必須修改字串的常量


SELECT * FROM emp WHERE ename='SMITH';

範例:查詢所有辦事員(CLERK)的資訊
現在一定要按照job欄位查


SELECT * FROM emp WHERE job='CLERK';

範例:查詢所有辦事員(CLERK)的資訊,同時要求工資大於1000
現在是設定兩個查詢條件,而且這兩個查詢條件應該同時滿足,使用AND連線


SELECT * FROM emp WHERE job='CLERK' AND sal>1000;

範例:查詢出所有銷售人員或工資大於等於3000的全部僱員資訊
所有的銷售人員通過job欄位執行過濾,工資使用sal欄位執行過濾,兩個條件的連線使用OR完成


SELECT *
FROM emp
WHERE job='SALESMAN' OR sal>=3000 ;

如果在整個查詢之中使用了NOT,那麼就表示取反
範例:結果取反


SELECT *
FROM emp
WHERE NOT(job='SALESMAN' OR sal>=3000) ;

邏輯運算只有AND和OR是進行連線的,NOT是針對於結果求反

範圍查詢:BETWEEN...AND

那麼試想一個問題,如果說現在要求查詢出工資在1500-3000之間的全部僱員資訊
範例:傳統思路實現


SELECT  *
FROM emp
WHERE sal>=1500 AND sal<=3000;

但是現在查詢的畢竟是一個範圍,既然是範圍,那麼就可以採用如下語法完成:


欄位 BETWEEN 最小值 AND 最大值 =<包含有最大值和最小值的相等驗證

範例:利用BETWEEN...AND完成


SELECT  *
FROM emp
WHERE sal BETWEEN 1500 AND 3000;

那麼BETWEEN...AND除了可以在數字型別的欄位三使用之外,也可以在字串(幾乎沒用)或者日期上使用。
範例:在字串使用BETWEEN ...AND(沒用)


SELECT *
FROM emp
WHERE ename BETWEEN 'KING' AND 'WARD';

範例:查詢所有在1981年僱傭的僱傭
現在如果要使用BETWEEN ...AND 必須確定兩個值:
開始值:1981-01-01 “01-1月-81”
結束值:1981-12-31  “31-12月-81”
emp表之中的hiredate欄位儲存的是僱傭日期,但是發現這個僱傭日期格式“08-9月-81”,日-月-年的表示
,如果日的位數不足2位,那麼就自動加上前導0,如果月不足2位不做任何的修飾


SELECT *
FROM emp
WHERE hiredate BETWEEN '01-1月-81' AND '31-12月-81' ;

這個時候就可以按照時間的範圍進行查詢,再加上日後的一些統計功能

範圍查詢:IN,NOT IN

那麼首先來考慮以下一種查詢:查詢僱員編號是7369,7566,7788,9999(不存在)的僱員,這個時候如果按照之前
的做法,查詢編寫如下
SELECT *
FROM emp
WHERE empno=7369 OR empno=7566 OR empno=7788 OR empno=9999;
但是這個時候說給的實際上就是查詢的範圍,如果是範圍的查詢,就可以換為IN完成
範例:使用IN查詢


SELECT *
FROM emp
WHERE empno IN(7369,7566,7788,9999);

範例:使用NOT IN查詢


SELECT *
FROM emp
WHERE empno NOT IN(7369,7566,7788,9999);
SELECT *
FROM emp
WHERE NOT empno  IN(7369,7566,7788,9999);

注意:關於IN和NOT IN在NULL的處理問題


如果在使用IN或NOT IN判斷範圍之中出現了NULL,那麼下面請觀察可能造成的問題
範例:使用IN出現NULL——沒有任何影響
SELECT *
FROM emp
WHERE empno IN(7369,7566,7788,null);
範例:使用NOT IN之中出現NULL——沒有任何的資料返回
SELECT *
FROM emp
WHERE empno NOT IN(7369,7566,7788,null);
在使用NOT IN判斷的過程之中,如果範圍裡面存在有NULL,那麼就表示不會有任何的資料返回

NULL判斷

NULL在資料庫原理之中表示的是一個不確定的內容。但是對於NULL的判斷不能夠直接使用關係進行操作。
範例:錯誤的判斷——查詢所有不領取佣金的僱員

SELECT * FROM emp WHERE comm=null;

對於NULL的判斷要使用特定的兩個符號完成:IS NULL(為空返回true),IS NOT NULL(非空返回true)
範例:查詢所有領取佣金的僱員——conn不位null


SELECT * FROM emp WHERE comm IS NOT NULL;
SELECT * FROM emp WHERE NOT comm IS NULL;

範例:查詢所有不領取佣金的僱員——conn位null


SELECT * FROM emp WHERE comm IS NULL;

NULL只能採用如上的方式完成