话不多说,直接导入三张表: 员工表:em
部门表:dept
薪资等级表:salgrade
以下DQL语句是基于上面三张表进行的。
思路: 第一步:取得每个部门最高薪水(部门分组,求薪水最大值)
第二步:将第一步的表当作临时表与emp表做连接 连接条件e.deptno=t.deptno and e.sal=t.maxsal
思路: 第一步:找出部门的平均薪资
第二步:找出高于平均薪资的人
tip:
平均的薪水等级:先计算每一个薪水的等级,然后找出薪水等级的平均值。 平均薪水的等级:先计算平均薪水,然后找出每个平均薪水的等级值。
思路: 第一步:找出每个人的薪水等级
第二步:找出薪水等级的平均值
思路: 将薪水降序排列,用limit取第一个数
思路: 第一步:取得每个部门的平均薪水
第二步:找出以上结果中avgsal最大的值。
第三步:找出部门编号
方案一思路: 第一步:取得每个部门的平均薪水
第二步:取平均薪水最高的部门
第三步:找出部门名称
方案二:
tip:
平均薪水最低的对应的等级一定是最低的
思路: 第一步:平均薪水最低的
第二步:找出对应的等级
思路: 第一步:“普通员工的最高薪水”还要高的一定是领导!找出领导
第二步:不在上面的都是普通员工
第三步:找出高于1600的
思路: 将薪水降序排列limit取前五
思路: 将薪水降序排列limit取6到10名
思路: 将入职日期降序排,取前五
思路: 第一步:找出每个员工的薪水等级
第二步:进行分组
tip:
员工的领导编号等于领导的员工编号
思路: 将员工表看成一个员工表 a,领导表 b
思路: 员工表和部门表进行外连接(此处使用右外连接)
思路: 第一步:找出job是CLERK的所有的人名和部门名称:
第二步:每个部门的人数
第三步:将上边两个表做连接:
思路: 第一步找出销售部门编号:
第二步:知道销售部的部门编号找出员工姓名:
select a.ename '姓名',d.dname '部门', b.ename '上级领导',s.grade '工资等级'
from emp a
join dept d
on a.deptno=d.deptno and a.sal>(select avg(sal)
from emp)
left join emp b
on a.mgr=b.empno
join salgrade s
on a.sal between s.losal and hisal;
select e.ename,d.dname
from emp e
join dept d
on e.deptno=d.deptno
where e.job=(select job from emp where ename='SCOTT') and e.ename<>'SCOTT';
思路: 第一步:列出部门30的员工薪资
select distinct sal,deptno from emp where deptno=30;
第二步:找出薪资等于上表的员工信息
select e.sal,e.ename,d.dname
from emp e
join dept d
on e.deptno=d.deptno
where e.sal in (select distinct sal from emp where deptno=30) and e.deptno<> 30;
select e.sal,e.ename,d.dname
from emp e
join dept d
on e.deptno=d.deptno
where e.sal > (select max(sal) from emp where deptno=30) and e.deptno<> 30;
tip:
在mysql当中怎么计算两个日期的“年差”,差了多少年? TimeStampDiff(间隔类型, 前一个日期, 后一个日期) timestampdiff(YEAR, hiredate, now()) 间隔类型: SECOND 秒, MINUTE 分钟, HOUR 小时, DAY 天, WEEK 星期 MONTH 月, QUARTER 季度, YEAR 年
select d.dname,d.deptno,count(e.ename) ecount,ifnull(avg(e.sal),0) avgsal, ifnull(avg(timestampdiff(YEAR, hiredate, now())),0) as avgservicetime
from emp e
join dept d
on e.deptno=d.deptno
group by d.deptno;
select e.ename,d.dname,e.sal
from emp e
join dept d
on e.deptno=d.deptno;
select d.deptno,d.dname,d.loc,count(e.ename)
from emp e
right join dept d
on e.deptno=d.deptno
group by d.deptno,d.dname,d.loc;
思路: 第一步:按工作分组,找出各种工作的最低工资
select min(sal),job
from emp
group by job;
第二步:找出从事工作的雇员信息
select e.*
from emp e
join (select min(sal) minsal,job from emp group by job) t
on e.job=t.job and e.sal=t.minsal;
select job,deptno,min(sal)
from emp
where job='MANAGER'
group by deptno;
select ename,(sal+ifnull(comm,0)) *12 incone
from emp
order by incone asc;
select a.ename '员工',b.ename '领导'
from emp a
join emp b
on a.mgr=b.empno
where b.sal>3000;
select d.deptno,d.dname,d.loc,ifnull(sum(e.sal),0),count(e.ename)
from dept d
left join emp e
on d.deptno=e.deptno
where dname like'%S%'
group by d.deptno,d.dname,d.loc;
update emp set sal = sal * 1.1 where timestampdiff(YEAR, hiredate, now()) > 30;
加薪之前:
加薪之后:
一起加油,一起努力,一起秃见成效