練習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 salgradeselect 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...