EMP表
DEPT表:
工資等級(jí)表 salgrade
題目要求:根據(jù)Oracle數(shù)據(jù)庫scott模式下的emp表和dept表,完成下列操作。
(1)查詢20號(hào)部門的所有員工信息。 select * from emp where deptno = 20; (2)查詢所有工種為CLERK的員工的工號(hào)、員工名和部門名。 select empno,ename,deptno from emp where job like 'CLERK'; (3)查詢獎(jiǎng)金(COMM)高于工資(SAL)的員工信息。 select * from emp where comm > sal; (4)查詢獎(jiǎng)金高于工資的20%的員工信息。 select * from emp where comm > (sal*0.2); (5)查詢10號(hào)部門中工種為MANAGER和20號(hào)部門中工種為CLERK的員工的信息。 select * from emp where (deptno = 10 and job like 'MANAGER') or (deptno = 20 and job like 'CLERK'); (6)查詢所有工種不是MANAGER和CLERK,且工資大于或等于2000的員工的詳細(xì)信息。 select * from emp where job not in ('MANAGER','CLERK') and sal >= 2000 ; (7)查詢有獎(jiǎng)金的員工的不同工種。 select distinct job from emp where comm is not null; (8)查詢所有員工工資和獎(jiǎng)金的和。 select ename,(sal+nvl(comm,0)) salcomm from emp; (9)查詢沒有獎(jiǎng)金或獎(jiǎng)金低于100的員工信息。 select * from emp where (comm is null or comm < 100) ; (10)查詢各月倒數(shù)第2天入職的員工信息。 select * from emp where hiredate in (select (last_day(hiredate)-1) from emp); (11)查詢員工工齡大于或等于10年的員工信息。 select * from emp where (sysdate - hiredate)/365 >= 10 ; (12)查詢員工信息,要求以首字母大寫的方式顯示所有員工的姓名。 select upper(substr(ename,1,1)) || lower(substr(ename,2,length(ename)-1)) from emp; (13)查詢員工名正好為6個(gè)字符的員工的信息。 select * from emp where length(ename)= 6 ; (14)查詢員工名字中不包含字母“S”員工。 select * from emp where ename not in (select ename from emp where ename like '%S%') ; select * from emp where ename not like ‘%S%’; (15)查詢員工姓名的第2個(gè)字母為“M”的員工信息。 select * from emp where ename like '_M%'; (16)查詢所有員工姓名的前3個(gè)字符。 select substr(ename,1,3) from emp ; (17)查詢所有員工的姓名,如果包含字母“s”,則用“S”替換。 select replace(ename,'s','S') from emp ; (18)查詢員工的姓名和入職日期,并按入職日期從先到后進(jìn)行排列。 select ename,hiredate from emp order by hiredate asc ; (19)顯示所有的姓名、工種、工資和獎(jiǎng)金,按工種降序排列,若工種相同則按工資升序排列。 select ename,job,sal,comm from emp order by job desc,sal asc ; (20)顯示所有員工的姓名、入職的年份和月份,若入職日期所在的月份排序,若月份相同則按入職的年份排序。 select ename,to_char(hiredate,'yyyy')||'-'||to_char(hiredate,'mm') from emp order by to_char(hiredate,'mm'),to_char(hiredate,'yyyy'); (21)查詢?cè)?月份入職的所有員工信息。 select * from emp where to_char(hiredate,'mm') = 2 ; (22)查詢所有員工入職以來的工作期限,用“**年**月**日”的形式表示。 select ename,floor((sysdate-hiredate)/365)||'年'||floor(mod((sysdate-hiredate),365)/30)||'月'||cell(mod(mod((sysdate-hiredate),365),30))||'天' from emp ; (23)查詢至少有一個(gè)員工的部門信息。 select * from dept where deptno in (select distinct deptno from emp where mgr is not null) ; (24)查詢工資比SMITH員工工資高的所有員工信息。 select * from emp where sal > (select sal from emp where ename like 'SMITH') ; (25)查詢所有員工的姓名及其直接上級(jí)的姓名。 select staname,ename supname from (select ename staname,mgr from emp) t join emp on t.mgr=emp.empno ; (26)查詢?nèi)肼毴掌谠缬谄渲苯由霞?jí)領(lǐng)導(dǎo)的所有員工信息。 select * from emp where empno in (select staempno from (select empno staempno,hiredate stahiredate,mgr from emp) t join emp on t.mgr=emp.empno and stahiredate < hiredate) ; (27)查詢所有部門及其員工信息,包括那些沒有員工的部門。 select * from dept left join emp on emp.deptno=dept.deptno order by dept.deptno ; (28)查詢所有員工及其部門信息,包括那些還不屬于任何部門的員工。 (29)查詢所有工種為CLERK的員工的姓名及其部門名稱。 select ename,dname from emp join dept on job like 'CLERK' and emp.deptno=dept.deptno ; (30)查詢最低工資大于2500的各種工作。 select job from (select min(sal) min_sal,job from emp group by job) where min_sal > 2500 ; (31)查詢最低工資低于2000的部門及其員工信息。 select * from emp where deptno in (select deptno from (select min(sal) min_sal,deptno from emp group by deptno) where min_sal < '2000') ; (32)查詢?cè)赟ALES部門工作的員工的姓名信息。 select ename from emp where deptno = (select deptno from dept where dname like 'SALES'); (33)查詢工資高于公司平均工資的所有員工信息。 select * from emp where sal > (select avg(sal) from emp) ; (34)查詢與SMITH員工從事相同工作的所有員工信息。 select * from emp where job in (select job from emp where ename like 'SMITH') and ename not like 'SMITH' ; (35)列出工資等于30號(hào)部門中某個(gè)員工工資的所有員工的姓名和工資。 select ename,sal from emp where sal =any (select sal from emp where deptno = 30) ; (36)查詢工資高于30號(hào)部門中工作的所有員工的工資的員工姓名和工資。 select ename,sal from emp where sal >all (select sal from emp where deptno = 30) ; (37)查詢每個(gè)部門中的員工數(shù)量、平均工資和平均工作年限。 select dname,count,avg_sal,avg_date from dept join (select count(*) count,avg(sal) avg_sal,avg((sysdate-hiredate)/365) avg_date,deptno from emp group by deptno) t on dept.deptno = t.deptno ; (38)查詢從事同一種工作但不屬于同一部門的員工信息。 select distinct t1.empno,t1.ename,t1.deptno from emp t1 join emp t2 on t1.job like t2.job and t1.deptno <> t2.deptno ; (39)查詢各個(gè)部門的詳細(xì)信息以及部門人數(shù)、部門平均工資。 Select dept.*,person_num,avg_sal from dept,(select count(*) person_num,avg(sal) avg_sal,deptno from emp group by deptno) t where dept.deptno = t.deptno ; (40)查詢各種工作的最低工資。 select job,min(sal) from emp group by job ; (41)查詢各個(gè)部門中的不同工種的最高工資。 select max(sal),job,deptno from emp group by deptno,job order by deptno,job ; (42)查詢10號(hào)部門員工以及領(lǐng)導(dǎo)的信息。 select * from emp where empno in (select mgr from emp where deptno=10) or deptno = 10 ; (43)查詢各個(gè)部門的人數(shù)及平均工資。 select deptno,count(*),avg(sal) from emp group by deptno ; (44)查詢工資為某個(gè)部門平均工資的員工信息。 select * from emp where sal in (select avg(sal) avg_sal from emp group by deptno) ; (45)查詢工資高于本部門平均工資的員工的信息。 select emp.* from emp join (select deptno,avg(sal) avg_sal from emp group by deptno) t on emp.deptno=t.deptno and sal>avg_sal ; (46)查詢工資高于本部門平均工資的員工的信息及其部門的平均工資。 select emp.*, from emp join (select deptno,avg(sal) avg_sal from emp group by deptno) t on emp.deptno=t.deptno and sal>avg_sal ; (47)查詢工資高于20號(hào)部門某個(gè)員工工資的員工的信息。 select * from emp where sal >any(select sal from emp where deptno=20); (48)統(tǒng)計(jì)各個(gè)工種的人數(shù)與平均工資。 select job,count(*),avg(sal) from emp group by job ; (49)統(tǒng)計(jì)每個(gè)部門中各個(gè)工種的人數(shù)與平均工資。 select deptno,job,count(*),avg(sal) from emp group by deptno,job order by deptno,job; (50)查詢工資、獎(jiǎng)金與10 號(hào)部門某個(gè)員工工資、獎(jiǎng)金都相同的員工的信息。 select emp.* from emp join (select sal,comm from emp where deptno = 10) t on emp.sal=t.sal and nvl(emp.comm,0)=nvl(t.comm,0) and emp.deptno != 10; (51)查詢部門人數(shù)大于5的部門的員工的信息。 select * from emp where deptno in (select deptno from emp group by deptno having count(*)>5); (52)查詢所有員工工資都大于1000的部門的信息。 select * from dept where deptno in (select distinct deptno from emp where deptno not in (select distinct deptno from emp where sal < 1000)) ; (53)查詢所有員工工資都大于1000的部門的信息及其員工信息。 select * from emp join dept on dept.deptno in (select distinct deptno from emp where deptno not in (select distinct deptno from emp where sal < 1000)) and dept.deptno=emp.deptno; (54)查詢所有員工工資都在900~3000之間的部門的信息。 select * from dept where deptno in (select distinct deptno from emp where deptno not in (select distinct deptno from emp where sal not between 900 and 3000)) ; (55)查詢所有工資都在900~3000之間的員工所在部門的員工信息。 select * from emp where deptno in (select distinct deptno from emp where deptno not in (select distinct deptno from emp where sal not between 900 and 3000)) ; (56)查詢每個(gè)員工的領(lǐng)導(dǎo)所在部門的信息。 select * from (select e1.empno,e1.ename,e1.mgr mno,e2.ename mname,e2.deptno from emp e1 join emp e2 on e1.mgr=e2.empno) t join dept on t.deptno=dept.deptno ; (57)查詢?nèi)藬?shù)最多的部門信息。 select * from dept where deptno in (select deptno from (select count(*) count,deptno from emp group by deptno) where count in (select max(count) from (select count(*) count,deptno from emp group by deptno))); (58)查詢30號(hào)部門中工資排序前3名的員工信息。 select * from emp where empno in (select empno from (select empno,sal from emp where deptno=30 order by sal desc) where rownum < 4) ; (59)查詢所有員工中工資排在5~10名之間的員工信息。 select * from emp where empno in (select empno from (select empno,rownum num from (select empno,sal from emp order by sal desc)) where num between 5 and 10 ) ; select empno from (select empno,sal from emp order by sal desc) where rownum <= 10 minus select empno from (select empno,sal from emp order by sal desc) where rownum < 5 ; (60)向emp表中插入一條記錄,員工號(hào)為1357,員工名字為oracle,工資為2050元,部門號(hào)為20,入職日期為2002年5月10日。 insertinto emp(empno,ename,sal,deptno,hiredate) values (1357,'oracle',2050,20,to_date('2002年5月10日','yyyy"年"mm"月"dd"日"')) ; (61)向emp表中插入一條記錄,員工名字為FAN,員工號(hào)為8000,其他信息與SMITH員工的信息相同。 (62)將各部門員工的工資修改為該員工所在部門平均工資加1000。 update emp t1 set sal = (select new_sal from (select avg(sal)+1000 new_sal,deptno from emp group by deptno) t2 wher e t1.deptno = t2.deptno ) ; 1、查詢82年員工 select e.* from emp e where to_char(e.hiredate, 'yy') like '82'; select e.* from emp e where to_char(e.hiredate,'yyyy')='1982'; 2、查詢32年工齡的人員 select round(sysdate-e.hiredate)/365, e.ename,e.hiredate from emp e where round((sysdate-e.hiredate)/365)=32; 3、顯示員工雇傭期 6 個(gè)月后下一個(gè)星期一的日期 select next_day(add_months(e.hiredate,6),2) from emp e ; 4、找沒有上級(jí)的員工,把mgr的字段信息輸出為 "boss" select decode(e.mgr,null,'boss','中國好聲音') from emp e; 5、為所有人長(zhǎng)工資,標(biāo)準(zhǔn)是:10部門長(zhǎng)10%;20部門長(zhǎng)15%;30部門長(zhǎng)20%其他部門長(zhǎng)18% select decode(e.deptno,10,e.sal*1.1,20,e.sal*1.15, e.sal*1.18) 漲工資 ,e.deptno, e.sal from emp e ; Oracle_練習(xí)與答案 1.求部門中薪水最高的人 select ename,sal,emp.deptno from emp join (select deptno,max(sal) max_sal from emp group by deptno) t on (emp.deptno = t.deptno and emp.sal = t.max_sal); select ename, sal, deptno from emp where sal in (select max(sal) from emp group by deptno); 2.求部門平均薪水的等級(jí) select deptno, avg_sal, grade from (select deptno,avg(sal) avg_sal from emp group by deptno) t join salgrade on (t.avg_sal between salgrade.losal and salgrade.hisal); 3. 求部門平均的薪水等級(jí) select deptno, avg(grade) avg_sal_grade from (select deptno, grade from emp join salgrade on emp.sal between salgrade.losal and salgrade.hisal) group by deptno; 4. 雇員中有哪些人是經(jīng)理人 select distinct e2.ename manager from emp e1 join emp e2 on e1.mgr = e2.empno; select ename from emp where empno in (select mgr from emp); 5. 不準(zhǔn)用組函數(shù),求薪水的最高值 select distinct sal max_sal from emp where sal not in (select e1.sal e1_sal from emp e1 join emp e2 on e1.sal < e2.sal); select * from (select * from emp order by sal desc) t where rownum <2 6. 求平均薪水最高的部門的部門編號(hào) select deptno, avg_sal from (select deptno, avg(sal) avg_sal from emp group by deptno) where avg_sal = (select max(avg_sal) from (select avg(sal) avg_sal from emp group by deptno) ); 組函數(shù)嵌套寫法(對(duì)多可以嵌套一次,group by 只對(duì)內(nèi)層函數(shù)有效) select deptno, avg_sal from (select deptno, avg(sal) avg_sal from emp group by deptno) where avg_sal = (select max(avg(sal)) from emp group by deptno); 7. 求平均薪水最高的部門的部門名稱 select t1.deptno, dname, avg_sal from (select deptno,avg(sal) avg_sal from emp group by deptno) t1 join dept on t1.deptno = dept.deptno where avg_sal = (select max(avg_sal) from (select deptno,avg(sal) avg_sal from emp group by deptno) ); select dname from dept where deptno = (select deptno from (select deptno,avg(sal) avg_sal from emp group by deptno) where avg_sal = (select max(avg_sal) from (select deptno,avg(sal) avg_sal from emp group by deptno) ) ); 8. 求平均薪水的等級(jí)最低的部門的部門名稱 select dname from dept join (select deptno, grade from (select deptno, avg(sal) avg_sal from emp group by deptno) t join salgrade on (t.avg_sal between salgrade.losal and salgrade.hisal) ) t on dept.deptno = t.deptno where t.grade = (select min(grade) from (select avg(sal) avg_sal from emp group by deptno) t join salgrade on (t.avg_sal between salgrade.losal and salgrade.hisal) ); 9.求部門經(jīng)理人中平均薪水最低的部門名稱 select dname from (select deptno, avg(sal) avg_sal from emp where empno in (select mgr from emp)group by deptno)t join dept on t.deptno = dept.deptno where avg_sal = (select min(avg_sal) from (select avg(sal) avg_sal from emp where empno in (select mgr from emp) group by deptno) t ); 10. 求比普通員工的最高薪水還要高的經(jīng)理人名稱(not in) select ename from emp where empno in (select mgr from emp) and sal > (select max(sal) from (select e2.sal from emp e1 right join emp e2 on e1.mgr = e2.empno where e1.ename is null) t ); select ename from emp where empno in (select mgr from emp) and sal > (select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null) ); //NOT IN遇到NULL則返回NULL,必須排除NULL值 11. 求薪水最高的前5名雇員 select empno,ename from (select * from emp order by sal desc) where rownum<=5; 12. 求薪水最高的第6到第10名雇(!important) select ename,sal from (select t.*,rownum r from (select * from emp order by sal desc) t ) where r>=6 and r<=10; 13. 求最后入職的5名員工 select ename, to_char(hiredate,'YYYY"年"MM"月"DD"日"') hiredate from (select t.*,rownum r from (select * from emp order by hiredate desc)t ) where r<=5; select ename, to_char(hiredate,'YYYY"年"MM"月"DD""') hiredate from (select t.*,rownum r from (select * from emp order by hiredate)t )where r>(select count(*)-5 from emp);
【專題推薦】:2020年oracle面試題匯總(最新)