肖SIR__数据库之多表练习__12.2

已知2张基本表:部门表:dept (部门号,部门名称);员工表 emp(员工号,员工姓名,年龄,入职时间,收入,部门号)
1:dept表中有4条记录:
部门号(dept1) 部门名称(dept_name )
101 财务
102 销售
103 IT技术
104 行政
2:emp表中有6条记录:
员工号 员工姓名 年龄 入职时间 收入 部门号对应字段名称为: (sid name age worktime_start incoming dept2)
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.列出每个部门的平均收入及部门名称;

结果:

emp: avg(incoming) ,dept_name     

dept:  dept_name        group   by 

条件:group  by   dept_name

 

方法1:【有链接+条件(分组)】

select dept_name,avg(incoming) from dept right join emp on dept.dept1=emp.dept2 group by dept_name ;

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

 

结果:

emp:  sum(incoming)

dept  :dept_name='财务'

方法1:select  sum(incoming ) from dept left join  emp  on  dept.dept1=emp.dept2  where dept_name="财务" ;

方法2:   select sum(incoming) from emp where dept2=(select dept1 from dept where dept_name='财务' );

方法3:select sum(incoming) from (select  *  from   dept    right    join emp   on   dept.dept1=emp.dept2 ) as a where dept_name='财务'
3.It技术部入职员工的员工号

结果:emp :sid

条件:dept    dept_name='IT 技术部门’

方法1:select sid from dept inner join emp on dept.dept1=emp.dept2 where dept_name="IT技术";

方法2:select sid from emp where dept2=(select dept1 from dept where dept_name='IT技术' ) ;


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

结果:name

条件:dept :  dept_name='财务'         incoming>2000

方法1:select name from  dept inner join emp on dept.dept1=emp.dept2  where dept_name="财务" and incoming>2000;

方法2:select  name  from  emp  where  incoming>2000 and dept2=(select  dept1  from  dept  where  dept_name='财务')

方法3:select a.name from (SELECT * from dept INNER JOIN emp on dept.dept1=emp.dept2  where dept_name='财务' )as a where a.incoming>2000

 

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

结果:worktime_start

条件:min(incoming)     ,dept_name='销售' 

方法1:SELECT woektime_start from dept left join emp on dept.dept1=emp.dept2 where dept_name="销售" and incoming=(SELECT min(incoming) from dept inner join emp on dept.dept1=emp.dept2 and dept2=(select dept1 from dept where dept_name='销售'))

 方法2:

select worktime_start from emp where (dept2,incoming)in(select dept2,min(incoming) from emp where dept2=(select dept1 from dept where dept_name="销售"));


6.找出年龄小于平均年龄的员工的姓名,ID和部门名称(所有员工平均年龄)

 结果: name  sid  dept_name

条件  :avg(age) ,  age

方法1:select name,sid,dept_name from dept right join emp on dept1=dept2 where age< (select avg(age) from emp);

方法2:select name,dept_name,age from emp LEFT JOIN dept on emp.dept2=dept.dept1 where age<(SELECT avg(age) from dept INNER JOIN emp on dept.dept1=emp.dept2 )


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

结果:dept_name

条件:  sum(incoming)>9000  ,group  by   dept_name

 方法1:select dept_name from emp INNER JOIN dept on emp.dept2=dept.dept1 group by dept_name having sum(incoming)>9000;

方法2:select a.dept_name from   (select dept_name,sum(incoming) from dept LEFT JOIN emp on dept.dept1=emp.dept2 GROUP BY dept_name  HAVING sum(incoming)>9000)a;

方法3:select dept_name from (select sum(incoming) sum1,dept_name from dept left join emp on dept.dept1=emp.dept2 group by dept_name)s where s.sum1>9000;

 

 

8.查出财务部门工资少于3800元的员工姓名

结果: name

条件:dept_name  =' 财务'     incoming<3800

方法1:select name,dept_name from dept inner join emp on dept.dept1=emp.dept2 where dept_name="财务" and incoming<3800;

方法2:select name from emp where dept2 =(select dept1 from dept where dept_name='财务') and incoming<3800;


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

结果:name

条件:
dept:  dept_name='财务'
emp:  min( incoming)

方法1:

select name  from dept right join emp on dept.dept1=emp.dept2 where dept_name="财务" and  incoming=(select min(incoming) from dept right join emp on dept.dept1=emp.dept2 where dept_name="财务");

方法2 :(只能显示一个,有多个一样)

select name from emp,dept  where dept1=dept2 and dept_name='财务' order by incoming limit 0,1;

 方法3:

select name from emp where (incoming,dept2) = (select min(incoming),dept2 from dept join emp on dept1=dept2 group by dept_name having dept_name='财务');

 

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

结果: name

条件:  dept_name='销售'         max(age)

方法1:

select emp.name from emp left join dept on emp.dept2=dept.dept1 where age=(select max(age) from emp left join dept on emp.dept2=dept.dept1 where dept.dept_name="销售") and dept.dept_name="销售";

方法2:(缺陷:有多个结果,就显示一个)

select name from emp inner join dept on emp.dept2=dept.dept1 where dept_name='销售' ORDER BY age desc limit 1

方法3:

select b.name from (select * from dept join emp on dept1=dept2 where dept_name="销售") b where age=(select max(age) from dept join emp on dept1=dept2 where dept_name="销售");
11.求收入最低的员工姓名及所属部门名称:

结果: name  ,  dept _name

条件: min(incoming) 

方法1:

select name,dept_name from emp left join dept on dept1=emp.dept2
where incoming=(select min(incoming)from emp left join dept on dept.dept1=emp.dept2);

方法2:

SELECT name,dept_name from dept INNER JOIN emp on dept.dept1=emp.dept2  WHERE incoming=(SELECT min(incoming)from  emp );

 

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

结果:incoming   ,dept_name

条件:name='李四'

方法1:Select incoming,dept_name from dept inner join emp on dept1=dept2 where name='李四';

 

13.求员工收入小于4000元的员工部门编号及其部门名称
结果:   dept2   ,dept_name

条件:  incoming<4000

方法1:SELECT dept1,dept_name  from dept INNER JOIN emp on dept.dept1=emp.dept2 WHERE incoming<4000;

 方法2:

SELECT  dept_name,dept1   from dept WHERE dept1 in (select  dept2 from  emp  where incoming<4000)  ;

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

方法1:先求每个部门名称和最高工资,在使用合表区匹配(部门名称和薪资一样的员工)

select name,dept_name,incoming from emp join dept on dept1=dept2 where (dept2,incoming) in (select dept2,max(incoming) incoming from emp group by dept2) order by incoming desc;

方法2:

select name,incoming,dept_name from dept INNER JOIN
(SELECT emp.name,emp.incoming,emp.dept2 from emp RIGHT JOIN
(select MAX(incoming) as incoming ,dept2 from emp group by dept2)c
on emp.dept2=c.dept2 and emp.incoming=c.incoming)b
On dept.dept1=b.dept2 ORDER BY incoming DESC;

方法3:

select  b.name,b.incoming,b.dept_name from  (select MAX(incoming) as incoming ,dept2 from emp group by dept2)a INNER JOIN (select * from dept INNER JOIN emp where  dept1=dept2 )b  on a.incoming=b.incoming and  a.dept2=b.dept2  ORDER BY b.incoming desc ;

方法4:(有缺陷的方法)先降序排出最高工资的人员,在分组,在派排序

select name,dept_name,incoming from (select *from dept a inner join emp b ON
a.dept1=b.dept2 ORDER BY incoming desc )s group by s.dept_name order by incoming
desc

 

15.求出财务部门收益最高的俩位员工的姓名,工号,收益

结果: name  , sid ,incoming

条件:dept_name='财务'       limit   0,2

方法1:

SELECT name,sid,incoming  from dept INNER JOIN emp on dept.dept1=emp.dept2 WHERE dept_name="财务" ORDER BY incoming  desc  limit 0,2 ;

方法2:

select name,sid,incoming from (select * from emp join dept on dept1=dept2 where dept_name='财务' order by incoming desc )as a limit 0,2;

方法3:

SELECT NAME,sid,incoming from emp  WHERE dept2=(SELECT dept1 FROM dept WHERE dept_name='财务') ORDER BY incoming desc LIMIT 2;

 

16.查询财务部低于平均收入的员工号与员工姓名:(全部员工平均收入)

结果: sid ,name

条件:dept_name='财务'      avg(incoming)

方法1:

select sid,name from dept inner join emp on dept.dept1=emp.dept2 where incoming<(select avg(incoming)from dept right join emp on dept.dept1=emp.dept2) and dept_name="财务";

方法2:

select sid,name from (select * from dept LEFT JOIN emp on dept.dept1=emp.dept2 WHERE dept_name="财务")q where q.incoming<(select avg(incoming) from emp);

方法3:

SELECT sid,name,incoming from dept INNER JOIN emp on dept.dept1=emp.dept2 WHERE dept_name="财务" and  incoming<(select avg(incoming) from emp);

方法4:

select name,sid from dept INNER JOIN emp  on dept.dept1=emp1.dept2 where incoming<(select avg(incoming)from emp1 where dept2=(select dept1 from dept where dept_name="财务"));


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

结果: dept_name

条件: count(name)>1   ,group  by  dept_name

方法1:select dept_name from emp INNER JOIN dept on dept1=dept2 GROUP BY dept_name HAVING count(name)>1;

方法2:select dept_name from dept where dept1 in (select dept2 from emp group by dept2 having count(dept2)>1);

方法3:SELECT dept_name FROM (select dept_name,count(dept_name) c from dept INNER JOIN emp ON dept.dept1=emp.dept2 GROUP BY dept_name) a WHERE a.c>1;

方法4:select dept_name from dept inner join (SELECT count(dept2),dept2 from emp GROUP BY dept2 having count(dept2)>1)as a on dept.dept1=a.dept2

 

18.列出部门员工收入不超过7500,且大于3000的员工年纪及部门编号;

结果:age , dept2 或dept1

条件:incoming<=7500  ,incoming>3000

方法1:select age,dept2,incoming from emp where incoming<=7500 and incoming>3000; (单表)

方法2:select age,sid from dept left join emp on dept.dept1=emp.dept2 where incoming<=7000&&incoming>3000 ;

 

19.求入职于20世纪70年代的员工所属部门名称;

结果: dept_name

条件:woek_time like     197%

方法1:SELECT dept_name from dept INNER JOIN emp on dept.dept1=emp.dept2 WHERE woektime_start BETWEEN 1970 and 1979;

方法2:select dept_name from dept inner join emp on dept.dept1=emp.dept2 where woektime_start>=1970 and  woektime_start<1980;

方法3:

select dept_name from dept left join emp on dept.dept1=emp.dept2 where woektime_start like "197%";

  

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

结果:dept_name

条件:name='张三'

select dept_name from dept left join emp on dept.dept1=emp.dept2 where name="张三"

方法2:

select dept_name from dept where dept1=(select dept2 from emp where name='张三') ;

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

结果: name  ,dept_name

条件: group  by     dept_name        max(age)

方法1:SELECT dept_name,name from dept INNER JOIN   emp on dept.dept1=emp.dept2 where (dept_name,age ) in  (SELECT dept_name ,max(age) from dept INNER JOIN   emp on dept.dept1=emp.dept2 GROUP BY dept_name);

方法2:select  b.name,b.dept_name from  (select MAX(age) as age ,dept2 from emp group by dept2)a INNER JOIN (select * from dept INNER JOIN emp where  dept1=dept2 )b  on a.age=b.age and  a.dept2=b.dept2   ;


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

结果:dept_name ,  sum(incomig)

条件:group  by    dept_name  ,

方法1:select sum(incoming),dept_name  from dept left join emp on dept.dept1=emp.dept2 group by dept_name;

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

结果:sid    ,dept_name

条件:incoming>7000

方法1:SELECT sid,dept_name from dept INNER JOIN emp on dept.dept1=emp.dept2 WHERE incoming>7000;

 

24.找出哪个部门还没有员工入职;(左独有数据)

结果: dept_name

条件:name  is  null

方法1:SELECT dept_name from dept LEFT JOIN emp on dept.dept1=emp.dept2 WHERE name is null;

方法2:select dept_name from dept left join emp on dept.dept1=emp.dept2 group by dept_name  having (count(sid)=0);

25.先按部门号大小排序,再依据入职时间由早到晚排序员工信息表 ;(二次排序)

结果:员工信息表       所有信息    * 

emp   :dept2     order  by    desc  (降序)

emp : woek_time    时间是越小就越早(升序)

方法1:select *  from dept left join emp on dept.dept1=emp.dept2 order by  dept1 desc  ,worktime_start asc;

方法2:select *from emp order by dept2 desc,woektime_start asc;

 

26.求出财务部门工资最高员工的姓名和员工号

结果:name  ,sid

条件:max(incomg) ,dept_name='财务'

方法1:

select sid,name from dept left join emp on dept.dept1=emp.dept2 where dept_name="财务" and incoming=(select max(incoming) from dept left join emp on dept.dept1=emp.dept2 where dept_name="财务");


27.求出工资在7500到8500之间,年龄最大的员工的姓名和部门名称。

结果:name,dept_name

条件:   incoming=< 7500, incoming>=8000   max(age)

方法1:SELECT name,dept_name FROM dept right JOIN emp on dept.dept1=emp.dept2 WHERE age=(SELECT max(age) from emp WHERE incoming BETWEEN 7500 and 8500) and  incoming BETWEEN 7500 and 8500 ;、

方法2:

select name,dept_name from dept join emp on dept1=dept2 where incoming between 7500 and 8500 and (dept_name,age) in (select dept_name,max(age) from emp join dept on dept1=dept2 group by dept_name);

posted @ 2022-03-05 15:36  xiaolehua  阅读(600)  评论(0编辑  收藏  举报