1. 程式人生 > 其它 >Oracle筆記07——Oracle多表查詢

Oracle筆記07——Oracle多表查詢

一、笛卡爾積:第一個表中的所有列和第二個表中的所有行都發生連線
笛卡爾積產生條件:
①連線條件被省略
②連線條件是無效的
為了避免笛卡爾積的產生,通常需要在WHERE子句中包含一個有效的連線條件

--笛卡爾積:
SELECT * FROM emp,dept;

二、等值連線
1.N張表關聯,至少有N-1個關聯條件
2.可以使用AND運算子增加其它查詢條件(注意:先寫關聯語句再寫其它查詢條件,否則效率會降低)
3.使用表明作為字首,限制歧義列名,也可以提高查詢效率
4.多表查詢可以通過別名,選擇該表中的列

--等值連線
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno;
--等同於 SELECT emp.*, dept.* FROM emp,dept WHERE emp.deptno = dept.deptno; --三張表的連線 SELECT * FROM customer,ord,item WHERE customer.custid = ord.custid AND ord.ordid = item.ordid;--多表連結 SELECT * FROM customer c,ord o,item i WHERE c.custid = o.custid AND o.ordid = i.ordid;--使用表別名 --查詢工作地點在NEW YORK的員工編號,姓名,部門編號,工作地點
SELECT empno,ename,emp.deptno,loc FROM emp,dept WHERE emp.deptno = dept.deptno AND loc = 'NEW YORK';--效率高 SELECT empno,ename,emp.deptno,loc FROM emp,dept WHERE loc = 'NEW YORK' AND emp.deptno = dept.deptno ;--效率低 --限制歧義列名 SELECT emp.empno,emp.ename,emp.deptno,emp.loc FROM emp,dept WHERE emp.deptno =
dept.deptno AND dept.loc = 'NEW YORK';--效率高 SELECT empno,ename,emp.deptno,loc FROM emp,dept WHERE emp.deptno = dept.deptno AND loc = 'NEW YORK';--效率低

三、非等值連線
1.N張表關聯,至少有N-1個關聯條件
2.不使用等號書寫判斷語句

--非等值連線
--查詢每個員工的姓名,工資,工資等級
SELECT ename, sal, grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;

四、外部連線
在多表連線時,可以使用外部連線來檢視哪些行,按照連線條件沒有被匹配上
基本語法:
SELECT 表1.列名, 表2.列名 FROM 表1, 表2 WHERE 表1.列名(+) = 表2.列名;
或者
SELECT 表1.列名, 表2.列名 FROM 表1, 表2 WHERE 表1.列名 = 表2.列名(+);

--外部連線
--1.查詢所有的員工資訊,沒有僱員工作的部門(40)也要顯示出來
SELECT * FROM emp,dept WHERE emp.deptno(+) = dept.deptno;--emp表為從表 dept表為主表 (+)表示加上空行

--2.查詢所有的員工資訊,沒有部門的員工(打雜的)也要顯示出來
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno(+);--emp表為主表 dept表為從表 (+)表示加上空行

五、內部連線
自身連線,也叫自連線,是一個表通過某種條件和本身進行連線的一種方式,就如同多個表連線一樣

--內部連線
--查詢每個員工的姓名和直接上級姓名
SELECT e1.ename 員工姓名, e2.ename 直接上級姓名 FROM emp e1, emp e2 WHERE e1.mgr = e2.empno;

六、交叉連線
交叉連線會產生兩個表的交叉乘積,和兩個表之間笛卡爾積是一樣的
基本語法:
SELECT 表1.列名, 表2.列名, ... FROM 表1 CROSS JOIN 表2;

--交叉連線
SELECT * FROM emp CROSS JOIN dept;
--相當於
SELECT * FROM emp, dept;

七、自然連線
自然連線是對兩個表之間相同名字和資料型別的列進行的等值連線
基本語法:
SELECT 表1.列名, 表2.列名, ... FROM 表1 NATURAL JOIN 表2;
注意:如果兩個表之間相同名稱的列的資料型別不同,則會產生錯誤

--自然連線
SELECT * FROM emp NATURAL JOIN dept;

八、ON子句
如果要指定任意連線條件,或指定要連線的列,則可以用ON子句
用ON將連線條件和其它檢索條件分隔開,其它檢索條件寫在WHERE
基本語法:
SELECT 表1.列名, 表2.列名, ... FROM 表1 JOIN 表2 ON(條件);

--on子句
--1.查詢員工的員工資訊與部門資訊
SELECT * FROM emp JOIN dept ON emp.deptno = dept.deptno;--兩張表
--相當於
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno;

--2.查詢員工的員工資訊與部門資訊、以及經理資訊和薪資等級資訊
SELECT *
  FROM emp e
  JOIN dept d
    ON e.deptno = d.deptno
  JOIN emp m
    ON e.empno = m.mgr
  JOIN salgrade s
    ON e.sal BETWEEN s.losal AND s.hisal;--多張表

九、USING子句
①指定列名
②要求列名型別一致
③USING子句中的用到的列不能使用表明和別名作為字首
④NATRUAL JOIN子句和USING子句是相互排斥的,不能同時使用
基本語法:
SELECT 表1.列名, 表2.列名, ... FROM 表1 JOIN 表2 USING(兩表之間相同的列名);

SELECT * FROM emp JOIN dept USING(deptno);

十、左外連線
左外連線以左邊的表為主表,該表所有行資料按照連線條件無論是否與右邊表能匹配上,都會顯示出來
基本語法:
SELECT 表1.列名, 表2.列名, ... FROM 表1 LEFT OUTER JOIN 表2 ON(條件);

--左外連線
--將沒有部門的員工也顯示出來
SELECT * FROM emp LEFT JOIN dept ON emp.deptno = dept.deptno;--emp主表 dept從表
--相當於
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno(+);

十一、右外連線
右外連線以右邊的表為主表,該表所有行資料按照連線條件無論是否與左邊表能匹配上,都會顯示出來
基本語法:
SELECT 表1.列名, 表2.列名, ... FROM 表1 RIGHT OUTER JOIN 表2 ON(條件);

--右外連線
--將沒有員工的部門也顯示出來
SELECT * FROM emp RIGHT JOIN dept ON emp.deptno = dept.deptno;--dept主表 emp從表
--相當於
SELECT * FROM emp, dept WHERE emp.deptno(+) = dept.deptno;

十二、全外連線
全外連線返回兩個表等值連線結果,以及兩個表中所有等值連線失敗的記錄
基本語法:
SELECT 表1.列名, 表2.列名, ... FROM 表1 FULL OUTER JOIN 表2 ON(條件);

--全外連線
--將沒有部門的員工和沒有員工的部門顯示出來
SELECT * FROM emp FULL OUTER JOIN dept ON emp.deptno = dept.deptno;