Oracle高階查詢
² 消除重複行
在Oracle查詢中結果中,可能出現若干行相同的情況,那麼可以使用DISTINCT消除重複行。具體的用法如示例:
程式碼演示:DISTINCT消除重複行
SQL> SELECT DISTINCT DEPTNO FROM EMP; DEPTNO ------ 30 20 10 |
² NULL操作
如果某條記錄中有缺少的資料值,就是空值(NULL值)。空值不等於0或者空格,空值是指未賦值、未知或不可用的值。任何資料型別的列都可以包括NULL值,除非該列被定義為非空或者主鍵。
程式碼演示:EMP中的NULL值
SQL> SELECT ENAME,JOB,SAL,COMM FROM EMP WHERE SAL<2000;
7 rows selected |
在查詢條件中NULL值用IS NULL作條件,非NULL值用NOT IS NULL做條件。
案例4:查詢EMP表中沒有發獎金的員工。
程式碼演示:NULL值查詢
SQL> SELECT ENAME,JOB,SAL,COMM FROM EMP 2 WHERE SAL<2000 AND COMM IS NULL;
|
² IN 操作
在Where子句中可以使用IN操作符來查詢其列值在指定的列表中的行。比如:查詢出工作職責是SALESMAN、PRESIDENT或者ANALYST的員工。條件有兩種表示方法:
1. WHERE job = 'SALESMAN ' OR job = 'PRESIDENT ' OR job = 'ANALYST '
2. WHERE job IN ('SALESMAN', 'PRESIDENT', 'ANALYST')
程式碼演示:IN操作
SQL> SELECT ENAME,JOB,SAL FROM EMP 2 WHERE job IN ('SALESMAN', 'PRESIDENT', 'ANALYST');
7 rows selected |
對應IN操作的還有NOT IN,用法一樣,結果相反。
² BETWEEN…AND…
在WHERE子句中,可以使用BETWEEN操作符來查詢列值包含在指定區間內的行。比如,查詢工資從1000到2000之間的員工。可以使用傳統方法:
WHERE SAL>=1000 AND SAL<=2000
也可以使用:
WHERE SAL BETWEEN 1000 AND 2000
BWTWEEN操作所指定的範圍也包括邊界。
程式碼演示:BETWEEN操作
SQL> SELECT ename,job,sal FROM EMP WHERE sal BETWEEN 1000 AND 2000;
6 rows selected |
² LIKE模糊查詢
在一些查詢時,可能把握不準需要查詢的確切值,比如百度搜索時輸入關鍵字即可查詢出相關的結果,這種查詢稱為模糊查詢。模糊查詢使用LIKE關鍵字通過字元匹配檢索出所需要的資料行。字元匹配操作可以使用萬用字元“%”和“_”:
Ø %:表示零個或者多個任意字元。
Ø _:代表一個任意字元。
語法是:LIKE '字串'[ESCAPE '字元']。匹配的字串中,ESCAPE[D12]後面的“字元”作為轉義字元。與一期SQLServer中ESCAPE用法相同。
萬用字元表示式 | 說明 |
'S%' | 以S開頭的字串。 |
'_S%' | 第二個字元時S的字串。 |
'%30\%%' escape '\' | 包含“30%”的字串,“\”指轉義字元,“\%”在字串中表示一個字元“%”。 |
表4 萬用字元示例
案例5:顯示員工名稱以J開頭以S結尾的員工的姓名、工資和工資。
程式碼演示:LIKE操作
SQL> SELECT ENAME,JOB,SAL FROM EMP WHERE ENAME LIKE 'J%S'; ENAME JOB SAL ---------- --------- --------- JONES MANAGER 2975.00 JAMES CLERK 950.00 |
² 集合運算
集合運算就是將兩個或者多個結果集組合成為一個結果集。集合運算包括:
Ø INTERSECT[D13](交集),返回兩個查詢共有的記錄。
Ø UNION ALL(並集),返回各個查詢的所有記錄,包括重複記錄。
Ø UNION(並集),返回各個查詢的所有記錄,不包括重複記錄。
Ø MINUS[D14](補集),返回第一個查詢檢索出的記錄減去第二個查詢檢索出的記錄之後剩餘的記錄。
當使用集合操作的時候,要注意:查詢所返回的列數以及列的型別必須匹配,列名可以不同。
案例6:查詢出dept表中哪個部門下沒有員工。只需求出dept表中的部門號和emp表中的部門號的補集即可。
程式碼演示:求補運算
SQL> SELECT DEPTNO FROM DEPT 2 MINUS 3 SELECT DEPTNO FROM EMP; DEPTNO ------ 40 |
前面學習過可以通過insert into …select把一個結果集插入到另一張結構相同的表中,因此可以使用union把若干條記錄一次性插入到一張表中。
程式碼演示:用union插入多條資料
SQL> INSERT INTO DEPT 2 SELECT 50,'公關部','臺灣' FROM DUAL 3 UNION 4 SELECT 60,'研發部','西安' FROM DUAL 5 UNION 6 SELECT 70,'培訓部','西安' FROM DUAL 7 / 3 rows inserted |
² 連線查詢
在SQL Server中已經學習過內聯接(inner join)、外聯接(outer join),外聯接又分為左外聯接(left outer join)和右外聯接(right outer join)。Oracle中對兩個表或者若干表之間的外聯接用(+)表示。
案例7:請查詢出工資大於2000元的,員工姓名,部門,工作,工資。
由於部門名稱在dept中,其他的資訊在emp表中,需要內聯接才能完成。
程式碼演示:內聯接
SQL> SELECT e.ENAME,e.JOB,e.SAL,d.DNAME 2 FROM emp e,dept d 3 WHERE e.deptno=d.deptno 4 AND e.SAL>2000;
6 rows selected |
也可以使用SQL/92標準中的內聯接:
程式碼演示:內聯接
SELECT e.ENAME,e.JOB,e.SAL,d.DNAME FROM EMP e INNER JOIN DEPT d ON e.DEPTNO=d.DEPTNO WHERE e.SAL>2000 |
這裡INNER JOIN中,關鍵字INNER可以省略。
案例8:請查詢出每個部門下的員工姓名,工資。
案例分析:
Emp表用外來鍵deptno引用Dept表中的deptno,在Dept表中如果有某些部門沒有員工,那麼用內聯接,沒有員工的部門將無法顯示,因此必須以Dept表為基準的外聯接。
程式碼演示:外聯接
SQL> SELECT e.ENAME,e.JOB,e.SAL,d.DNAME 2 FROM EMP e ,DEPT d 3 WHERE e.DEPTNO(+)=d.DEPTNO ① 4 /
18 rows selected |
程式碼解析:
① (+):Oracle專用的聯接符,在條件中出現在左邊指右外聯接,出現在右邊指左外聯接。
也可以使用SQL/92標準的寫法:
程式碼演示:外聯接
SELECT e.ENAME,e.JOB,e.SAL,d.DNAME FROM EMP e RIGHT OUTER JOIN DEPT d ON e.DEPTNO=d.DEPTNO |
這裡RIGHT OUTER JOIN中,關鍵字OUTER可以省略。
雖然Oracle自身的聯接查詢語法比較好寫,同時容易理解,但是為了程式便於移植,推薦使用SQL/92表中的聯接查詢。同時也可以與SQL Server獲得一致。 |