Oracle11g--基本查詢

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;

相關文章
相關標籤/搜索