1. 程式人生 > >【sql語句】實驗四 SQL綜合練習

【sql語句】實驗四 SQL綜合練習

(一)、假設已經建立S、C、SC表,並插入下列資料:
學生表S (S#,SNAME,AGE,SEX):(S#)
課程表C (C#, CNAME, TEACHER):(C#)
選課關係表SC (S#, C#, GRADE):(S#,C#)
1、 檢索選修課程名為MATHS的學生學號和姓名;

select x.s#,x.sname 
from s x, sc y, c z
where x.s#=y.s# and y.c#=z.c# and z.cname='MATHS';

2、 檢索選修課程號為C2或C4的學生學號(區分大小寫);

select distinct x.s#
from s x,sc y
where x.s#=y.s# and y.c#='C2' or y.c#='C4';

3、 檢索LIU老師教的課程號和課程名;

select c#,cname
from c
where teacher='LIU';

4、 檢索不學C2的學生姓名與年齡;

select distinct x.sname, x.age
from s x, sc y
where y.c# not in('C2');

5、 為SC表按學號降序和課程號降序建唯一索引;

create index ind_sc on sc(s# desc, c# desc);

6、 修改S表,增加SDEPT列(SDEPT表示學生所在的系);

alter table sc
add sdept char(30);

7、 建立關於學生學號和平均成績的檢視;

create view s_avg
as select s# sno, avg(grade) avg
from sc
group by s#;

(二)已知公司的三個表資訊,向每個表中插入適當的資料。
員工表EMP1(EID, ENAME, BDATE, SEX, CITY),
部門表DEPT1(DID, DNAME, DCITY),
工作表WORK(EID,DID,STARTDATE,SALARY)。各個欄位說明如下:
注:EID——員工編號,最多6個字元。例如A00001(主鍵)
ENAME——員工姓名,最多10個字元。例如SMITH
BDATE——出生日期,日期型
SEX——員工性別,單個字元。F或者M
CITY——員工居住的城市,最多20個字元。例如:上海
DID——部門編號,最多3個字元。例如 A01 (主鍵)
DNAME——部門名稱,最多20個字元。例如:研發部門
DCITY——部門所在的城市,最多20個字元。例如:上海
STARTDATE——員工到部門上班的日期,日期型
SALARY——員工的工資。整型。

請使用ORACLE的sql*plus 完成下列的操作
1、 列出員工編號以字母P至S開頭的所有員工的基本資訊。

select * from emp1
where eid like 'P%' or eid like 'Q%' or eid like 'R%' or eid like 'S%';

2、 刪除年齡超過60歲的員工。

delete from emp1
where months_between( sysdate, bdate)/12>60;

3、 為工齡超過10年的職工增加10%的工資。

update work
set salary=salary*1.1
where months_between(sysdate,startdate)/12>10;

4、 查詢擁有最多的員工的部門的基本資訊(要求只取出一個部門的資訊),如果有多個部門人數一樣,那麼取出部門編號最小的那個部門的基本資訊。

①	create view vw_maxemp(did,empno)
as select did,count(*)
from work
group by did;
②	select * from dept1
where did in(	select min(did)
from vw_maxemp
              	where empno=(select max(empno) from vw_maxemp));

5、 查詢部門人數大於5的每個部門的編號,名稱,人數。

select * from dept1
where did in( select did
              from vw_maxemp
              where empno>5);

6、 查詢部門人數大於5的每個部門的最高工資,最低工資。

①	create view vw_maxemp2(did,empno)
as select did,count(*)
from work
group by did
having count(*)>5;
②	select did,min(salary),max(salary)
from work
group by did
having did in(select did from vw_maxemp2);