数据库---34练习题

1、取得每个部门最高薪水的人员名称

select e.ename ,t.* 
from emp e 
join (select deptno,max(sal) maxsal from emp group by deptno) t 
on t.deptno=e.deptno and t.maxsal=e.sal;

2、哪些人的薪水在部门的平均薪水之上

select e.ename, e.sal 
from emp e 
join (select deptno,avg(sal) avgsal  from emp group by deptno) t 
on( e.deptno=t.deptno and (e.sal > t.avgsal));

3、取得部门中(所有人的)平均的薪水等级

select e.ename,e.deptno,s.grade 
from emp e
join salgrade s 
on e.sal between s.losal and s.hisal;
select t.deptno,avg(grade) from  t group by t.deptno;//第一条语句看作表t

4、不准用分组函数(Max),取得最高薪水

select e.ename,e.sal 
from emp e 
order by e.sal desc 
limit 0,1;

5、取得平均薪水最高的部门的部门编号

select e.deptno,avg(sal) as avgsal from emp e group by deptno; 
select t.deptno,max(avgsal) from t;

6、取得平均薪水最高的部门的部门名称

select t.deptno,d.dname,max(avgsal) 
from (select e.deptno,avg(sal) as avgsal from emp e group by deptno) t 
join dept d 
on t.deptno =d.deptno;

7、求平均薪水的等级最低的部门的部门名称

select e.deptno,avg(sal) as avgsal from emp e group by e.deptno order by avgsal limit 0,1;
select e.deptno,d.dname,avg(sal) as avgsal from emp e join dept d on e.deptno=d.deptno group by e.deptno order by avgsal limit 0,1;

8、取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名

第一步,找出普通员工的最高工资
not in在用的时候记得排除null

select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null)

第二部找出高于1600的(比普通员工最高薪水还要高的一定是领导,因为已经是普通里面最高的了)

select ename,sal from emp where sal>(select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null));

9、取得薪水最高的前五名员工

select e.ename ,e.sal from emp e order by e.sal desc limit 0,5;

10、取得薪水最高的第六到第十名员工

select e.ename ,e.sal from emp e order by e.sal desc limit 5,5;

11、取得最后入职的5名员工

select e.ename ,e.hiredate from emp e order by e.hiredate desc limit 0,5;

12、取得每个薪水等级有多少员工

select s.grade ,count(grade) from emp e join salgrade s on e.sal between s.losal and s.hisal group by grade;

14、列出所有员工及领导的姓名

select a.ename '员工',b.ename '领导' from emp a left join emp b on a.mgr =b.empno;

15、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称

select a.ename '员工',a.hiredate,b.ename '领导',b.hiredate,d.dname 
from emp a
join emp b
on a.mgr=b.empno
join dept d
on a.deptno=d.deptno
where a.hiredate<b.hiredate;

16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

select d.dname,e.* from emp e right join dept d on d.deptno=e.deptno;

17、列出至少有5个员工的所有部门

select e.deptno,d.dname,count(e.ename) as sum from emp e join dept d on e.deptno=d.deptno group by e.deptno having sum >=5 ;

18、列出薪金比"SMITH"多的所有员工信息

select e.sal from emp e where e.ename ='smith';
select e.* from emp e where e.sal>(select e.sal from emp e where e.ename ='smith');

19、列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数
select e.name,d.dname from emp e where e.job=‘clerk’ join dept d on e.deptno=d.deptno ;

select e.ename,d.dname,e.deptno from emp e join dept d on e.deptno=d.deptno where e.job='clerk'; m
select e.deptno,count(*) as sum from emp e group by e.deptno; n

from后面接where语句,后面有可能连接就是 from …join …on…where

select m.ename ,m.dname  ,sum from (select e.ename,d.dname,e.deptno from emp e join dept d on e.deptno=d.deptno where e.job='clerk')m join (select e.deptno,count(*) as sum from emp e group by e.deptno)n on m.deptno =n.deptno;

20、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数

select e.job,e.sal from emp e where e.sal>1500; m
select e.job,count(*) as sum from emp e group by e.job; n
select distinct m.job,n.sum from (select e.job,e.sal from emp e where e.sal>1500)m join (select e.job,count(*) as sum from emp e group by e.job)n on m.job=n.job;

以上没考虑最低薪资

select e.job,min(sal) as minsal from emp e group by e.job having minsal >1500; m

select distinct m.job,n.sum from (select e.job,min(sal) as minsal from emp e group by e.job having minsal>1500)m join (select e.job,count(*) as sum from emp e group by e.job)n on m.job=n.job;

21、列出在部门"SALES"<销售部>工作的员工的姓名,假定不知道销售部的部门编号
知道部门编号

select e.ename,d.dname 
from emp e 
join dept d 
on e.deptno =d.deptno 
where e.deptno=30;

不知道编号

	select e.ename from emp e where e.deptno=(select deptno from dept  where dname ='sales');

22、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级

select avg(sal)avgsal from emp ;//找出平均工资
select e.ename as '员工',a.ename as '领导', d.dname,s.grade from emp e 
left join emp a  //左外链接
on e.mgr=a.empno
join dept d 
on e.deptno=d.deptno 
join salgrade s 
on e.sal between s.losal and s.hisal
where e.sal>(select avg(sal)avgsal from emp)

23、列出与"SCOTT"从事相同工作的所有员工及部门名称

select e.ename,d.dname from emp e 
join dept d
on d.deptno=e.deptno
where e.job=(select e.job from emp e where e.ename='scott')
and e.ename !='scott';

24、列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金

select distinct e.sal from emp e where e.deptno =30;

select e.ename,e.sal from emp e 
where sal in (select distinct e.sal from emp e where 	e.deptno =30)
and deptno !=30;

25、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金.部门名称

select max(sal) maxsal from emp where deptno =30;

select e.ename,e.sal,d.dname 
from emp e
join dept d
on e.deptno=d.deptno
where e.sal>(select max(sal) maxsal from emp where deptno =30);

26、列出在每个部门工作的员工数量,平均工资和平均服务期限
计算年差TimeStampDiff(间隔类型,前一个日期,后一个日期)
例如距离现在差了多少年:TimeStampDiff(year, 前一个日期, now())
select TimeStampDiff(year, hiredate, now()) from emp;
间隔类型有:second秒,minute分,hour时,day天,week周,month月,quarter季度,year年

select d.dname,
count(e.ename) as sum,i
fnull(avg(e.sal),0),
ifnull(avg(TimeStampDiff(year, hiredate, now())) ,0) as avgyear
from emp e
right join dept d
on e.deptno =d.deptno
group by d.dname;

27、列出所有员工的姓名、部门名称和工资

select e.ename,d.dname,e.sal 
from emp e
join dept d
on e.deptno =d.deptno;

28、列出所有部门的详细信息和人数

select d.* ,t.sum from dept d
left join (select e.deptno,count(e.ename) as sum from emp e
group by e.deptno) t

on t.deptno =d.deptno;

29、列出各种工作的最低工资及从事此工作的雇员姓名

select e.ename,t.* from emp e 
join (select e.job,min(e.sal) as minsal from emp e group by e.job) t
on  t.job=e.job and t.minsal=e.sal;

30、列出各个部门的MANAGER(领导)的最低薪金

select  e.deptno,min(sal) from emp e 
where job='MANAGER'
group by e.deptno;

31、列出所有员工的年工资,按年薪从低到高排序

select e.ename,sal*12+ifnull(comm,0))as '年薪' from emp e order by '年薪' asc;
//'年薪'这样不行

select e.ename,(sal+ifnull(comm,0))*12 as yearsal from emp e order by yearsal asc;

32、求出员工领导的薪水超过3000的员工名称与领导名称

select a.ename '员工',b.ename'领导',b.sal as mgrsal
from emp a
left join emp b
on a.mgr=b.empno;

select t.* 
from ()t 
where t.mgrsal>3000;

select a.ename '员工',b.ename'领导',b.sal as mgrsal
from emp a
left join emp b
on a.mgr=b.empno
where b.sal >3000;
//如果重命名为条件就是刚查出的数据看作临时表了,如果直接b.sal是在查原表中领导的钱大于3000

33、求出部门名称中,带’S’字符的部门员工的工资合计、部门人数

select d.deptno,d.dname,d.loc,count(e.ename),sum(e.sal)
from emp e
right join dept d
on e.deptno=d.deptno
where d.dname like '%s%'
group by d.deptno,d.dname,d.loc;

34、给任职日期超过30年的员工加薪10%

update emp set sal =sal*1.1 where timestampdiff(year,hiredate,now())>30;
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值