– 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...