基于oracle数据库的emp表相关sql语句练习题分享
--1、选择部门10中的雇员
select * from emp where deptno = 10;
--2、列出所有销售员的姓名、工资、提成
select ename, sal, comm from emp where job = 'salesman';
--3、找出佣金高于薪金60%的雇员
select ename from emp where comm > sal * 0.6; -- null是不参与运算的
--4、找出部门10中所有经理和部门20中的所有办事员的详细资料
select *
from emp
where (deptno = 10 and job = 'manager')
or (deptno = 20 and job = 'clerk');
--5、找出部门10中所有经理、部门20中所有办事员,既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料
select *
from emp
where (deptno = 10 and job = 'manager')
or (deptno = 20 and job = 'clerk')
or (job not in ('manager', 'clerk') and sal >= 2000);
select *
from emp
where (deptno = 10 and job = 'manager')
or (deptno = 20 and job = 'clerk')
or (job <> 'manager' and job <> 'clerk' and sal >= 2000);
--6、找出收取佣金的雇员的不同工作
select distinct job from emp where comm > 0; --null不参与运算,所以可以忽略
select distinct job from emp where nvl(comm, 0) > 0; --也可以都转换为数字类型,再进行比较
--7、找出不收取佣金或收取的佣金低于100的雇员
select * from emp where nvl(comm,0)<100;
--8、找出各月最后一天受雇的所有雇员
select * from emp where hiredate = last_day(hiredate);
--9、找出早于20年之前受雇的雇员
select * from emp where (sysdate-hiredate)>20*365; --不太严谨
select * from emp where months_between(sysdate, hiredate) / 12 > 20;
--10、显示只有首字母大写的所有雇员的姓名
select ename from emp where ename = initcap (ename); --initcap 首字母大写 lower 全小写 upper 全大写
--11、显示正好为6个字符的雇员姓名
select ename from emp where length(ename) = 6;
--12、显示不带有'r'的雇员姓名
select ename from emp where ename not like '%r%' --%代表任意一个或多个字符
select ename from emp where instr(ename,'r') = 0;
--instr((ename,'r') 截取字符串并返回该字符在的起始位置,返回0,证明没有该字符
--13、显示所有雇员的姓名的前三个字符
select substr(ename,0,3) from emp;
select substr(ename,1,3) from emp;
--15、显示所有雇员的姓名,用a替换所有'a'
select replace(ename,'a','a') from emp;
--16、显示所有雇员的姓名以及满10年服务年限的日期
select ename, add_months(hiredate,12*10) 服务年限的日期 from emp
--17、显示所有雇员的姓名、工作和薪金,按工作降序排序,而工作相同时按薪金升序
select ename,job,sal from emp order by job desc,sal asc;
--18、显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日所在月排序,将最早年份的项目排在最前面
select ename, to_char(hiredate, 'yyyy') y_date, to_char(hiredate, 'mm') m_date
from emp
order by y_date,m_date
select ename, to_char(hiredate, 'yyyy') , to_char(hiredate, 'mm')
from emp
order by hiredate
--19、找出在(任何年份的)2月受聘的所有雇员
select * from emp where to_char(hiredate,'mm')=2
--20、对于每个雇员,显示其加入公司的天数
select ename,months_between(sysdate, hiredate)*30 from emp;
select ename, sysdate - hiredate from emp;
--21、显示姓名字段的任何位置,包含 "a" 的所有雇员的姓名
select * from emp where ename like '%a%'
select * from emp where instr(ename,'a')>0
--22、分别以年、月和日方式显示所有雇员的服务年限
select ename,
months_between(sysdate, hiredate) / 12 年,
months_between(sysdate, hiredate) 月,
sysdate - hiredate 日
from emp