博客
关于我
数据库之经典面试
阅读量:528 次
发布时间:2019-03-08

本文共 4264 字,大约阅读时间需要 14 分钟。

1,获取各个部门最高薪水的人员

在这里插入图片描述

使用连接查询

select e.department,e.`name`,t.dept,t.maxMoneyfrom 	(select e.department as dept,max(e.money) as maxMoney from employee e group by e.department)t	join		employee e	on 		t.dept = e.department	where 		e.money = t.maxMoney;
2,哪些人的薪水在部门的平均薪水之上
select	e.department,e.`name`,t.`平均薪水`,e.moneyfrom	(select		e.department as dept,avg(e.money) as 平均薪水	from		employee e	group by 		e.department)tjoin	employee eon	e.department = t.deptwhere	e.money > t.`平均薪水`;
3,求各个部门平均薪水的等级

表:在这里插入图片描述

select 	t.`部门` as 部门,t.`平均薪水` as 平均薪水,m.gradefrom 	(select e.department as 部门,avg(e.money) as 平均薪水 from employee e group by e.department)tjoin	moneygrade mon	t.`平均薪水` between m.low and m.high;
4, 不使用组函数max(),获取最高薪水

方案一:

select	e.name,e.moneyfrom 	employee eorder by 	e.money desc limit 1;

方案二:

第一步

select	distinct e.name ,e.moneyfrom	employee ejoin	employee bon 	e.money < b.money;

可以发现除了最大值,其他的值都符合要求

第二步

select e.name,e.money from employee e where e.money not in (select	distinct e.moneyfrom	employee ejoin	employee bon 	e.money < b.money);
5,求平均薪水最低的等级的部门名称
select 	t.departmentfrom 	(select e.department ,avg(e.money) as 平均薪水 from employee e group by e.department)tjoin	moneygrade m on 	t.平均薪水 between m.low and m.highwhere m.grade = (	select 		min(m.grade) 	from			(select 				t.department,t.`平均薪水`,m.grade 				from 					(select e.department ,avg(e.money) as 平均薪水 from employee e group by e.department)t				join moneygrade m 				on t.平均薪水 between m.low and m.high)m);
6,三个表,学生表(S),课程表( C),学生选课表(SC)

课程表:分别对应课号(cno),课名(cname),老师(cteacher)

在这里插入图片描述
学生表:学号(sno),姓名(sname)
在这里插入图片描述
课程表:学号(sno),课号(cno),成绩(scgrade)
学号,课号分别为外键
在这里插入图片描述
向学生表中添加数据
在这里插入图片描述
课程表添加数据
在这里插入图片描述
选课表添加数据
在这里插入图片描述
问题1:找出没选过郑老师的所有学生的姓名

select sname from s where sno not in 	(select sno from sc where cno = 		(select cno from c where cteacher = '郑老师'));

问题2:列出两门(含两门)以上不及格学生姓名及平均成绩

#分组先求每个人成绩小于60分的门数select 	sc.sno , s.sname ,count(*) as studentSumfrom	scjoin	son	s.sno = sc.snowhere	sc.scgrade < 60group by	sc.snohaving	studentSum >= 2;

问题3:即学过1号课程和2号课程所有学生的姓名

select	s.sname from 	scjoin	son	sc.sno = s.snowhere	cno = 1 and sc.sno in(		select sno from sc where cno = 2	);
7,新建两个表,分别为dept部门信息表和emp员工表

在这里插入图片描述

在这里插入图片描述

然后呢插入数据,emp表如下
在这里插入图片描述
dept表如下
在这里插入图片描述

1,列出所有的员工及领导的名字

select	e.ename,	b.ename as leadernamefrom	emp eleft join	emp bon	e.mgr = b.empno;

并出现结果

在这里插入图片描述
外连接查询的条数永远大于等于内连接

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

#列出受雇日期早于其上级的所有的员工编号,姓名,部门名称 select 	d.dname,e.empno,e.enamefrom	emp ejoin	emp bon	e.mgr = b.empnojoin	dept don	e.deptno = d.deptnowhere	e.hiredate < b.hiredate;

最终的数据为

在这里插入图片描述
3,列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

select	d.dname,e.*from	emp eright join	dept don	e.deptno = d.deptno;

4,列出至少有5个员工的所有部门

select 	e.deptno,count(e.ename) as	totalEmpfrom 	emp e group by 	e.deptno having totalEmp >= 5;

在这里插入图片描述

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

select 	enamefrom	empwhere	deptno = (select deptno from dept where dname = 'SALES');

6,列出薪资高于公司平均水平的所有员工,所在部门,上级领导

select 	e.ename,	d.dname,	b.enamefrom	emp ejoin	dept don	e.deptno = d.deptnoleft join	emp bon	e.mgr = b.empnowhere	e.sal > (select avg(sal) as angsal from emp);

7,列出薪水高于在部门30狗熊的所有员工的薪金的员工姓名和薪金,部门名称

select 	d.dname,	e.ename,	e.salFROM	emp ejoin	dept don	e.deptno = d.deptnowhere	e.sal > (select max(sal) as maxSal from dept);

8,列出在每个部门工作的员工数量,平均工资

select 	d.dname,count(*) as '人数',avg(e.sal) as '平均工资' from 	emp e join 	dept d on 	d.deptno = e.deptno group by	e.deptno;

9,列出所有的员工的姓名,部门名称和工资

select	e.ename as '员工姓名',	d.dname as '部门名称',	e.sal as '工资'from	emp ejoin	dept don	e.deptno = d.deptno

10,列出所有的部门的详细信息和人数

select 	d.deptno,d.dname,d.loc,count(e.ename) as totalEmpfrom	emp eright join	dept don	e.deptno = d.deptnogroup by	d.deptno,d.dname,d.loc;

11,列出各种工作的最低工资以及从事此工作的雇员姓名

select distinct	e.job,t.minSal,e.enamefrom 	emp ejoin		(select 		e.job,min(e.sal) as minSal	from		emp e	join		dept d	group by		e.job)ton	e.sal = t.minSal

12,列出各个部门MANAGER的最低薪金

select 	w.deptno,min(w.sal) as minSalfrom	emp wwhere	w.job = 'MANAGER'group by	w.deptno;

13,求出员工领导超过3000的员工名称和领导名称

select	e.ename,	b.ename as leadernamefrom	emp ejoin	emp bon	e.mgr = b.empnowhere	b.sal > 3000;

14,名字中带S字符的部门的工资合计和部门人数

select 	d.dname,	sum(e.sal) as sumMoney,	count(e.ename) as sumPeoplefrom	emp ejoin	dept don	e.deptno = d.deptnowhere	d.dname like '%S%'group by	d.dname

15,给任职期间超过30年的员工加薪

update	empset	sal = sal * 1.1where	(to_days(now()) - to_days(hiredate))/365 > 30;

转载地址:http://yahnz.baihongyu.com/

你可能感兴趣的文章
MYSQL中 find_in_set() 函数用法详解
查看>>
MySQL中auto_increment有什么作用?(IT枫斗者)
查看>>
MySQL中B+Tree索引原理
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>