Oracle入門基礎四(多表連線)

2021-08-26 11:55:00 字數 3683 閱讀 1739

– oracle自有連線語法: n張表連線,一定有n-1個連線條件

– 等值連線

– 非等值連線

– 外部連線

–笛卡爾積: 一般出現在預設連線條件 或 連線條件失效

select * from emp,dept;

--員工表15條資料 部門表4條資料 = 15*4 = 60

select * from emp,dept where emp.deptno = dept.deptno;

select emp.*,dept.* from emp,dept where emp.deptno = dept.deptno;

1.查詢所有員工編號,姓名,部門編號,工作地點

select empno,ename,deptno,loc from emp,dept where emp.deptno = dept.deptno;

--未明確定義的列

select emp.empno,emp.ename,emp.deptno,dept.loc from emp,dept where emp.deptno = dept.deptno

; --指定列名使用表名作為字首,效率高

–使用and運算子增加其它查詢條件

1.現在只想查詢工作地點在new york的員工編號,姓名,部門編號,工作地點

select * from emp,dept where emp.deptno = dept.deptno and lower(dept.loc)=lower('new york');
select * from emp,dept where emp.deptno = dept.deptno and dept.loc='new york';

--效率高:表與表之間先等值連線,且資料量多的表關聯條件優先寫

select * from emp,dept where dept.loc='new york'

and emp.deptno = dept.deptno;

--效率低

–使用表別名

select e.empno,e.ename,e.deptno,d.loc from emp e,dept d where e.deptno = d.deptno

;

–多表連線

select c.name, c.custid, o.custid, o.ordid, i.ordid, i.itemid

from customer c, ord o, item i

where c.custid = o.custid

and o.ordid = i.ordid

;

1.查詢員工姓名、薪資、薪資等級

select ename,sal,grade from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal;
1.查詢沒有雇員工作的部門

select * from emp e,dept d where e.deptno(+) = d.deptno;

--emp從表(增加萬能空行) dept主表(資料全部顯示)

2.查詢沒有部門的雇員

select * from emp e,dept d where e.deptno = d.deptno(+);

--dept從表(增加萬能空行) emp主表(資料全部顯示)

1.查詢每個員工的姓名和直接上級姓名

select e.empno 員工編號,e.ename 員工姓名,m.empno 經理編號,m.ename 經理姓名 from emp e,emp m where e.mgr = m.empno(+);
– sql99標準連線語法: n張表連線,一定有n-1個連線條件

– 交叉連線

– 自然連線

– using子句

–cross join 交叉連線:會產生笛卡爾積

select * from emp cross

join dept;

select * from emp,dept;

--同上

–natural join自然連線:自動匹配等值連線的列

– 1.自動匹配名稱相同,資料型別相同的列

– 2.等值連線列僅顯示一次

select * from emp natural

join dept;

select * from emp,dept where emp.deptno=dept.deptno;

--同上

–using子句

– 注意:

1.using子句中的列不能使用表名或表別名作為字首

2.using子句不能與natural join同時使用

select * from emp join dept using(deptno);
–on子句

select * from emp e join dept d on (e.deptno = d.deptno);
–on子句多表連線

select *

from emp e

join dept d on (e.deptno = d.deptno)

join emp m on (e.mgr = m.empno);

–left outer join 左外連線

select * from emp left

outer

join dept on (emp.deptno = dept.deptno);

--左邊emp為主表(顯示所有資料) 右邊dept為從表(增加萬能空行)

select * from emp,dept where emp.deptno = dept.deptno(+);

--同上 --emp為主表(顯示所有資料) dept為從表(增加萬能空行)

–right outer join 右外連線

select * from emp right

outer

join dept on (emp.deptno = dept.deptno);

--右邊dept為主表(顯示所有資料) 左邊emp為從表(增加萬能空行)

select * from emp,dept where emp.deptno(+) = dept.deptno;

--同上 --dept為主表(顯示所有資料) emp為從表(增加萬能空行)

–full outer join全外連線

select * from emp full

outer

join dept on (emp.deptno = dept.deptno);

--select * from emp,dept where emp.deptno(+) = dept.deptno(+);--錯誤 語法錯誤

四 多表連線

1 內連線 select from 副表 join 主表 on 副表.外來鍵 主表.主鍵 2 左連線 把左表的資料全部加上沒有對應的用null補齊 select from 副表 left join 主表 on 副表.外來鍵 主表.主鍵 3 右連線 把右表的資料全部加上沒有對應的用null補齊 sel...

Oracle 多表連線

oracle 多表連線 oracle優化器會自動選擇以下三種方式的一種執行表連線,但在資料環境上配合強化選擇合適的方式或強制使用某種方式是sql優化的需要 nested loop 對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一...

Oracle 多表連線

多表連線 第五章 1.select from emp 1.寫乙個查詢,顯示所有員工姓名,部門編號,部門名稱。select e.ename e.deptno d.dname from emp e,dept d where e.deptno d.deptno select e.ename e.deptn...