講外連線之前,先舉例介紹內連線,也就是一般的相等連線。
select * from a, b where a.id = b.id;
對於外連線,oracle中可以使用「(+)」來表示,9i可以使用left/right/full outer join,下面將配合例項一一介紹。
1. left outer join:左外關聯
select e.last_name, e.department_id, d.department_namefrom employees e
left outer join departments d
on (e.department_id = d.department_id);
等價於
select e.last_name, e.department_id, d.department_namefrom employees e, departments d
where e.department_id=d.department_id(+);
結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄。
2. right outer join:右外關聯
select e.last_name, e.department_id, d.department_namefrom employees e
right outer join departments d
on (e.department_id = d.department_id);
等價於
select e.last_name, e.department_id, d.department_namefrom employees e, departments d
where e.department_id(+)=d.department_id;
結果為:所有員工及對應部門的記錄,包括沒有任何員工的部門記錄。
3. full outer join:全外關聯
select e.last_name, e.department_id, d.department_namefrom employees e
full outer join departments d
on (e.department_id = d.department_id);
結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄和沒有任何員工的部門記錄。
其實啊 :外連線就是查兩張表 左連線就是左邊的表全有值,右邊表的值可以為空(+)
右連線是左邊錶值可以為空(+) 右邊表的值全有
全連線是左連線和右連線的並集 好像是這個符號(u)
內連線是左連線和右連線的交集 。。。
其餘連線方式:
cross join: 交叉連線,查出的表的笛卡爾積 eg: select * from a cross join b (a表有m行,b表有n行,結果是m*n行)。
左連線
a.id=b.id(+) ===> a表內容全部顯示,以左邊的表為基準
left join : left join 左邊的表全部顯示,以左邊的表為基準;
select * from emp e left join dept d on e.deptno=d.deptno;
右連線 a.id(+)=b.id ===> b表內容全部顯示,以右表的表為基準。
right join: right join 右邊的表全部顯示,以右邊的表為基準
select * from emp e right join dept d on e.deptno=d.deptno;
right join ,left join 沒有 where from 語句等。
注:+號在=號左邊叫右連線,+號在=右邊叫做左連線。
自然連線:natural join
自然連線,natural join 會根據列明,自動建立連線,省略where語句,避免笛卡爾積的出現
eg: select empno,ename,sal,deptno,loc from emp natural join dept;
using :表示與指定的列相關聯。
eg: select e.ename,e.sal,deptno,d.loc from emp e join dept d using (deptno) where deptno=20;
注:被using 子句所引用的列,在sql 語句中的任何地方不能使用表名或者別名作為字首。
ps :做外連線的時候,where 條件中不可以加從表的條件,需將從表做個子查詢,做成另外乙個表。
eg :select t.acctype, nvl(b.name,t.acctype) as name
from biacciccardmaptb t, dictcodesettb b
where b.category = '賬戶型別'
and t.acctype=b.code(+)
and t.iccardno = '1000751090001385' this is wrong
should :
select t.acctype, nvl(b.name,t.acctype) as name
from biacciccardmaptb t, (select * from dictcodesettb where category = '賬戶型別' )b
where
t.acctype=b.code(+)
and t.iccardno = '1000751090001385'
Oracle 外連線查詢
注意 外連線,既能查詢出符合條件的記錄,也能根據一方強行將另一方查詢出來。注意 在oracle中,將 出現在 號右邊,稱為左外連線 將 出現在 號左邊,稱為右外連線 左外或右外,本質上是一樣的,只是 的位置不一樣,且 只能出現一次,以上語法是oracle專用語法。例1 按部門10,20,30,40號...
oracle連線查詢 內連線 外連線 全連線
oracle 中的連線可分為,內連線 inner join 外連線 outer join 全連線 full join 不光是oracle 其他很多的資料庫也都有這3 種連線查詢方式 內連線inner join 這是我們經常用的查詢方式,比如select from a,b where a.field1...
Oracle外連線查詢資料不全
plsql中寫好的外連線,條件什麼的都沒問題,但是查詢出來的結果只有左右完全匹配上的記錄,主表有而從表沒有的記錄都不顯示,也就是說,主表記錄顯示不全!這個,把從表的篩選條件,放到on子句中而不是where子句中。select k.spbh,sum c.jssl as 銷售,sum k.kcsl as...