MySQL数据库 |
您所在的位置:网站首页 › mysql多表查询语句题目 › MySQL数据库 |
一、练习素材
创建表 --创建部门表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='张三'; |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |