1.选择在部门30中员工的所有信息?
关键词:部门30 所有信息:*
depto=30
select * from emp where depto=30; 还是‘30’
2.列出职位为(MANAGER)的员工的编号,姓名?
EMPNO:编号 ENAME:姓名
关键词:职位为MANAGER
select EMPNO,ENAME from emp where job='MANAGER'
3.找出奖金高于工资的员工?
COMM:奖金 SAL:工资
关键词:奖金>工资
select * from emp where comm>sal
4.找出每个员工奖金和工资的总和
错误的方法:select sum(sal+comm) from emp;
正确的方法:select empno,sal+nvl (comm,0) from emp;
empno,sal+nvl (comm,0) 也可以换成sal+nvl(comm,0),empno.改变的是显示的顺序。
5.找出部门10中的经理(MANAGER)和部门20中的普通员工(CLERK)
select * from emp where deptno=10 and job='MANAGER'
union
select * from emp where deptno=20 and job='clerk';
union
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
6.找出部门10中既不是经理也不是普通员工,而且工资大于等于2000的员工
select * from emp
where sal>2000 and deptno='10' and job !='MANAGER' and job !='CLERK';
7、找出有奖金的员工的不同工作
select distinct job from emp where comm is not null;
关键是要把我不同工作的含义,意思就是不重复。
有奖金就是需要排除null,所以设置is not null!
8.找出没有奖金或者奖金低于500的员工
select * from emp where comm<500 or comm is null;
9.显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
select ename,hiredate from emp order by hiredate;
关键是解决服务年限问题,使用order by语句,初始默认升序排列,asc,如果要降序使用desc。
10.找出每个月倒数第三天受雇的员工
select * from emp where hiredate=last_day(hiredate)-2;
11、分别用case和decode函数列出员工所在的部门,deptno=10显示'部门10',deptno=20显示'部门20',deptno=30显示'部门30',deptno=40显示'部门40',否则为'其他部门':
decode语句:
select ename,decode(deptno,'10','部门10'
,'20','部门20'
,'30','部门30'
,'40','部门40',
'其他部门')
from emp;
关键:
12、分组统计各部门下工资>500的员工的平均工资*/
Select avg(sal) from scott.emp where sal > 500 group by deptno
关键词,首先判断工资>500,然后是求平均工资,要求分组统计就需要开始思考用group by,在内部判断用where。
13、统计各部门下平均工资大于500的部门
select deptno from scott.emp group by deptno having avg(sal) > 500
首先是最后输出部门,先求平均工资,就势必涉及分组,然后再求平均工资大于500,建立在分组上的筛选,需要考虑having
14、算出部门30中得到最多奖金的员工奖金
select max(comm) from scott.emp where deptno = 30
关键词是最多奖金的员工奖金,最多需要用max(comm)
15、算出部门30中得到最多奖金的员工姓名
select ename from scott.emp where deptno = 30 and comm = (select max(comm) from scott.emp
where deptno = 30)
在部门30得到最多奖金员工奖金的基础上,此题需要考虑员工的姓名,最后输出是ename,此外要让奖金等于最多的人
16、算出每个职位的员工数和最低工资
select count(ename),min(sal) from emp group by job;
算出员工数和最低工资,所以需要用到count函数和min函数。对于count函数数的是行数,任意的内容都可行。
17、列出员工表中每个部门的员工数,和部门no
select count(ename),deptno from emp group by deptno;
员工数和部门no是关键,需要考虑的是解决每个部门的问题,用group by。
18、得到工资大于自己部门平均工资的员工信息 ????
select * from scott.emp e where sal > (select avg(sal) from scott.emp where e.deptno = deptno) ;
19、分组统计每个部门下,每种职位的平均奖金(也要算没奖金的人)和总工资(包括奖金)
select avg(nvl(comm,0)),sum(sal+nvl(comm,0)) from emp group by deptno,job;
平均工资用avg,总工资用sum,存在一个问题,奖金需要考虑null,这个时候就需要给nvl函数,让comm为0,,,,然后最后按照每个职位和部门就需要group by。
21、显示员工ID,名字,直属主管ID,名字