1,列出至少有一個員工的全部部門。數據庫
select dname from dept where deptno in (select distinct(deptno) from emp);排序
//列出部門人數很多於3我的的部門和人數io
錯誤的查詢方法:date
注意dname不是關鍵字,可能存在多個重複的,因此不能以dname分組,因此下面的查詢是錯誤的。select
select dname,count(*) from emp a join dept b on a.deptno=b.deptno group by dname having count(*)>=3;grep
正確的查詢方法:nio
select b.dname,a.count from (select deptno,count(*) count from emp group by deptno having count(*)>=3) a join dept b on a.deptno=b.deptno;方法
2,列出薪水比"SMITH"多的全部員工。統計
select ename from emp where sal>(select sal from emp where ename='SMITH');數據
3,列出全部員工的姓名及其直接上級的姓名。
select a.ename emp_name,b.ename mag_name from emp a,emp b where a.mgr=b.empno;
4,列出受僱日期早於其直接上級的全部員工的編號,姓名,部門名稱。
select empno,ename,dname from emp a join dept b on a.deptno=b.deptno where hiredate in (select a.hiredate from emp a,emp b where a.mgr=b.empno and a.hiredate<b.hiredate);
同上
select empno,ename,dname from emp a join dept b on a.deptno=b.deptno where a.empno in (select a.empno from emp a,emp b where a.mgr=b.empno and a.hiredate<b.hiredate);
5,列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。
select a.dname,b.ename,b.empno,b.job from dept a left join emp b on a.deptno=b.deptno;
6,列出全部job=CLERK的姓名及其部門名稱,部門的人數。
//查詢工做是CLERK的姓名及其部門的人數
select a.ename,b.count,c.dname from emp a join (select deptno,count(*) count from emp group by deptno) b on a.deptno=b.deptno join dept c on c.deptno=b.deptno where a.job='CLERK';
7,列出最低薪水大於1500的各類工做及此從事此工做的所有僱員人數。
select job,min(sal),count(*) from emp group by job having min(sal)>1500;
8,列出在部門"SALES"(銷售部)工做的員工的姓名,假定不知道銷售部的部門編號。
select ename from emp where deptno=(select deptno from dept where dname='SALES');
9,列出薪水高於公司平均薪水的全部員工,所在部門,上級領導,公司的工資等級。
方法一:
//7839沒有上級領導
select a.empno,a.ename,b.ename,c.dname,a.sal,case when a.sal >=700 and a.sal<=1200 then 1
when a.sal >=1201 and a.sal<=1400 then 2
when a.sal >=1401 and a.sal<=2000 then 3
when a.sal >=2001 and a.sal<=3000 then 4
when a.sal >=3001 and a.sal<=9999 then 5 else 10000 end "grade" from emp a join emp b on a.mgr=b.empno join dept c on b.deptno=c.deptno where a.sal>(select avg(sal) from emp);
方法二:
select a.ename emp_name,c.dname, b.ename mag_name,a.grade
from
(select a.empno,a.deptno,a.mgr,b.grade,a.ename
from emp a,salgrade b
where sal > (
select avg(sal) sal from emp )
and sal >= losal and sal <= hisal) a,
emp b,
dept c
where a.mgr=b.empno and a.deptno=c.deptno;
10,列出與"SCOTT"從事相同工做的全部員工及部門名稱。
select a.ename,b.dname from emp a join dept b on a.deptno=b.deptno where job=(select job from emp where ename='SCOTT') and ename!='SCOTT';
11,列出薪水等於部門號=30中員工的薪水的全部員工的姓名和薪水。
select ename,sal from emp where sal in (select sal from emp where deptno=30);
12,列出薪水高於在部門號=30工做的全部員工的薪水的員工姓名和薪水,部門名稱。
select a.ename,a.sal,b.dname from emp a join dept b on a.deptno=b.deptno where sal >all (select sal from emp where deptno=30);
13,列出在每一個部門工做的員工數量,平均工資和平均服務期限。
select count(*) count,avg(sal) avg_sal,avg(sysdate-hiredate) avg_hiredate from emp group by deptno;
14,列出全部員工的姓名,部門名稱和工資。
select a.ename,a.sal,b.dname from emp a join dept b on a.deptno=b.deptno;
15,列出全部部門的詳細信息和部門人數。
方法一:
select a.*,b.counts from dept a left join (select deptno,count(*) counts from emp group by deptno) b on a.deptno=b.deptno;
方法二:
select a.deptno,a.dname,a.loc,(select count(deptno) from emp b where b.deptno=a.deptno group by b.deptno) deptcount from dept a;
16,列出各類工做的最低工資及從事此工做的僱員姓名。
select ename,sal,job from emp where sal in (select min(sal) from emp group by job);
17,列出各個部門的MANAGER(經理)的最低薪水。
select ename,mgr,sal,deptno from emp where sal in (select min(sal) from emp group by job);
18,列出全部員工的年工資,按年薪(salary+comm)從高到底排序。
注意年薪(salary+comm)都須要乘以12
select sal*12+nvl(comm,0)*12 sum_salary from emp order by sum_salary desc;
//列出每一個部門的平均薪金(salary+comm)
方法一:
select avg(sal*12+nvl(comm,0)*12) avg_salary,deptno from emp group by deptno;
方法二:
select (sum(sal+nvl(comm,0))*12)/count(*) salary from emp grep by deptno;
19,查出某個員工的上級主管,並要求出這些主管中的薪水超過3000
select a.ename emp_name,b.ename mag_name,b.sal from emp a,emp b where a.mgr=b.empno and b.sal>3000;
20,求出部門名稱中,帶‘S’字符的部門員工的部門名稱,工資合計,部門人數
select dname,count(dname) count,sum(sal) sum_sal from emp a join dept b on a.deptno=b.deptno where dname like '%S%' group by b.dname;
21.求平均薪水最高的部門,顯示部門名稱和部門平均薪水。
select a.avg_sal,c.dname from (select max(avg(sal)) avg_sal from emp group by deptno) a join
(select avg(sal) avg_sal,deptno from emp group by deptno) b on a.avg_sal=b.avg_sal join dept c on c.deptno=b.deptno;
注意下面雖然跟上面的結果相同,可是是有問題的,其中不能出現平均薪水最高的部門存在多個
select a.dname,b.avg_sal from dept a join (select deptno,avg(sal) avg_sal from emp group by deptno order by avg_sal desc) b on a.deptno=b.deptno where rownum=1;
########################
1,請查詢表DEPT中全部部門的狀況。
select * from dept;
2,查詢表DEPT中的部門號,部門名稱兩個字段的全部信息。
select deptno,dname from dept;
3,請從表EMP中查詢10號部門工做的僱員姓名和工資。
select ename,sal from emp where deptno=10;
4,請從表EMP中查找工種是職員CLERK或經理MANAGER的僱員姓名,工資。
select ename,sal from emp where job in('CLERK','MANAGER');
5,請在EMP表中查找部門號在10-30之間的僱員的姓名,部門號,工資,工做。
select ename,deptno,sal,job from emp where deptno between 10 and 30;
6,請從表EMP中查找姓名以J開頭全部僱員的姓名,工資,職位。
select ename,sal,job from emp where ename like 'J%';
7,請從表EMP中查找工資低於2000的僱員的姓名,工做,工資,並按工資降序排列。
select ename,job,sal from emp where sal<2000 order by sal desc;
8,請從表中查詢工做是CLERK的全部人的姓名,工資,部門號,部門名稱以及部門地址的信息。
select a.ename,a.sal,a.deptno,b.dname,b.loc from emp a join dept b on a.deptno=b.deptno where job='CLERK';
9,查詢表EMP中全部的工資大於等於2000的僱員姓名和他的經理的名字。
select a.ename emp_name,b.ename mag_name from emp a join emp b on a.mgr=b.empno where a.sal>2000;
10,在表EMP中查詢全部工資高於JONES的全部僱員姓名,工做和工資。
select ename,job,sal from emp where sal>(select sal from emp where ename='JONES');
11,列出沒有對應部門表信息的全部僱員的姓名,工做以及部門號。
select ename,job,deptno from emp where deptno is null;
12,查找工資在1000~3000之間的僱員所在部門的全部人員信息。
select * from emp where deptno in(
select distinct(deptno) from emp where sal between 1000 and 3000);
13,僱員中誰的工資最高。
select ename from emp where sal>=all(select sal from emp);
14,僱員中誰的工資第二高(考慮並列第一的狀況,如何處理)
select ename from emp where sal=(select max(sal) from emp where sal in(select sal from emp minus select max(sal) from emp));
方法二:
select * from (select ename,sal,dense_rank() over (order by sal desc) rn from emp) where rn=2;
15,查詢全部僱員的姓名,SAL與COMM之和。
select ename,sal*12+nvl(comm,0) sum_salary from emp;
16,查詢全部81年7月1日之前來的員工姓名,工資,所屬部門的名字
select a.ename,a.sal,b.dname from emp a join dept b on a.deptno=b.deptno where
hiredate<'01-JAN-81';
17,查詢各部門中81年1月1日之後來的員工數
方法一:
注意:不一樣的數據庫日期格式可能不是‘1-JAN-81’,因此最好採用第二種方法
select deptno,count(*) from emp where hiredate>'1-JAN-81' group by deptno;
方法二:
select deptno,count(*) emp_total from emp where hiredate>to_date('1981-01-01','yyyy-mm-dd') group by deptno;
18,查詢全部在CHICAGO工做的經理MANAGER和銷售員SALESMAN的姓名,工資
select ename,sal from emp where job in ('MANAGER','SALESMAN') and deptno in (select deptno from dept where loc='CHICAGO');
19,查詢列出來公司就任時間超過24年的員工名單
方法一:
select ename from emp where (sysdate-hiredate)/365>24;
方法二:
288是24年總共是288個月
where條件的意思是來的日期
select ename from emp where hiredate<=add_months(sysdate,-288);
20,詢於81年來公司全部員工的總收入(包括SAL和COMM)
方法一:
select sum(sal*12+nvl(comm,0)*12) sum from emp where hiredate between '1-JAN-81' and '31-DEC-81';
方法二:
select sum(sal*12+nvl(comm,0)*12) sum from emp where to_char(hiredate,'yyyy')='1981';
21,查詢顯示每一個僱員加入公司的準確時間,按yyyy-mm-dd hh24:mi:ss顯示。
select to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;
22,查詢公司中按年份月份統計各地的錄用職工數量
select count(*),to_char(hiredate,'yyyy') year,to_char(hiredate,'mm') month,loc from emp a join dept b on a.deptno=b.deptno group by loc,hiredate;
//下面其實與上面同
select count(*),to_char(hiredate,'yyyy-mm') year_month,loc from emp a join dept b on a.deptno=b.deptno group by loc,hiredate;
23查詢列出各部門的部門名和部門經理名字
select a.ename man_name,dname from emp a join dept b on a.deptno=b.deptno where job='MANAGER';
24,查詢部門平均工資最高的部門名稱和最低的部門名稱
select dname avg_sal from dept where deptno=(select deptno from emp group by deptno having avg(sal)>=all(select avg(sal) from emp a join dept b on a.deptno=b.deptno group by a.deptno))
union all
select dname avg_sal from dept where deptno=(select deptno from emp group by deptno having avg(sal)<=all(select avg(sal) from emp a join dept b on a.deptno=b.deptno group by a.deptno));
25,查詢與僱員號爲7521員工的最接近的在其後進入公司的員工姓名及其所在部門名
select b.ename,c.dname from (select min(hiredate) hiredate from emp where hiredate>(select hiredate from emp where empno='7521')) a,emp b,dept c where a.hiredate=b.hiredate and b.deptno=c.deptno;