7-2-查询练习
题目
1)显示员工姓名,根据其服务年限,将最老的员工排在最前面。
select * from emp order by hiredate asc;
说明:服务年限越大,则入职时间越早
或者:计算年限,进行排序
select * from emp order by TIMESTAMPDIFF(YEAR,CURRENT_TIME,hiredate)
TIMESTAMPDIFF(单位,开始时间,结束时间)
单位参数:YEAR(年)、MONTH(月)、DAY(日)、HOUR(时)、MINUTE(分)、SECOND(秒)
2)列出按年薪排序的所有员工的年薪,不包含奖金。
select ename,sal*12 年薪 from emp order by 2;
-- 或
select ename,sal*12 年薪 from emp order by 年薪;
3)列出按年薪排序的所有员工的年薪,包含奖金。
select ename,sal*12+IFNULL(comm,0) 年薪 from emp order by 年薪;
4)列出最低薪水大于1500的各种工作。
select job,min(sal) minSal from emp group by job having min(sal)>1500;
5)显示所有员工的姓名和加入公司的年份和月份,将员工入职年月从低到高排序。
select ename,year(hiredate) y,month(hiredate) m
from emp
order by y,m
6)显示在一个月为30天的情况下所有员工的日薪水,取整。
select ename, sal/30,TRUNCATE(sal/30,0) TRUN,ROUND(sal/30) r from emp;
7)找出在(任何年份的)2月受聘的所有员工。
select * from emp where month(hiredate)=2;
8)对于每个员工,显示其加入公司的天数。
select hiredate, TIMESTAMPDIFF(day,hiredate,CURRENT_DATE),DATEDIFF(CURRENT_DATE,hiredate) from emp;
9)列出薪水比“SMITH”多的所有员工。
select * from emp where sal>(select sal from emp where ename='smith')
或者
select e.*
from emp e, (select sal from emp where ename='smith') b
where e.sal>b.sal
10)列出所有员工的姓名及其直接上级的姓名。
select e.ename 员工,m.ename 上级
from emp e left join emp m on e.mgr=m.empno
11)列出受雇日期早于其直接上级的所有员工。
select e.ename 员工,e.hiredate 员工入职,m.ename 上级,m.hiredate 上级入职
from emp e inner join emp m on e.mgr=m.empno
where e.hiredate<m.hiredate;
12)列出部门名称和这些部门的员工信息,同时列出没有员工的部门。
select d.dname,e.ename
from dept d left join emp e on d.deptno=e.deptno;
13)列出所有“CLERK”(办事员)的姓名及其部门名称。
select d.dname,e.ename
from dept d inner join emp e on d.deptno=e.deptno
where job='CLERK'
14)列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
select d.dname,e.ename
from dept d inner join emp e on d.deptno=e.deptno
where d.dname='SALES'
或者使用子查询,只能显示员工姓名
select ename
from emp
where deptno=(select deptno from dept where dname='SALES')
15)列出薪水高于公司平均薪水的所有员工。
select * from emp where sal>(select avg(sal) from emp)