Oracle數據庫之七 多表查詢

7、多表查詢

​ 對於查詢在以前已經學過了簡單查詢、限定查詢、查詢排序,這些都屬於 SQL 的標準語句,而上一章的單行函數,主要功能是爲了彌補查詢的不足。sql

​ 而從多表查詢開始就正式進入到了複雜查詢部分。數據庫

7.一、基本語法

  • 多表查詢就是在一條查詢語句中,從多張表裏一塊兒取出所須要的數據。若是要想進行多表查詢,直接在 FROM 子句以後跟上多個表便可,語法以下:函數

    SELECT [DISTINCT] *|列名稱 [AS][列別名],列名稱 [AS][列別名],...
    FROM 表名稱1[表別名1],表名稱2[表別名2],...
    [WHERE 條件(s)]
    [ORDER BY 排序的字段1 ASC|DESC,排序的字段2 ASC|DESC,...];
  • 下面就將採用 emp 表和 dept 表一塊兒進行多表查詢,查詢以前多作一個步驟,先肯定 emp 和 dept 表中的數據量分別有多少,可使用 COUNT() 函數統計性能

範例:統計 emp 表中的數據量 (14 行記錄)學習

SELECT COUNT(*) 
FROM emp;

範例:統計 dept 表中的數據量 (4行記錄)spa

SELECT COUNT(*) 
FROM dept;

範例:如今查詢全部的僱員和部門的所有詳細信息code

SELECT COUNT(*) 
FROM emp,dept;
  • 發現此時結果一共返回了56行記錄,這就是笛卡爾積 形成的問題。如今就發現了,笛卡爾積的出現,可讓查詢結果變得很是的龐大,若是如今兩張表的數據量都很大,那麼這種龐大是很可怕的,因此如今必須想辦法消除掉笛卡爾積。
  • 通常而言,若是要想進行笛卡爾積的消除,每每會使用關聯字段,因爲多張表之間可能會存在重名的字段,因此進行重名字段的訪問的時候看,前面須要加上表名稱,採用 「 表名稱 字段 」 的方式來進行訪問。

範例:利用等值條件來處理笛卡爾積排序

SELECT * 
FROM emp,dept
WHERE emp.deptno = dept.deptno;
  • 這時的結果就能夠發現已經消除掉笛卡爾積,可是這時積依然存在,只是不顯示了而已
  • 已經清楚基本概念後,下面就能夠針對於數據量作一個分析。在 Oracle 中存在了一個 sh 用戶,固然此用戶保存在了 pdbmldn 插入式數據庫之中了
    • 一、打開 sqlplus :運行 - 輸入 sqlplus /nolog
    • 二、管理員鏈接數據庫:conn sys/change_on_install AS SYSDBA;
    • 三、切換到 pdbmldn 數據庫:ALTER SESSION SET CONTAINER=pdbmldn;
    • 四、打開 pdbmldn 數據庫:ALTER DATABASE pdbmldn OPEN
    • 立刻就要使用 sh 用戶進行操做,如今可使用 sh 用戶下的 sales 和 costs 表,這兩張表的數量都比較大。

範例:查看 sh.sales 表的數據量 (918843條記錄)開發

SELECT COUNT(*)
FROM sh.sales;

範例:查看 sh.costs 表的數據量 (82112條記錄)學習資料

SELECT COUNT(*)
FROM sh.costs;

範例:若是如今直接將這兩張表進行多表查詢,那麼來觀察問題

SELECT COUNT(*)
FROM sh.sales,sh.costs;
  • 一旦開始執行以後,那麼這個等待的過程會很長,可是這時是顯示全部數據量(包含笛卡爾積的數據量),然後再開始消除,利用等值關聯。最終會返回的數據量:75,448,036,416
  • 雖然消除掉了全部顯示的笛卡爾積,可是數據庫的原理機制及表示笛卡爾積會永遠存在
  • 多表查詢會產生笛卡爾積,因此性能較差,能夠利用等值關聯字段消除笛卡爾積

7.二、多表查詢實例

  • 雖然多表查詢自己存在了性能問題,但並不表示多表查詢沒法使用,須要一些更合理的作法來解決多表查詢問題

範例:查詢每一個僱員的編號、姓名、職位、基本工資、部門名稱、部門位置信息

  • 肯定所須要的數據表
    • emp 表:查詢每一個僱員的編號、姓名、職位、基本工資;
    • dept 表:部門名稱,部門位置。
  • 肯定已知的關聯字段
    • 部門與僱員關聯:emp.deptno = dept.deptno
  • 隨後還須要按照一個 SQL 語句的執行步驟編寫:FROM , WHERE , SELECT 。
SELECT emp.empno,emp.ename ,emp.job,emp.sal,dept.dname,dept.loc
FROM emp,dept
WHERE emp.deptno = dept.deptno
  • 可是在此處就會存在一個問題,上面程序裏都是採用了表名稱訪問的列名稱,若是如今表名稱很長:yuzhou_yinhexi_diqiu_yazhou_zhongguo_beijing 。因此每每在多表查詢的時候爲查詢的數據定義別名,而別名也是在 FROM 子句之中定義的,上面的程序能夠改寫爲:
SELECT e.empno, e.ename, e.job, e.sal, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno=d.deptno;
  • 在之後的程序編寫之中幾乎都會使用到別名

範例:查詢出每一個僱員的編號、姓名、僱傭日期、基本工資、工資等級

  • 肯定所須要的數據表
    • emp 表:查詢每一個僱員的編號、姓名、僱傭日期、基本工資;
    • salgrade 表:工資等級。
  • 肯定已知的關聯字段
    • 僱員和工資等級:emp.sal BETWEEN salgrade.local AND salgrade.hisal ;
SELECT e.empno, e.ename, e.hiredate, e.sal, s.grade
FROM emp e, salgrade s 
WHERE e.sal BETWEEN s.losal AND s.hisal;
  • 在以前的查詢裏面,發現只是顯示了數字1,2,3,4,5,如今但願能夠將其替換爲中文,若是要替換,確定使用 DECODE() 函數。

範例:爲了更加清楚的顯示出工資等級的信息,如今但願能夠按以下格式進行替換顯示:

​ grade = 1 : 顯示爲 「 E等工資 」

​ grade = 2 : 顯示爲 「 D等工資 」

​ grade = 3 : 顯示爲 「 C等工資 」

​ grade = 4 : 顯示爲 「 B等工資 」

​ grade = 5 : 顯示爲 「 A等工資 」

SELECT e.empno, e.ename, e.hiredate, e.sal,
	DECODE(s.grade,1,'E等工資',2,'D等工資',3,'C等工資',4,'B等工資',5,'A等工資') grade
FROM emp e, salgrade s 
WHERE e.sal BETWEEN s.losal AND s.hisal;
  • 前面講的都是針對於兩張表進行多表查詢,並且多表查詢裏面都只使用了一個條件來消除笛卡爾積;若是如今是多個消除笛卡爾積的條件,那麼每每使用 AND 將這些條件鏈接在一塊兒

範例:查詢出每一個僱員的姓名、職位、基本工資、部門名稱、工資等級

  • 肯定所須要的數據表
    • emp 表:每一個僱員的姓名、職位、基本工資;
    • dept 表:部門名稱
    • salgrade 表:工資等級。
  • 肯定已知的關聯字段
    • 僱員和部門:emp.deptno = dept.deptno
    • 僱員和工資等級:emp.sal BETWEEN salgrade.local AND salgrade.hisal ;
SELECT e.ename, e.job, e.sal, d.dname,
	DECODE(s.grade,1,'E等工資',2,'D等工資',3,'C等工資',4,'B等工資',5,'A等工資') grade
FROM emp e, dept d, salgrade s 
WHERE e.deptno = d.deptno AND e.sal BETWEEN s.losal AND s.hisal;
  • 多表查詢之中,每當增長一個關聯表都須要設置消除笛卡爾積的條件

7.三、表的鏈接操做

  • 對於數據表的鏈接操做在數據庫中一共定義了兩種:
    • 內鏈接:也稱爲等值鏈接(或稱爲鏈接,還能夠被稱爲普通鏈接或者天然鏈接),是最先的一種鏈接方式,內鏈接是從結果表中刪除與其餘被鏈接表中沒有匹配行的全部元組,因此當匹配條件不知足時內鏈接可能會丟失信息。在以前所使用的鏈接方式都屬於內鏈接,而在 WHERE 子句之中設置的消除笛卡爾積的條件就是採用了等值判斷的方式進行的。
    • 外鏈接:內鏈接中只可以顯示等值知足的條件,若是不知足的條件則沒法顯示,若是如今但願特定表中的數據能夠所有顯示,就利用外鏈接,外鏈接分爲三種:左外鏈接(簡稱:左鏈接)、右外鏈接(簡稱:右鏈接)、全外鏈接(簡稱:全鏈接,在 SQL :1999 語法部分講解)
  • 在以前所編寫的錶鏈接操做都屬於內鏈接的定義範疇
  • 爲了更好的觀察各個鏈接方式的區別,首先須要在 emp 表中增長一條數據,這個增長語法會在後面解釋
INSERT INTO emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) 
	VALUES(8888,'李華華','CLERK',7369,SYSDATE,800,100,null);
  • 這時增長完的數據是一個沒有部門的僱員,即此僱員的部門編號是 null ,增長完成以後查看一下 emp 表中當前的所有數據
SELECT * FROM emp;
  • 此處沒有部門編號,下面就演示等值鏈接所帶來的效果

範例:使用等值鏈接

SELECT *
FROM emp e, dept d
WHERE e.deptno = d.deptno;
  • 經過此時的結果能夠發現兩個問題:
    • 問題一:沒有部門的僱員沒有顯示
    • 問題二:有一個40部門沒有顯示
  • 因此如今就能夠發現,使用內鏈接只有知足鏈接條件的數據纔會所有顯示。但是若是說如今但願 emp 或是 dept 表中的數據顯示完整,就能夠利用外鏈接進行。
  • 外鏈接如今主要使用兩種:
    • 左外鏈接:左關係屬性 = 右關係屬性(+) ,+ 放在了等號的右邊,表示左鏈接;
    • 右外鏈接:左關係屬性(+) = 右關係屬性 ,+ 放在了等號的左邊,表示右鏈接。

範例:使用左外鏈接,顯示僱員編號是8888的信息

SELECT *
FROM emp e, dept d 
WHERE e.deptno = d.deptno(+);

範例:使用右外鏈接,顯示部門編號爲40的信息

SELECT *
FROM emp e, dept d 
WHERE e.deptno(+) = d.deptno;
  • 上面結果中由於40部門沒有僱員,因此全部的僱員信息都爲 null 。
  • 我的總結:使用外鏈接的環境,若是所須要的數據信息沒有顯示出來,那麼就使用外鏈接,而具體是左外仍是右外,我的認爲不必去記,去試就行!

7.四、自身關聯

  • 在 emp 表中存在有一個 mgr 字段,這個字段表示的是僱員的領導
SELECT * FROM emp;
  • 如今若是要顯示僱員的領導信息,那麼確定利用僱員表和僱員表本身的鏈接操做完成。利用僱員表中的領導編號,找到對應此編號的僱員信息。

範例:查詢出每一個僱員的編號、姓名及其上級領導的編號、姓名

  • 肯定所須要的數據表
    • emp 表:僱員的編號、姓名
    • emp 表:找到領導的編號、姓名
  • 肯定已知的關聯字段
    • 僱員和領導:emp.mgr = memp.empno (僱員的領導編號 = 領導的信息)
  • 步驟一:直接進行自身鏈接的操做
SELECT e.empno eno, e.ename ename, m.empno mno, m.ename mname
FROM emp e, emp m 
WHERE e.mgr = m.empno;

​ 如今表中一共有15條記錄,可是隻有14條的記錄顯示,等值鏈接在沒有條件知足的時候,是不可能有數據顯示的。

​ 在 emp 表中 king 這個僱員是沒有領導的,這個時候就必須考慮外鏈接。

  • 步驟二:使用左外鏈接
SELECT e.empno eno, e.ename ename, m.empno mno, m.ename mname
FROM emp e, emp m 
WHERE e.mgr = m.empno(+);

​ 對於沒有領導信息的僱員,對應的領導信息,所有使用 null 進行表示

範例:查詢出在1981年僱員的所有僱員的編號、姓名、僱傭日期(按照年-月-日顯示)、工做、領導姓名、僱員月工資、僱員年工資(基本工資+獎金)、僱員工資等級、部門編號、部門名稱、部門位置、而且要求這些僱員的月基本工資在1500~3500之間,將最後的結果按照年工資的降序排列,若是年工資相等,則按工做進行排序

  • 肯定所須要的數據表
    • emp 表:編號、姓名、僱傭日期、工做、月工資、計算年工資;
    • emp 表:領導姓名;
    • dept 表:部門編號、名稱、位置;
    • salgrade 表:工資等級。
  • 肯定已知的關聯字段
    • 僱員和領導:emp.mgr = memp.empno;
    • 僱員和部門:emp.deptno = dept.deptno;
    • 僱員和工資等級:emp.sal BETWEEN salgrade.losal AND salgrade.hisal .
  • 步驟一:查詢出全部在1981年僱傭的僱員編號、姓名、僱傭日期、工做、月工資、年工資、而且月薪在1500~3500之間。只須要 emp 單張表便可實現。
SELECT e.empno, e.ename, e.hiredate, e.sal, (e.sal+NVL(e.comm,0))*12 income
FROM emp e 
WHERE TO_CHAR(e.hiredate,'yyyy') = '1981' AND e.sal BETWEEN 1500 AND 3500;
  • 步驟二:加入領導信息,使用自身關聯
SELECT e.empno, e.ename, e.hiredate, e.job, e.sal, (e.sal+NVL(e.comm,0))*12 income,
	m.ename mname
FROM emp e, emp m 
WHERE TO_CHAR(e.hiredate,'yyyy') = '1981' AND e.sal BETWEEN 1500 AND 3500
	AND e.mgr = m.empno(+);
  • 步驟三:加入部門信息
SELECT e.empno, e.ename, e.hiredate, e.job, e.sal, (e.sal+NVL(e.comm,0))*12 income,
	m.ename mname, d.deptno dno, d.dname dname, d.loc 
FROM emp e, emp m, dept d  
WHERE TO_CHAR(e.hiredate,'yyyy') = '1981' AND e.sal BETWEEN 1500 AND 3500
	AND e.mgr = m.empno(+)
	AND e.deptno = d.deptno;
  • 步驟四:查詢出工資等級
SELECT e.empno, e.ename, e.hiredate, e.job, e.sal, (e.sal+NVL(e.comm,0))*12 income,
	m.ename mname, d.deptno dno, d.dname dname, d.loc, s.grade
FROM emp e, emp m, dept d,salgrade s   
WHERE TO_CHAR(e.hiredate,'yyyy') = '1981' AND e.sal BETWEEN 1500 AND 3500
	AND e.mgr = m.empno(+)
	AND e.deptno = d.deptno
	AND e.sal BETWEEN s.losal AND s.hisal;
SELECT e.empno, e.ename, e.hiredate, e.job, e.sal, (e.sal+NVL(e.comm,0))*12 income,
	m.ename mname, d.deptno dno, d.dname dname, d.loc, s.grade,
	DECODE(s.grade,1,'E等工資',2,'D等工資',3,'C等工資',4,'B等工資',5,'A等工資') 工資等級
FROM emp e, emp m, dept d,salgrade s   
WHERE TO_CHAR(e.hiredate,'yyyy') = '1981' AND e.sal BETWEEN 1500 AND 3500
	AND e.mgr = m.empno(+)
	AND e.deptno = d.deptno
	AND e.sal BETWEEN s.losal AND s.hisal;
  • 步驟五:進行排序,因爲 SELECT 是在 ORDER BY 子句以前執行,因此在 SELECT 子句之中所定義的別名,ORDER BY 子句是能夠直接使用的。
SELECT e.empno, e.ename, e.hiredate, e.job, e.sal, (e.sal+NVL(e.comm,0))*12 income,
	m.ename mname, d.deptno dno, d.dname dname, d.loc, s.grade,
	DECODE(s.grade,1,'E等工資',2,'D等工資',3,'C等工資',4,'B等工資',5,'A等工資') 工資等級
FROM emp e, emp m, dept d,salgrade s   
WHERE TO_CHAR(e.hiredate,'yyyy') = '1981' AND e.sal BETWEEN 1500 AND 3500
	AND e.mgr = m.empno(+)
	AND e.deptno = d.deptno
	AND e.sal BETWEEN s.losal AND s.hisal;
ORDER BY income DESC, e.job;
  • 經過這一稍微複雜點的題目,能夠發現,全部的分析必需要分步進行,並且這些分析過程,須要大量的練習才能夠鞏固。
  • 自身關聯屬於一張表本身關聯本身的狀況,此時依然會產生笛卡爾積。

7.五、SQL:1999 語法的支持

  • 在以前使用的 「 (+) 」 標記只適合在 Oracle 數據庫之中應用,若是是其餘的數據庫,是沒法使用的
  • SQL:1999 語法
SELECT [DISTINCT] *|列名稱 [AS][列別名],列名稱 [AS][列別名],...
FROM 表1 表別名1 [CROSS JOIN 表2 表別名2]|
[NATURAL JOIN 表2 表別名2]|
[JOIN 表2 USING(關聯列名稱)]|
[JOIN 表2 ON(關聯條件)]|
[LEFT|RIGHT|FULL OUTER JOIN 表2 ON(關聯條件)]
[WHERE 條件(s)]
[ORDER BY 排序的字段1 ASC|DESC, 排序的字段2 ASC|DESC,...];
  • 實際上以上給出的是綜合語法,下面將拆分進行講解

7.5.1 交叉鏈接

  • 交叉鏈接(CROSS JOIN)做用於兩個關係上,而且第一個關係的每一個元組與第二個關係的全部元組進行鏈接,這樣的操做形式與笛卡爾積是徹底相同的,交叉鏈接的語法以下所示:
SELECT [DISTINCT] *|列名稱 [AS][列別名],列名稱 [AS][列別名],...
FROM 表1 表別名1 [CROSS JOIN 表2 表別名2]|
[WHERE 條件(s)]
[ORDER BY 排序的字段1 ASC|DESC, 排序的字段2 ASC|DESC,...];
  • 交叉鏈接的主要功能就是產生笛卡爾積

範例:使用交叉鏈接查詢信息

SELECT * 
FROM emp CROSS JOIN dept;
  • 通常而言,在進行多表鏈接的時候都必定會存在關聯字段以消除笛卡爾積,而關聯字段的名稱通常都會同樣,若是不同,也會有部分相同,如今討論的是同樣的狀況,例如 deptno 字段這就表示同樣,就能夠利用天然鏈接來消除掉笛卡爾積

7.5.2 天然鏈接

  • 天然鏈接(NATURAL JOIN)運算做用於兩個關係,最終會經過兩個關係產生出一個關係做爲結果。與交叉鏈接(笛卡爾積)不一樣的是,天然鏈接只考慮那些在兩個關係模式中都出現的屬性上取值相同的元組對。天然鏈接的操做語法以下:
SELECT [DISTINCT] *|列名稱 [AS][列別名],列名稱 [AS][列別名],...
FROM 表1 表別名1 [NATURAL JOIN 表2 表別名2]|
[WHERE 條件(s)]
[ORDER BY 排序的字段1 ASC|DESC, 排序的字段2 ASC|DESC,...];

範例:使用天然鏈接查詢信息

SELECT * 
FROM emp NATURAL JOIN dept;
  • 這個時候會把鏈接的字段放在第一列上進行顯示,並且這種方式就是一種內鏈接的方式。

7.5.3 USING 子句

  • 經過天然鏈接能夠直接使用關聯字段消除掉笛卡爾積,那麼若是如今的兩張表中沒有存在這種關聯字段的話,就能夠經過 USING 子句完成笛卡爾積的消除,USING 子句的語法以下:
SELECT [DISTINCT] *|列名稱 [AS][列別名],列名稱 [AS][列別名],...
FROM 表1 表別名1 [JOIN 表2 USING(關聯列名稱)]|
[WHERE 條件(s)]
[ORDER BY 排序的字段1 ASC|DESC, 排序的字段2 ASC|DESC,...];

範例:使用 USING 子句查詢信息

SELECT * 
FROM emp JOIN dept USING(deptno);

7.5.4 ON 子句

  • 在以前編寫等值鏈接時,採用了關聯字段進行笛卡爾積的消除,那麼用戶在 SQL:1999 語法之中經過 ON 子句就能夠由用戶手工設置一個關聯條件,ON 子句語法以下:
SELECT [DISTINCT] *|列名稱 [AS][列別名],列名稱 [AS][列別名],...
FROM 表1 表別名1 [JOIN 表2 ON(關聯條件)]|
[WHERE 條件(s)]
[ORDER BY 排序的字段1 ASC|DESC, 排序的字段2 ASC|DESC,...];
  • USING 是設置鏈接字段,而 ON 是設置鏈接條件

範例:使用 ON 子句查詢信息

SELECT * 
FROM emp e JOIN salgrade s ON(e.sal BETWEEN s.losal AND s.hisal);

7.5.5 外鏈接

  • 在數據的查詢操做中數據的外鏈接一共分爲三種形式:左外鏈接、右外鏈接、全外鏈接,而此時鏈接的語法以下:
SELECT [DISTINCT] *|列名稱 [AS][列別名],列名稱 [AS][列別名],...
FROM 表1 表別名1 [LEFT|RIGHT|FULL OUTER JOIN 表2 ON(關聯條件)]
[WHERE 條件(s)]
[ORDER BY 排序的字段1 ASC|DESC, 排序的字段2 ASC|DESC,...];
  • 對於外鏈接,在以前使用的是 「 (+) 」,這個標記只可以實現左外或者右外鏈接,可是對於全外鏈接沒法使用,而全外鏈接只可以依靠 SQL:1999 語法之中規定的內容。

範例:實現右外鏈接

SELECT * 
FROM emp e RIGHT OUTER JOIN dept d ON (e.deptno = d.deptno);

範例: 實現左外鏈接

SELECT * 
FROM emp e LEFT OUTER JOIN dept d ON (e.deptno = d.deptno);

範例:實現全外鏈接

SELECT * 
FROM emp e FULL OUTER JOIN dept d ON (e.deptno = d.deptno);
  • 經過以上的分析能夠發現,給出的全部語法裏面,只有全外鏈接只可以經過 SQL:1999 語法實現,可是對於這種全外鏈接,使用的狀況並很少。
  • 並且我的建議,若是使用的是 Oracle 數據庫,就使用 「 (+) 」 標記控制左右鏈接,不使用它實現內鏈接。

7.六、數據的集合運算

  • 數據的集合操做指的是查詢結果的操做
  • 集合運算是一種二目運算符,一共包括四種運算符:並、差、交、笛卡爾積,其中對於笛卡爾積在以前已經演示過了,因此本次主要是看 並、交、差 三種操做。操做集合的語法以下
查詢語句
	[UNION | UNION ALL | INTERSECT | MINUS]
查詢語句
	...
  • 要實現集合的運算,主要使用四種運算符:
    • UNION (並集):返回若干個查詢結果的所有內容,可是重複元組不顯示;
    • UNION ALL (並集):返回若干個查詢結果的所有內容,重複元組也會顯示;
    • MINUS (差集):返回若干個查詢結果中的不一樣部分
    • INTERSECT (交集):返回若干個查詢結果中的相同部分

7.6.1 並集操做

  • 並集操做是將多個查詢的結果鏈接到一塊兒,而對於並操做提供了兩種操做符:UNION(不顯示重複),UNION ALL(顯示重複)

範例:並集操做:UNION , UNION ALL

  • 第一個查詢
SELECT * FROM dept;
  • 第二個查詢
SELECT * FROM dept WHERE deptno = 10;

​ 這個時候兩個查詢結果返回的列的結構相同。

  • 使用 UNION
SELECT * FROM dept
	UNION
SELECT * FROM dept WHERE deptno = 10;

​ 第一個查詢已經包含了第二個查詢的內容,因此重複數據不顯示了。

範例:使用 UNION ALL 顯示所有

SELECT * FROM dept
	UNION ALL
SELECT * FROM dept WHERE deptno = 10;
  • **提示:**在之後進行查詢操做編寫過程當中,建議儘可能使用UNION 或 UNION ALL 來代替 OR

範例:查詢全部銷售人員和辦事人員的信息

  • 實現一:
SELECT * FROM emp WHERE job = 'SALESMAN' OR job = 'CLERK';
  • 實現二:
SELECT * FROM emp WHERE job IN ('SALESMAN', 'CLERK');
  • 實現三:
SELECT * FROM emp WHERE job = 'SALESMAN'
	UNION
SELECT * FROM emp WHERE job = 'CLERK'

7.6.2 差集操做

範例:使用 MINUS 執行差集操做

SELECT * FROM dept
	MINUS
SELECT * FROM dept WHERE deptno = 10;
  • 結果就顯示3行,deptno=10 的不顯示了

7.6.3 交集操做

範例:使用 INTERSECT 執行交集操做

SELECT * FROM dept
	INTERSECT
SELECT * FROM dept WHERE deptno = 10;
  • 結果只顯示 deptno=10 一行了
  • 集合操做時,各個查詢語句返回的結構要求一致。

說明:本學習資料是根據李興華的Oracle開發實戰經典整理

相關文章
相關標籤/搜索