1. 程式人生 > >Oracle高階查詢

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;

ENAME

JOB

SAL

COMM

SMITH

CLERK

800

ALLEN

SALESMAN

1600

300

WARD

SALESMAN

1250

500

MARTIN

SALESMAN

1250

1400

TURNER

SALESMAN

1500

0

ADAMS

CLERK

1100

JAMES

CLERK

950

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;

 ENAME

JOB

SAL

COMM

SMITH

CLERK

800

ADAMS

CLERK

1100

JAMES

CLERK

950

MILLER

CLERK

1300

²  IN 操作

Where子句中可以使用IN操作符來查詢其列值在指定的列表中的行。比如:查詢出工作職責是SALESMANPRESIDENT或者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');

ENAME

JOB

SAL

ALLEN

SALESMAN

1600

WARD

SALESMAN

1250

MARTIN

SALESMAN

1250

SCOTT

ANALYST

3000

KING

PRESIDENT

5000

TURNER

SALESMAN

1500

FORD

ANALYST

3000

7 rows selected

對應IN操作的還有NOT IN,用法一樣,結果相反。

²  BETWEEN…AND…

WHERE子句中,可以使用BETWEEN操作符來查詢列值包含在指定區間內的行。比如,查詢工資從10002000之間的員工。可以使用傳統方法:

         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;

ENAME

JOB

SAL

ALLEN

SALESMAN

1600

WARD

SALESMAN

1250

MARTIN

SALESMAN

1250

TURNER

SALESMAN

1500

ADAMS

CLERK

1100

MILLER

CLERK

1300

6 rows selected

²  LIKE模糊查詢

在一些查詢時,可能把握不準需要查詢的確切值,比如百度搜索時輸入關鍵字即可查詢出相關的結果,這種查詢稱為模糊查詢。模糊查詢使用LIKE關鍵字通過字元匹配檢索出所需要的資料行。字元匹配操作可以使用萬用字元“%”和“_:

Ø  %:表示零個或者多個任意字元。

Ø  _:代表一個任意字元。

語法是:LIKE '字串'[ESCAPE '字元']。匹配的字串中,ESCAPE[D12]後面的“字元”作為轉義字元。與一期SQLServerESCAPE用法相同。

萬用字元表示式

說明

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

ENAME

JOB

SAL

DNAME

JONES

MANAGER

2975

RESEARCH

BLAKE

MANAGER

2850

SALES

CLARK

MANAGER

2450

ACCOUNTING

SCOTT

ANALYST

3000

RESEARCH

KING

PRESIDENT

5000

ACCOUNTING

FORD

ANALYST

3000

RESEARCH

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  /

ENAME

JOB

SAL

DNAME

SMITH

CLERK

800

RESEARCH

ALLEN

SALESMAN

1600

SALES

WARD

SALESMAN

1250

SALES

JONES

MANAGER

2975

RESEARCH

MARTIN

SALESMAN

1250

SALES

BLAKE

MANAGER

2850

SALES

CLARK

MANAGER

2450

ACCOUNTING

SCOTT

ANALYST

3000

RESEARCH

KING

PRESIDENT

5000

ACCOUNTING

TURNER

SALESMAN

1500

SALES

ADAMS

CLERK

1100

RESEARCH

JAMES

CLERK

950

SALES

FORD

ANALYST

3000

RESEARCH

MILLER

CLERK

1300

ACCOUNTING

公關部

研發部

培訓部

OPERATIONS

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獲得一致。