oracle第五章多表連線習題答案(理解 剖析)

2021-10-02 02:52:13 字數 4669 閱讀 1438

練習1

1.寫乙個查詢,顯示所有員工姓名,部門編號,部門名稱。

select e.ename,e.deptno,d.dname

from emp e,dept d

where e.deptno=d.deptno;

注意:當使用多表連線的的時候一定要注意關聯表

一般關聯的條件是關聯的表數減去一

如上所示,from了兩個表

所以下面的where至少要有乙個關聯起它們的條件

否則會造成笛卡爾乘積

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

select e.ename,d.loc,e.comm

from emp e,dept d

where e.deptno=d.deptno and d.loc=

'chicago'

and e.comm is

notnull

;

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

from emp e,dept d

where e.deptno=d.deptno and instr(e.ename,

'a',1,

1)>

0;

練習2

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

工資等級表為:salgrade

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

from emp e,salgrade s,dept d

where e.deptno=d.deptno and e.sal between s.losal and s.hisal;

order by s.grade

注意:這題的做題邏輯是,由題可得,所要查詢的資訊分別在三個表裡面,

所以這是乙個三個表的連線,三表連線關聯條件最少為兩個

所以有了where裡面的兩個條件

並且排序是最後執行的

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

select e.ename,e.empno,m.ename,m.empno

from emp e,emp m,dept d

where e.mgr=m.empno and e.deptno=d.deptno and d.loc in

('new york'

,'chicago'

);

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

第一種做法:

select e.ename,e.empno,m.ename,m.empno

from dept d

join emp e

on e.deptno=d.deptno

left

outer

join emp m

on e.mgr=m.empno

where d.loc in

('new york'

,'chicago');

order

by e.empno

第二種做法:

select e.ename,e.empno,m.ename,m.empno

from emp e,emp m,dept d

where e.mgr=m.empno(+)

and e.deptno=d.deptno and d.loc in

('new york'

,'chicago'

)order

by e.empno

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

from emp e

left

outer

join dept d

on e.deptno=d.deptno;

練習4

1.建立乙個員工表和部門表的交叉連線。

select e.

*,d.

*from emp e

cross

join dept d;

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

from emp e

natural

join dept d

where e.hiredate>to_date(

'1980-05-01'

,'yyyy-mm-dd'

);

3.使用using子句,顯示工作在chicago的員工姓名,部門名稱,工作地點
select e.ename,d.dname,d.loc

from emp e join dept d using

(deptno)

where d.loc=

'chicago'

;

使用using子句建立連線時,應注意以下幾點:

1.如果有若干個列名稱相同但資料型別不同,自然連線子句可以用using子句來替換,以指定產生等值連線的列。

2.如果有多於乙個列都匹配的情況,使用using子句只能指定其中的一列。

3.using子句中的用到的列不能使用表名和別名作為字首。

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

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

from emp e

join dept d

on e.deptno=d.deptno

join salgrade s

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

where d.loc=

'chicago'

;

自然連線條件基本上是具有相同列名的表之間的等值連線;

如果要指定任意連線條件,或指定要連線的列,則可以使用on子句;

用on將連線條件和其它檢索條件分隔開,其它檢索條件寫在where子句;

on子句可以提高**的可讀性。

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 e.mgr=m.empno;

課後作業

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

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

from emp e

join emp m

on e.mgr=m.empno

join dept d

on e.deptno=d.deptno

where e.ename=

'smith'

;

2.顯示員工姓名,部門名稱,工資,工資級別,要求工資級別大於4級。 select * from salgrade
select e.ename,d.dname,e.sal,s.grade

from emp e

join dept d

on e.deptno=d.deptno

join salgrade s

on e.sal between losal and hisal

where s.grade>

4;

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

這題我在很多部落格上面看到的答案都不一樣,我對這道題的理解是

要顯示king和ford的員工姓名和經理姓名

select e.ename 他的員工,m.ename,j.ename 他的經理

from emp e

join emp m

on e.mgr=m.empno

left

outer

join emp j

on m.mgr=j.empno

where m.ename in

('king'

,'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;

第五章習題

一 填空題 1 c 的兩種聯編方式為 靜態 聯編和 動態 聯編。2 c 支援兩種多型性,靜態聯編所支援的多型性被稱為 編譯時的多型性 動態聯編所支援的多型性被稱為 執行時的多型性 3 過載函式在編譯時表現出多型性,就是 靜態 聯編 而虛函式則在執行時表現出多型性是 動態 聯編。4 為了區分過載函式,...

第五章 多表查詢

本章主要講解內連線,inner join子句將乙個表中的行於其他標表中的行進行匹配,並允許從兩個表中查詢包含列的行紀錄,一般出現在from子句之後。desc employee desc department select e.fname,e.lname,d.name from employee e ...

C 第五章習題

1 將例5.1的程式片段補充和改寫成乙個完整 正確的程式,用公用繼承方式。在程式中應包括輸入資料的函式,在程式執行時輸入num name age addr的值,程式應輸出以上五個資料的值。class student 宣告基類 void student get value void student d...