数据库之经典面试

简介: 数据库之经典面试
1,获取各个部门最高薪水的人员

使用连接查询

select e.department,e.`name`,t.dept,t.maxMoney
from 
  (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.money
from
  (select
    e.department as dept,avg(e.money) as 平均薪水
  from
    employee e
  group by 
    e.department)t
join
  employee e
on
  e.department = t.dept
where
  e.money > t.`平均薪水`;
3,求各个部门平均薪水的等级

表:

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

方案一:

select
  e.name,e.money
from 
  employee e
order by 
  e.money desc limit 1;

方案二:

第一步

select
  distinct e.name ,e.money
from
  employee e
join
  employee b
on 
  e.money < b.money;

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

第二步

select e.name,e.money from employee e where e.money not in (select
  distinct e.money
from
  employee e
join
  employee b
on 
  e.money < b.money);
5,求平均薪水最低的等级的部门名称
select 
  t.department
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
where 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 studentSum
from
  sc
join
  s
on
  s.sno = sc.sno
where
  sc.scgrade < 60
group by
  sc.sno
having
  studentSum >= 2;

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

select
  s.sname 
from 
  sc
join
  s
on
  sc.sno = s.sno
where
  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 leadername
from
  emp e
left join
  emp b
on
  e.mgr = b.empno;

并出现结果

外连接查询的条数永远大于等于内连接

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

#列出受雇日期早于其上级的所有的员工编号,姓名,部门名称
 select 
  d.dname,e.empno,e.ename
from
  emp e
join
  emp b
on
  e.mgr = b.empno
join
  dept d
on
  e.deptno = d.deptno
where
  e.hiredate < b.hiredate;

最终的数据为

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

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

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

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

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

select 
  ename
from
  emp
where
  deptno = (select deptno from dept where dname = 'SALES');

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

select 
  e.ename,
  d.dname,
  b.ename
from
  emp e
join
  dept d
on
  e.deptno = d.deptno
left join
  emp b
on
  e.mgr = b.empno
where
  e.sal > (select avg(sal) as angsal from emp);

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

select 
  d.dname,
  e.ename,
  e.sal
FROM
  emp e
join
  dept d
on
  e.deptno = d.deptno
where
  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 e
join
  dept d
on
  e.deptno = d.deptno

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

select 
  d.deptno,d.dname,d.loc,count(e.ename) as totalEmp
from
  emp e
right join
  dept d
on
  e.deptno = d.deptno
group by
  d.deptno,d.dname,d.loc;

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

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

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

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

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

select
  e.ename,
  b.ename as leadername
from
  emp e
join
  emp b
on
  e.mgr = b.empno
where
  b.sal > 3000;

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

select 
  d.dname,
  sum(e.sal) as sumMoney,
  count(e.ename) as sumPeople
from
  emp e
join
  dept d
on
  e.deptno = d.deptno
where
  d.dname like '%S%'
group by
  d.dname

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

update
  emp
set
  sal = sal * 1.1
where
  (to_days(now()) - to_days(hiredate))/365 > 30;
相关文章
|
26天前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
3月前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
4月前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
5月前
|
canal 消息中间件 缓存
面试题:如何解决缓存和数据库的一致性问题?
面试题:如何解决缓存和数据库的一致性问题?
90 1
|
4月前
|
缓存 监控 Go
[go 面试] 缓存策略与应对数据库压力的良方
[go 面试] 缓存策略与应对数据库压力的良方
|
5月前
|
SQL 关系型数据库 MySQL
java面试之MySQL数据库篇
java面试之MySQL数据库篇
51 0
java面试之MySQL数据库篇
|
5月前
|
SQL 安全 Java
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
55 0
|
5月前
|
druid Java 数据库连接
Java面试题:解释数据库连接池的概念及其作用,讨论常见的连接池实现。
Java面试题:解释数据库连接池的概念及其作用,讨论常见的连接池实现。
93 0
|
5月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
71 0

热门文章

最新文章