1. 程式人生 > >SQL中的笛卡兒積問題和多表連接操作

SQL中的笛卡兒積問題和多表連接操作

標準 特殊 tab 就是 sql語句 兩個 clas 能夠 acl

(scott賬戶)

SELECT * FROM scott.dept;--4
SELECT * FROM scott.emp;--14

/**
笛卡爾積
內連接(等值連接)
外連接(非等值連接)
自連接
*/

--笛卡爾積
--當查詢數據時沒有使用連接條件,會查出所有關聯數據
--4*14=56
SELECT * FROM scott.dept,scott.emp;

--註意:多表連接查詢一定要帶關聯條件,否則就會出現笛卡爾積
--總結:多表連接第一步就是找關聯條件
--emp.deptno = dept.deptno
--student.clazz_id = clazz.id
--多表連接的關聯條件時N-1

--內連接(等值連接)
SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno
AND scott.emp.empno = ‘7369‘;

SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno;

--使用別名簡化開發
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno
AND e.empno = ‘7369‘;

SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno;

--篩選查詢的列
--查詢e表所有列 和 d表dname列,d表loc列
SELECT e.*, d.dname,d.loc
FROM scott.emp e,scott.dept d
WHERE d.deptno = e.deptno;

--內連接(等值連接) 標準sql的寫法
SELECT *
FROM scott.dept d INNER JOIN scott.emp e
ON d.deptno = e.deptno;

--相同的結果 from where語句
SELECT *
FROM scott.dept,scott.emp
WHERE scott.dept.deptno = scott.emp.deptno;

--外連接(非等值連接)
SELECT * FROM scott.dept;--4
SELECT * FROM scott.emp;--14

--查詢所有部門和員工信息
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno;

--因為部門40沒有員工,當使用等值連接時,部門40的信息沒有顯示
--左外連接:+號在右邊,左邊的數據要全部顯示,如果右邊沒有和左邊表數據匹配的,則補null
SELECT *
FROM scott.dept d,scott.emp e
WHERE d.deptno = e.deptno(+);

--右外連接:+號在左邊,右邊的數據要全部顯示,如果左邊沒有和右邊數據匹配的,則補null
SELECT *
FROM scott.dept d,scott.emp e
WHERE e.deptno(+) = d.deptno;

--註意:+號的外連接寫法只有Oracle支持

--標準sql語句
--左外連接
SELECT *
FROM scott.dept d LEFT OUTER JOIN scott.emp e
ON d.deptno = e.deptno;

--右外連接
SELECT *
FROM scott.emp e RIGHT OUTER JOIN scott.dept d
ON d.deptno = e.deptno;

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

--全外連接
--左邊的表和右邊的表數據都要全部顯示,如果沒有對應的,則補null
SELECT *
FROM scott.dept d FULL OUTER JOIN scott.emp e
ON d.deptno = e.deptno;

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

--自連接(重要,面試經常出現)
/**
在emp中的每一個員工都有自己的mgr(經理),並且每一個經理自身也是公司的員工,
經理自身也有自己的經理。下面我們需要將每一個員工自己的名字和經理的名字都找出來。
這時候我們該怎麽做呢?
*/
SELECT * FROM scott.emp;
--empno ename mgr mgrname
--7369 SMITH 7902 FORD
--empno ename mgr mgrname
--7902 FORD 7566 JONES

--多表連接
--最快備份一張表數據的方法,註意,該方法只是備份數據,不復制約束
CREATE TABLE tb_emp AS SELECT * FROM scott.emp;
SELECT * FROM tb_emp;
SELECT * FROM scott.emp;

--e的員工編號 e的員工姓名 e的經理編號 t的員工姓名
SELECT e.empno,e.ename,e.mgr,t.ename
FROM scott.emp e,scott.tb_emp t
WHERE e.mgr = t.empno
AND e.empno = ‘7369‘;

--自連接
SELECT e.empno,e.ename,e.mgr,t.ename
FROM scott.emp e,scott.emp t
WHERE e.mgr = t.empno
AND e.empno = ‘7369‘;

/**
自連接(self join)是SQL語句中經常要用到的連接方式,
使用自連接可以將自身表的一個鏡像當作另一個表來對待,
即將一張表看成多張表來做連接,從而能夠得到一些特殊的數據。
關鍵之處在於為同一個表指定兩個不同的別名。
這樣就能通過在一張表內尋找到相互關聯的數據再找到有繼承關系的數據。
*/

SQL中的笛卡兒積問題和多表連接操作