MySQL数据库——多表查询练习2

一、练习素材

创建表

--创建部门表dept
create table dept (
dept1 int ,
dept_name varchar(11));

--创建员工表emp
create table emp (
sid int ,
name varchar(11),
age int,
worktime_start date,
incoming int,
dept2 int);

插入数据

--部门表插入数据
insert into dept values
(101,'财务'),
(102,'销售'),
(103,'IT技术'),
(104,'行政');

--员工表插入数据
insert into emp values(
1789,'张三',35,'1980/1/1',4000,101),
(1674,'李四',32,'1983/4/1',3500,101),
(1776,'王五',24,'1990/7/1',2000,101),
(1568,'赵六',57,'1970/10/11',7500,102),
(1564,'荣七',64,'1963/10/11',8500,102),
(1879,'牛八',55,'1971/10/20',7300,103);

查询表中数据如下图

二、练习题目

    1.找出销售部门中年纪最大的员工的姓名

    2.求财务部门最低工资的员工姓名

    3.列出每个部门收入总和高于9000的部门名称

    4.求工资在7500到8500元之间,年龄最大的人的姓名及部门

    5.找出销售部门收入最低的员工入职时间

    6.财务部门收入超过2000元的员工姓名

    7.列出每个部门的平均收入及部门名称

    8.IT技术部入职员工的员工号

    9.财务部门的收入总和;

    10.先按部门号大小排序,再依据入职时间由早到晚排序员工信息表

    11.找出哪个部门还没有员工入职;

    12.列出部门员工收入大于7000的部门编号,部门名称;

    13.列出每一个部门的员工总收入及部门名称;

    14.列出每一个部门中年纪最大的员工姓名,部门名称;

    15.求李四的收入及部门名称

    16.列出每个部门中收入最高的员工姓名,部门名称,收入,并按照收入降序

    17.列出部门员工数大于1个的部门名称

    19.查找张三所在的部门名称

参考答案

注:题目1、2、4、5、14、16题我用到的是嵌套查询

--1.找出销售部门中年纪最大的员工的姓名
      --其实这样做是由缺陷的,仅适用于题目年龄都不一样的情况
mysql> select name from dept d join emp e on d.dept1=e.dept2 
    -> where dept_name='销售'
    -> order by age desc
    -> limit 1;            
      --如果有两个人都是一样的最大年纪,那么应该像这样(嵌套查询)
mysql> select dept_name,name from dept join emp on dept1=dept2 
    -> where age=(select max(age) from dept,emp
    -> where dept1=dept2 and dept_name='销售')
    -> and dept_name='销售';

--2.求财务部门最低工资的员工姓名
mysql> select name from dept join emp on dept1=dept2
    -> where incoming=(select min(incoming) from dept,emp
    -> where dept1=dept2 and dept_name='财务')
    -> and dept_name='财务';

--3.列出每个部门收入总和高于9000的部门名称
mysql> select dept_name from dept d join emp e on d.dept1=e.dept2 
    -> group by dept_name
    -> having sum(incoming)>9000;

--4.求工资在7500到8500元之间,年龄最大的人的姓名及部门
mysql> select name,dept_name from dept join emp on dept1=dept2
    -> where age=(select max(age) from dept,emp
    -> where incoming between 7500 and 8500
    -> ) and incoming between 7500 and 8500;

--5.找出销售部门收入最低的员工入职时间
mysql> select worktime_start from dept join emp on dept1=dept2
    -> where incoming=(select min(incoming) 
    -> from dept,emp where dept1=dept2 and dept_name='销售'
    -> ) and dept_name='销售';

--6.财务部门收入超过2000元的员工姓名
mysql> select name from dept d join emp e on d.dept1=e.dept2 
    -> where dept_name='财务' and incoming>2000;

--7.列出每个部门的平均收入及部门名称
mysql> select avg(incoming),dept_name from dept d join emp e on d.dept1=e.dept2
    -> group by dept_name;

--8.IT技术部入职员工的员工号
mysql> select sid from dept d join emp e on d.dept1=e.dept2
    -> where dept_name='IT技术';

--9.财务部门的收入总和;
mysql> select sum(incoming) from dept d join emp e on d.dept1=e.dept2
    -> where dept_name='财务';

--10.先按部门号大小排序,再依据入职时间由早到晚排序员工信息表
mysql> select * from dept d join emp e on d.dept1=e.dept2
    -> order by dept1 asc,worktime_start asc;

--11.找出哪个部门还没有员工入职;
mysql> select dept_name from dept d left join emp e on d.dept1=e.dept2
    -> where name is NULL;

--12.列出部门员工收入大于7000的部门编号,部门名称;
mysql> select distinct dept_name,dept1 from dept d join emp e on d.dept1=e.dept2
    -> where incoming>7000;

--13.列出每一个部门的员工总收入及部门名称;
mysql> select sum(incoming),dept_name from dept d join emp e on d.dept1=e.dept2
    -> group by dept_name;

--14.列出每一个部门中年纪最大的员工姓名,部门名称;
      --比较巧妙的嵌套查询,某个员工在emp e2表中找不到任何age能够比emp e表中的某个age值大,
      --那么这样的某个值不就满足最大age的条件吗?!
mysql> select name,dept_name,age from dept d right join emp e on d.dept1=e.dept2
    -> where(
    -> select count(*) from emp e2 
    -> where e2.age>e.age and dept1=dept2
    -> )=0;

--15.求李四的收入及部门名称
mysql> select incoming,dept_name from dept d join emp e on d.dept1=e.dept2
    -> where name='李四';

--16.列出每个部门中收入最高的员工姓名,部门名称,收入,并按照收入降序
      --同14题的思路一样
mysql> select name,dept_name,incoming from dept d right join emp e on d.dept1=e.dept2
    -> where (
    -> select count(*) from emp e2
    -> where e2.incoming>e.incoming and dept1=dept2
    -> )=0
    -> order by incoming desc;

--17.列出部门员工数大于1个的部门名称
mysql> select dept_name from dept d join emp e on d.dept1=e.dept2
    -> group by dept_name
    -> having count(*)>1;

--19.查找张三所在的部门名称
mysql> select dept_name from dept d join emp e on d.dept1=e.dept2
    -> where name='张三';

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值