Oracle 多表連線

2021-08-04 21:40:55 字數 4944 閱讀 1600

多表連線

--第五章 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.deptno ,d.dname

from emp e

inner join dept d on e.deptno = d.deptno;

2.寫乙個查詢,顯示所有工作在chicago並且獎金不為空的員工姓名,工作地點,獎金

select emp.ename,dept.loc,emp.comm

from emp , dept

where emp.comm <> 0 and dept.deptno=emp.deptno;

select emp.ename,dept.loc,emp.comm

from emp join dept on dept.deptno=emp.deptno

where emp.comm <> 0;

3.寫乙個查詢,顯示所有姓名中含有a字元的員工姓名,工作地點。

select emp.ename,dept.loc

from emp join dept on dept.deptno=emp.deptno

where emp.ename like '%a%';

練習21.查詢每個員工的編號,姓名,工資,工資等級,所在工作城市,按照工資等級進行公升序排序。

--工資登記表:salgrade

select * from salgrade;

select e.empno,e.ename, e.sal,s.grade,d.loc

from emp e,dept d,salgrade s

where e.deptno = d.deptno

and sal between s.losal and s.hisal

order by s.grade asc;

select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.loc

from emp join dept on dept.deptno=emp.deptno,salgrade

order by salgrade.grade asc;

練習31.查詢所有工作在new york和chicago的員工姓名,員工編號,以及他們的經理姓名,經理編號。

select e1.ename 員工姓名 ,e1.empno 員工編號,e2.ename 經理姓名,e1.mgr 經理編號,d.loc 工作地點

from emp e1 ,emp e2,dept d

where e1.mgr = e2.empno

and e1.deptno = d.deptno

and d.loc in ('new york','chicago');

2.第上一題的基礎上,新增沒有經理的員工king,並按照員工編號排序。

select e1.ename 員工姓名 ,e1.empno 員工編號,e2.ename 經理姓名,e1.mgr 經理編號,d.loc 工作地點

from emp e1 left join emp e2 on e1.mgr = e2.empno ,dept d

where

e1.deptno = d.deptno

and d.loc in ('new york','chicago')

order by 2 asc;

select e1.ename 員工姓名 ,e1.empno 員工編號,e2.ename 經理姓名,e1.mgr 經理編號,d.loc 工作地點

from emp e1 ,emp e2,dept d

where e1.mgr = e2.empno(+)

and e1.deptno = d.deptno

and d.loc in ('new york','chicago')

order by 2 asc;

3.查詢所有員工編號,姓名,部門名稱,包括沒有員工的部門也要顯示出來。

select e.empno,e.ename,d.dname 部門名稱

from emp e , dept d

where e.deptno(+) = d.deptno ;

select e.empno,e.ename,d.deptno

from emp e

full outer join dept d

on e.deptno=d.deptno;

練習4• 1.建立個員工表和部門表的交叉連線

select emp.empno,emp.ename,dept.dname from emp ,dept;

select emp.empno,emp.ename,dept.dname from emp cross join dept;

• 2.使用自然連線,顯示入職日期在80年5月1日之後的員工姓名,部門名稱,入職日期

select e.ename,d.dname,e.hiredate

from emp e inner join dept d on e.deptno = d.deptno

where e.hiredate>'1-5月-80';

select e.ename,d.dname,e.hiredate

from emp e

natural join dept d

where e.hiredate > '1-5月-80';

• 3.使用using子句,顯示工作在chicago的員工姓名,部門名稱,工作地點

select e.ename ,d.dname ,d.loc

from emp e join dept d using (deptno)

where d.loc = 'chicago';

• 4.使用on子句,顯示工作在chicago的員工姓名,部門名稱,工作地點,薪資等級

select e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"

from emp e join dept d on (e.deptno=d.deptno) ,salgrade s

where e.sal between s.losal and s.hisal;

select e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"

from emp e, dept d,salgrade s

where e.deptno=d.deptno

and e.sal between s.losal and s.hisal;

• 5.使用左連線,查詢每個員工的姓名,經理姓名,沒有經理的king也要顯示出來。

select e.ename,m.ename "經理名字"

from emp e

left outer join emp m

on (e.mgr=m.empno);

• 6.使用右連線,查詢每個員工的姓名,經理姓名,沒有經理的king也要顯示出來。

select e.ename,m.ename "經理名字"

from emp m

right outer join emp e

on m.mgr=e.empno;

課後作業

• 1.顯示員工smith的姓名,部門名稱,直接上級名稱

select e.ename,d.dname,m.ename

from emp e

join dept d using (deptno)

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

select e.ename,d.dname,m.ename

from emp e

join dept d on e.deptno=d.deptno

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

select e.ename,d.dname,m.ename

from emp e,dept d,emp m

where e.deptno=d.deptno

and e.mgr=m.empno;

• 2.顯示員工姓名,部門名稱,工資,工資級別,要求工資級別大於4級。

select e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"

from emp e, dept d,salgrade s

where e.deptno=d.deptno

and e.sal between s.losal and s.hisal

and s.grade>4

• 3.顯示員工king和ford管理的員工姓名及其經理姓名。

方法一:

select e.ename "員工姓名",m.ename "經理姓名"

from emp e,emp m

where e.mgr=m.empno

and m.ename in('king','ford');

方法二:

select e.ename "員工姓名",m.ename "經理姓名"

from emp e,emp m

where e.mgr=m.empno and m.ename ='king'

or e.mgr=m.empno and m.ename ='ford';

• 4.顯示員工姓名,參加工作時間,經理名,參加工作時間,要求參加時間比經理早。

select e.ename "員工姓名", e.hiredate "參加工作時間" ,m.ename "經理姓名", m.hiredate "經理參加工作時間"

from emp e,emp m

where e.mgr=m.empno

and e.hiredate< m.hiredate;

Oracle 多表連線

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

oracle多表連線

多表連線 查詢的一種,資料 不再是單一的乙個表,我們可以重多個表中提取相關聯的資料,比如,從emp和dept表中找出人員 所在的部門名稱,多個表來聯合查詢 1.查詢的時候,可以from多個表 select from emp,dept 這樣會產生乙個笛卡爾集 表示 兩個表任何組合的結果 2.需求 取關...

Oracle 多表連線

通過連線條件把相關表關聯起來 select from emp n個表相連會有n 1個關聯關係,先寫關聯條件,再寫限制條件 為什麼會產生笛卡爾積 沒有連線條件會產生笛卡爾積 select emp.ename,emp.empno,dept.deptno,dept.dname from emp,depts...