oracle 第二章 和 第三章 练习题
1.使用两种方式查询所有员工(EMP)信息
思路:这个* 代表查询全部的意思
(1)select *
from emp;
下面这个是分字段名来查询
(2)select empno, ename, job, mgr, hiredate, sal, comm, deptno
from emp;
2.查询(EMP)员工编号、员工姓名、员工职位、员工月薪、工作部门编号。
思路:这里是分字段名字来查询
select empno, ename, job, mgr, sal, comm, deptno
from emp;
3.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪。
思路:这里只是要工资的上调,就可以直接拿工资乘于上调的多少
select sal*1.2
from emp;
4.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)
思路:问的问题是没有转正前的六个月,和转正后的六个月 转正前是 sal6 转正后 sal1.26 然后再把他们相加
select ename 员工姓名,sal6+(sal1.26) 年薪
from emp;
5.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入(需考虑奖金部分),要求显示列标题为员工姓名,工资收入,奖金收入,总收入。
思路: 这里求出没有转正之前六个月的工资,加上转正之后六个月的工资,加上奖金部分 也有六个月的奖金。
select ename 员工名字,sal6+(sal1.26) 工资收入 ,nvl(comm12,0) 奖金收入, (sal6+(sal1.2*6))+nvl(comm,0)*12 总收入
from emp
6.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入(需考虑奖金部分),要求显示格式为:XXX的第一年总收入为XXX。
思路:跟第5题一样, 不过这里需要连接字符。 用双横杠连接 ||
select ename||‘的第一年总收入为’||((sal6)+(sal1.2*6)+nvl(comm,0)*12) 员工的第一年收入
from emp;
7.查询员工表中一共有哪几种岗位类型。
思路:查询员工表,它里面会有重复项 要去重
select distinct job 岗位类型
from emp;
8.分别选择员工表、部门表、薪资等级表中的所有数据。
思路: 查表
select ename, job ,sal from emp;
9.分别查看员工表、部门表、薪资等级表的表结构。
desc emp;
desc bonus;
desc dept;
1.查询职位为SALESMAN的员工编号、职位、入职日期。
思路:这里用到了限制条件,要求只显示某一职位的员工编号信息
select empno 员工编号,job 职位,hiredate 入职日期
from emp
where job= ‘SALESMAN’;
2.查询1985年12月31日之前入职的员工姓名及入职日期。
思路:这里的需求是比入职日期比上面前的员工信息,就可以用到比较操作符和to_date 函数
select ename 员工名字 ,hiredate 入职时间
from emp
where hiredate > to_date(‘1985-12-31’,‘YYYY-MM-DD’)
3.查询部门编号不在10部门的员工姓名、部门编号
思路:思路:这里用到了限制条件,要求它不等于10的部门编号
select ename 员工名字,deptno 部门编号
from emp
where deptno <>10;
4.查询入职日期在82年至85年的员工姓名,入职日期。
需求是:求这个在区间入职的员工
SELECT ename 员工名字,hiredate 入职日期
FROM emp
WHERE hiredate BETWEEN to_date(‘1982-01-01’,‘YYYY-MM-DD’) AND to_date(‘1985-01-01’,‘YYYY-MM-DD’)
5.查询月薪在3000到5000的员工姓名,月薪。
需求是: 工资在这个区间的员工
SELECT ename 员工名字,sal 月薪
FROM emp
WHERE sal between 3000 and 5000
6.查询部门编号为10或者20的员工姓名,部门编号。
思路: 用in 查询 这几个员工编号 是否为10 或者 20
select ename 员工名字 , deptno 员工编号
from emp
where deptno in (10,20 )
7.查询经理编号为7902, 7566, 7788的员工姓名,经理编号。
select ename 员工名字 , mgr 经理编号
from emp
where mgr in (7902, 7566, 7788)
8.查询员工姓名以W开头的员工姓名。
思路 : 模糊查询 查开头 就把 % 放在第二个位置
select ename 员工名字
from emp
where ename like ‘W%’
9.查询员工姓名倒数第2个字符为T的员工姓名。
思路: 查倒数的第二个也用模糊查询 , 把%放在 T 前面 在T后面加一个_
select ename 员工名字
from emp
where ename like ‘%T_’
10.查询奖金为空的员工姓名,奖金。‘
思路 : 查询 是否为空 用 is null
select ename 员工名字 , comm 奖金
from emp
where comm is null
练习4
11.查询工资超过2000并且职位是MANAGER,或者职位是SALESMAN的员工姓名、职位、工资
思路 : 这里看到 超过 就是 比较运算符 还有 等于。 还看到或者 这里就用 逻辑运算符
select ename 员工名字,job 职位,SAL 工资
from emp
where sal > 2000 or job = ‘MANAGER’
12.查询工资超过2000并且职位是 MANAGER或SALESMAN的员工姓名、职位、工资。
思路: 这里看到 超过 就是 比较运算符 还有 等于。 还看到或者 这里就用 逻辑运算符 在逻辑运算符里面加个 括号 让他们先筛选
select ename 员工名字,job 职位,SAL 工资
from emp
where sal > 2000 and (job = ‘MANAGER’ or job = ‘SALESMAN’)
13.查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。
思路: 这里的需求是 10 或者 20 看到这个就用 in , 看到后面 什么到 什么之间 就用 between and
select ename 员工名字,deptno 部门,SAL 工资
from emp
where (deptno in (10,20)) and (sal BETWEEN 3000 and 5000)
14.查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位。
思路:查询在81年上班的员工 , 限定日期时间 , 还要限定 模糊匹配的条件
select ename 员工名字,hiredate 入职日期 ,job 职位
from emp
where (hiredate > to_date(‘1981-01-01’,‘YYYY-MM-DD’) and hiredate < to_date(‘1981-12-01’,‘YYYY-MM-DD’)) and (job not like ‘SALES_%’)
15.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名包含A的员工姓名、职位、部门编号。
思路 :
select ename 员工名字,job 职位 ,deptno 部门编号
from emp
where (job =‘SALESMAN’ or job = ‘MANAGER’) and (DEPTNO in (10,20 )) and ename like ‘%A%’
练习5
16.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。
思路 :
select ename 员工名字,deptno 部门编号 ,sal 工资
from emp
where deptno in ( 20,30)
order by SAL
17.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。
select ename 员工名字,deptno 部门编号 ,sal 工资
from emp
where (sal between 2000 and 3000) and deptno <> 10
order by 2, 3 desc
18.查询入职日期在82年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序排序。
select ename,hiredate,job from emp where hiredate between ‘1-1月-82’ and ‘31-12月-83’
and job like ‘MAN_%’ or job like ‘SALES_%’
order by hiredate asc,sal desc;
19.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。
思路: 限定条件为 在这个之后 就要 hiredate小于· 还有一个限定条件是 工作不等于 SALESMAN
select ename 员工姓名,hiredate 入职时间,job 职位
from emp
where hiredate > to_date(‘1982-7-9’,‘YYYY-MM-DD’) and job <> ‘SALESMAN’
20.查询员工姓名的第三个字母是a的员工姓名。
SELECT ename
from emp
where ename like ‘__a%’
SELECT ename
from emp
where ename like ‘__A%’
21.查询除了10、20号部门以外的员工姓名、部门编号。
select ename,deptno
from emp
where deptno not in (10,20);
22.查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序。
select *
from emp
where deptno = 30
order by sal desc ,ename
23.查询没有上级的员工(经理号为空)的员工sele
select ename 员工名字
from emp
where mgr is null
24.查询工资大于等于4500并且部门为10或者20的员工的姓名工资、部门编号。
select ename 员工名字, sal 工资, deptno 部门编号
from emp
where (sal >= 4500) and (deptno in (10,20))