–SQL 练习训练一
1、 选择部门30中的雇员
select * from emp where deptno = 30;
2、 检索emp表中的员工姓名、月收入及部门编号
select ename 姓名 , sal 月收入, deptno 部门编号 from emp ;
3、 检索emp表中员工姓名、及雇佣时间(雇佣时间按照yyyy-mm-dd显示)
select ename , hiredate from emp;
4、 检索emp表中的部门编号及工种,并去掉重复行
select distinct deptno , job from emp;
5、 检索emp表中的员工姓名及全年的月收入
select ename , (sal+ifnull(comm,0) )*12 from emp;
6、 用姓名显示员工姓名,用年收入显示全年月收入。
select ename 姓名, (sal+ifnull(comm,0) )*12 年收入 from emp;
7、 检索月收入大于2000的员工姓名及月收入
select ename 姓名, sal+ifnull(comm,0) 月收入 from emp where sal+ifnull(comm,0) > 2000;
8、 检索月收入在1000元到2000元的员工姓名、月收入及雇佣时间
select ename 姓名, sal+ifnull(comm,0) 月收入 hiredate 雇用时间
from emp where sal+ifnull(comm,0) between 1000 and 2000;
9、 检索以S开头的员工姓名及月收入
select ename, sal from emp where ename like 'S%';
10、 检索emp表中月收入是800的或是1250的员工姓名及部门编号
select ename , deptno from emp where sal in (800,1250)
11、 显示在部门20中岗位是CLERK的所有雇员信息
select * from emp where deptno = 20 and job = 'CLERK';
12、 显示工资高于2500或岗位为MANAGER的所有雇员信息
select * from emp where sal > 2500 and job = 'MANAGER';
13、 检索emp表中有奖金的员工姓名、月收入及奖金
select ename, sal ,comm from emp where comm is not null;
14、 检索emp表中部门编号是30的员工姓名、月收入及提成,并要求其结果按月收入升序、然后按提成降序显示
select ename,sal,comm from emp where deptno = 30 order by sal, comm desc;
15、 列出所有办事员的姓名、编号和部门
select ename, empno, deptno from emp where job = 'CLERK';
select ename, empno, dname from emp e join dept d on e.deptno = d.deptno
where job = 'CLERK';
16、 找出佣金高于薪金的雇员
select * from emp where comm > sal;
17、 找出部门10中所有经理和部门20中的所有办事员的详细资料
select * from emp
where deptno = 10 and job = 'MANAGER' or deptno = 20 and job = 'CLERK';
# and 优先级 比or 高
18、 找出部门10中所有经理、部门20中所有办事员,既不是经理又不是办事员但其薪金 >=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;
select * from emp
where deptno = 10 and job = 'MANAGER' or deptno = 20 and job = 'CLERK' or job not in('MANAGER','CLERK') and sal >= 2000;
19、 找出收取奖金的雇员的不同工作
select distinct job from emp where comm is not null;
20、 找出不收取奖金或收取的奖金低于100的雇员
select * from emp where comm is null or comm < 100;
21、 找出各月倒数第三天受雇的所有雇员
# 找出每月的最后一天 -2 所获得的日期就是倒数第三天
select * from emp where ADDDATE(hiredate,2) = last_day(hiredate);
# 用当前时间 +3 判断是不是下个月的 1号
SELECT * FROM emp WHERE DATE_FORMAT(ADDDATE(hiredate,3),'%d') = 1
22、 获取当前日期所在月的最后一天
select last_day(now());
23、 找出早于25年之前受雇的雇员
# 1- 当前日期 和 员工入职时间 相减 > 25 年
select * from emp where timestampdiff(year,hiredate,now()) > 25
# 2- 当前日期 - 25 年 > 员工入职时间
select * from emp where adddate(now(), interval -35 year) > hiredate;
24、 显示正好为6个字符的雇员姓名
select ename from emp where length(ename) = 6;
25、 显示不带有’R’的雇员姓名
select ename from emp where ename not like '%R%';
26、 显示雇员的详细资料,按姓名排序
select * from emp order by ename;
27、 显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
select ename from emp order by hiredate;
28、 显示所有雇员的姓名、工作和薪金,按工作的降序顺序排序,而工作相同时按薪金升序
select ename,job,sal from emp order by job desc , sal ;
29、 显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日所在月排序,将最早年份的项目排在最前面
select ename , year(hiredate) 年份,month(hiredate) 月份 from emp
order by 月份,年份
30、 显示在一个月为30天的情况下所有雇员的日薪金
SELECT ename, ROUND(sal/30) FROM emp;
31、 找出在(任何年份的)2月受聘的所有雇员
select * from emp where month(hiredate) = 2;
32、 对于每个雇员,显示其加入公司的天数
select ename, datediff(now(),hiredate) from emp;
33、 显示姓名字段的任何位置,包含 “A” 的所有雇员的姓名
select ename from emp where ename like '%A%';
34、 以年、月和日显示所有雇员的服务年限
select ename, timestampdiff(year, hiredate,now()) 年,timestampdiff(month, hiredate,now()) 月,timestampdiff(day, hiredate,now()) 日 from emp
# 显示格式如下, 员工入职 20 年 3个月 零 5 天
35、 选择公司中有奖金 (COMM不为空,且不为0) 的员工姓名,工资和奖金比例,按工资逆排序,奖金比例逆排序.
select ename, sal/comm 比例 from emp where comm is not null and comm != 0
order by sal desc , 比例 desc;
36、 选择公司中没有管理者的员工姓名及job
select ename , job from emp where mgr is null;
37、 选择在1987年雇用的员工的姓名和雇用时间
select ename, hiredate from emp where year(hiredate) = 1987;
# 日期格式化
select ename, hiredate from emp where date_format(hiredate,'%Y') = 1987;
38、 选择在20或10号部门工作的员工姓名和部门号
select ename, deptno from emp where deptno in(10,20);
39、 选择雇用时间在1981-02-01到1981-05-01之间的员工姓名,职位(job)和雇用时间,按从早到晚排序.
select ename,job,hiredate from emp
where hiredate between '1981-02-01' and '1981-05-01' order by hiredate
40、 选择工资不在5000到12000的员工的姓名和工资
select ename,sal from emp where sal not between 5000 and 12000;
41、 查询员工号为7934的员工的姓名和部门号
select ename , deptno from emp where empno = 7934
42、 查询工资大于1200的员工姓名和工资
select ename , sal from emp where sal > 1200;