1.檢索部門編號、部門名稱、部門所在地及其每個部門的員工總數。 select d.deptno,d.dname,d.loc,count(*) from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.dname,d.loc; 2.檢索員工和所屬經理的姓名。 select e.ename 雇員,m.ename 經理 from emp e,emp m where e.mgr=m.empno; 3. 檢索工資等級處於第四級別的員工的姓名。 select e.ename from emp e inner join salgrade s on (e.sal between s.losal and s.hisal) where s.grade=4; 4.檢索工資等級高於smith的員工信息。 select * from emp e join salgrade s on (e.sal between s.losal and s.hisal) where s.grade>(select distinct s.grade from emp e join salgrade s on ((select sal from emp where ename='SMITH') between s.losal and s.hisal)); 5.檢索30部門中1980年1月份之前入職的員工信息。顯示:員工號、員工名、部門號,部門名、入職日期。 select empno,ename,d.deptno,d.dname,hiredate from emp,dept d where emp.deptno=d.deptno and d.deptno=30 and hiredate<to_date('1980-01-01','yyyy-mm-dd'); 6. 檢索雇員的雇佣日期早於其經理雇佣日期的員工及其經理姓名。 select e.ename 雇員,m.ename 經理,e.HIREDATE 雇員的雇佣日期,m.hiredate 經理雇佣日期 from emp e,emp m where e.mgr=m.empno and e.hiredate<m.hiredate; 7.按部門號(deptno) 及 工資(sal)排序檢索公司的員工信息(要求部門號從大到小 ,部門號相同的按工資由低到高),顯示的字段為:員工號、員工名、工資、部門號。 select empno,ename,sal,deptno from emp order by deptno desc,sal; 8.檢索不同部門經理的最低工資。 select m.ename,e.empno,e.sal from emp e,emp m where e.mgr=m.empno and e.deptno in (select deptno from emp group by deptno) and e.sal in (select min(sal) from emp group by deptno); 9.檢索部門號及其本部門的最低工資。 select deptno,min(sal) from emp group by deptno; 10.檢索從事clerk工作的員工姓名和所在部門名稱。 select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno where e.job='CLERK'; 11.檢索和名叫SCOTT的員工相同工資的員工信息,但不顯示SCOTT。顯示字段:員工號、員工名、工資。 select empno,ename,sal from emp where sal =(select sal from emp where ename='SCOTT') and ename!='SCOTT'
12. 檢索與SCOTT從事相同工作的員工信息。 select * from emp where job=(select job from emp where ename='SCOTT'); 13.檢索出員工表emp中的第3條到第8條記錄。顯示字段:emp表中的全部字段。 select * from (select rownum num,e.* from emp e) where num>=3 and num<=8; 14. 檢索與30部門員工工資等級相同的員工姓名與工資。 select * from emp e join salgrade s on (e.sal between s.LOSAL and s.HISAL) where s.grade=(select distinct s.grade from emp e join salgrade s on ((select avg(sal) from emp where deptno=30) between s.LOSAL and s.HISAL)); 15. 求分段顯示薪水的個數。顯示結果如下: DEPTNO 800-2000 2001-5000
------ ---------- ----------
5 1
2 3
1 2
select t1.deptno, "800-2000", "2001-5000" from ( select deptno , count(*) as "800-2000" from emp where sal between 800 and 2000
group by deptno ) t1 join ( select deptno , count(*) as "2001-5000" from emp where sal between 2001 and 5000
group by deptno) t2 on t1.deptno = t2.deptno; 16. 用PL/sql實現輸出7369號員工的姓名。 ---用PL/sql實現輸出7369員工的姓名;
set serveroutput on; -- 將sql*plus的輸出功能開啟
declare --聲明部分
var_empno number(4) := 7369 ; --聲明一個變量var_empno ,並給賦值,用:= 賦值var_name varchar2(10); --聲明一個變量var_name
var_sal number(9,2); begin --執行部分的開始
select ename ,sal into var_name ,var_sal from emp where empno = var_empno; dbms_output.put_line(var_empno || ' 的名字是 :' || var_name); --輸出語句
dbms_output.put_line(var_empno || ' 的工資是 :' || var_ sal ); ----輸出語句
end; --執行部分的結束,end后面要加 ; ----執行結果為:
的名字是 : SMITH PL/SQL 過程已成功完成。 17.編寫一sql語句,將7369號員工的入職日期改為1997/7/1,工資提高800 ,其他信息不變。 update emp set hiredate=to_date('1997/7/1','yyyy-mm-dd'),sal=sal+800 where empno=7369; 18.假定現在有一張表,表名為T_emp ,其表結構和現有的emp表結構完全相同,但是T_emp中沒有記錄,請編寫一sql語句,實現將emp中部門編號為20的員工信息添加到T_emp中。 insert into T_emp select * from emp where deptno=20; 19. 對所有員工,如果該員工職位是MANAGER,並且在DALLAS工作那么就給他薪金加15%; 如果該員工職位是CLERK,並且在NEW YORK工作那么就給他薪金扣除5%;其他情況不作處理。要求:使用游標或函數編程實現。 set serveroutput on; declare
cursor c1 is select * from emp; c1rec c1%rowtype; v_loc varchar2(20); begin
for c1rec in c1 loop select loc into v_loc from dept where deptno = c1rec.deptno; if c1rec.job = 'MANAGER' and v_loc = 'DALLAS' then
update emp set sal = sal * 1.15 where empno = c1rec.empno; elsif c1rec.job='CLERK' and v_loc = 'NEW YORK' then
update emp set sal = sal * 0.95 where empno = c1rec.empno; else
null; end if; end loop; end; 20. 對直接上級是'BLAKE'的所有員工,按照參加工作的時間加薪:1981年6月以前入職的員工加薪10%、1981年6月以后入職的員工加薪5%。 要求:使用游標或函數編程實現。 declare
cursor c1 is select * from emp where mgr = (select empno from emp where ename='BLAKE'); --直接上級是'BLAKE'的所有員工
c1rec c1%rowtype; begin
for c1rec in c1 loop if c1rec.hiredate < '01-6月-81' then
update emp set sal = sal * 1.1 where empno = c1rec.empno; else
update emp set sal = sal * 1.05 where empno = c1rec.empno; end if; end loop; end; 創建一個角色MYROLE,此角色具有建表,建視圖的系統權限和查找SCOTT用戶EMP,DEPT表的權限,將此角色授權給TEST用戶。 CREATE ROLE MYROLE; GRANT CREATE TABLE,CREATE VIEW TO MYROLE; GRANT SELECT ON SCOTT.EMP TO MYROLE; GRANT SELECT ON SCOTT.DEPT TO MYROLE; CREATE USER TEST IDENTIFIED BY TEST; GRANT MYROLE TO TEST; 創建EMP,DEPT兩張表的副表(包括它們之間的約束) CREATE TABLE mydept AS SELECT * FROM dept; ALTER TABLE mydept ADD CONSTRAINT pk_mydept_deptno PRIMARY KEY(deptno); CREATE TABLE myemp AS SELECT * FROM emp ALTER TABLE myemp ADD CONSTRAINT pk_myemp_empno PAIMARY KEY(empno); ALTER TABLE myemp ADD CONSTRAINT fk_myemp_mydept FOREIGN KEY(deptno) REFERENCES mydept(deptno); 找出部門10中所有經理、部門20中所有辦事員,既不是經理又不是辦事員但其薪金>=2000的所有雇員的詳細資料 select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk ')) or (job<>upper(‘manager’) and job<>upper(‘clerk’) and sal>=2000); 找出不收取佣金或收取的佣金低於100的雇員 select * from emp where nvl(comm,0)<100; 顯示不帶有'R'的雇員姓名 select ename from emp where ename not like ‘%R%’; 顯示所有雇員的姓名、工作和薪金,按工作的降序順序排序,而工作相同時按薪金升序 select ename,job,sal from emp order by job desc ,sal asc 求哪些人工資在平均工資之上,列出姓名和工資。 select ename,sal from emp where sal > (select avg(sal) from emp); 顯示除20部門外,部門平均工資在2500以上的部門,列出部門編號和平均工資。 select avg(sal) , deptno from emp where deptno <>20 group by deptno having avg(sal) > 2500; 列出薪金等於部門30中員工的薪金的所有員工的姓名和薪金。 select * from emp where sal in (select sal from emp where deptno=30); 列出所有部門的詳細信息和部門人數。 select a.*,(select count(*) from emp where deptno=a.deptno) tot from dept a ; 列出各種工作的最低月收入。 select job,min(sal+nvl(comm,0)) from emp group by job; 返回工資水平(等級)高於平均工資水平的員工詳細信息。 select * from emp e join salgrade s on (e.sal between s.losal and s.hisal) where s.grade>(select distinct s.grade from emp e join salgrade s on ((select avg(sal) from emp) between s.losal and s.hisal)); 列出至少有兩個員工的所有部門信息 select * from dept where deptno in (select deptno from emp group by deptno having count(*)>1); 查詢emp表的第6行到第10行內容 select * from (select rownum r,e.* from emp e) where r between 6 and 10; 查詢入職最早的前5到10名員工的姓名和入職日期(按年月日格式顯示日期) Select ename,to_char(hiredate,’yyyy-mm-dd’) from (select ename,hiredate,rownum r from (select ename,hiredate from emp order by hiredate ) where rownum<=10) where r>=5; 編寫一sql語句,將7369號員工的入職日期改為1997/7/1,工資提高800 ,其他信息不變。 update emp set hiredate=to_date('1997/7/1','yyyy-mm-dd'),sal=sal+800 where empno=7369; 查詢雇員和其直接領導姓名及他們所在部門名稱,沒有領導的雇員也要列出. select e.ename,ed.dname,m.ename,md.dname from emp e,emp m,dept ed,dept md where e.deptno=ed.deptno and e.mgr=m.empno(+) and m.deptno=md.deptno(+); 列出部門編號,部門名稱,部門的員工數量,部門的平均工資. select d.deptno,d.dname,t.cou,t.avg from dept d,(select deptno,count(empno) cou,avg(sal) avg from emp group by deptno) t where d.deptno=t.deptno; 定義游標update_cur,根據職務調整雇員的工資,如果職務為“SALESMAN”或者“ANALYST”工資上調100元,如果職務為“MANAGER”工資上調200元,其它職務工資上調50元。 declare v_job emp.job%type; cursor update_cur is
select job from emp for update; begin
open emp_cur; loop fetch update_cur into v_job; exit when emp_cur%notfound; case
when v_job='SALESMAN' or v_job='ANALYST' then
update emp set sal=sal+100 where current of emp_cur; when v_job=' MANAGER ' then
update emp set sal=sal+200 where current of emp_cur; else
update emp set sal=sal+50 where current of emp_cur; end case; end loop; end; 創建一個觸發器,使其可以修改DEPT表的DEPTNO。 create or replace trigger update_dept after update on dept for each row begin
update emp set deptno=:new.deptno where deptno=:old.deptno; end; 1. 對所有員工,如果該員工職位是MANAGER,並且在DALLAS工作那么就給他薪金加15%;如果該員工職位是CLERK,並且在NEW YORK工作那么就給他薪金扣除5%;其他情況不作處理。要求:使用游標或函數編程實現。 set serveroutput on;1. declare
cursor c1 is select * from emp; c1rec c1%rowtype; v_loc varchar2(20); begin
for c1rec in c1 loop select loc into v_loc from dept where deptno = c1rec.deptno; if c1rec.job = 'MANAGER' and v_loc = 'DALLAS' then
update emp set sal = sal * 1.15 where empno = c1rec.empno; elsif c1rec.job='CLERK' and v_loc = 'NEW YORK' then
update emp set sal = sal * 0.95 where empno = c1rec.empno; else
null; end if; end loop; end; 2. 用PL/sql實現輸出7369號員工的姓名。 set serveroutput on; -- 將sql*plus的輸出功能開啟
declare --聲明部分
var_empno number(4) := 7369 ; --聲明一個變量var_empno ,並給賦值,用:= 賦值var_name varchar2(10); --聲明一個變量var_name
var_sal number(9,2); begin --執行部分的開始
select ename ,sal into var_name ,var_sal from emp where empno = var_empno; dbms_output.put_line(var_empno || ' 的名字是 :' || var_name); --輸出語句
dbms_output.put_line(var_empno || ' 的工資是 :' || var_ sal ); --輸出語句
end; --執行部分的結束,end后面要加 ; ----執行結果為:
的名字是 : SMITH