zoukankan      html  css  js  c++  java
  • 多测师肖老师__多表练习(8.1)

    多表练习

    已知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

           

    cREATE table dept(dept1 VARCHAR(6),dept_name VARCHAR(20))  default charset=utf8;
    
    INSERT into dept VALUES ('101','财务');
    INSERT into dept VALUES ('102','销售');
    
    INSERT into dept VALUES ('103','IT技术');
    
    INSERT into dept VALUES ('104','行政');
    
    CREATE table emp (sid VARCHAR(6),name VARCHAR(20),age TINYINT(2),woektime_start VARCHAR(10),incoming SMALLINT(10),dept2 VARCHAR(6))default charset=utf8;
    
    insert into emp VALUES ('1789','张三',35,'1980/1/1',4000,'101');
    
    insert into emp VALUES ('1674','李四',32,'1983/4/1',3500,'101');
    
    insert into emp VALUES ('1776','王五',24,'1990/7/1',2000,'101');
    
    insert into emp VALUES ('1568','赵六',57,'1970/10/11',7500,'102');
    insert into emp VALUES ('1564','荣七',64,'1963/10/11',8500,'102');
    
    insert into emp VALUES ('1879','牛八',55,'1971/10/20',7300,'103');
    insert into emp VALUES ('1880','刘十',55,'1971/10/21',7000,'105');
    insert into emp VALUES ('1881','十一',55,'1971/10/21',7000,'106');
    drop  table  dept ;
    drop  table  emp ;
    select  *  from dept;
    select *  from  emp ;


    表1:

    表2:

    ========================================

    1.列出每个部门的平均收入及部门名称;
    emp incoming
    dept dept_name
    avg
    group by
    方法一:select avg(incoming ),dept_name from dept inner join emp on dept.dept1=emp.dept2.

    方法二:
    2.财务部门的收入总和;
    dept "财务"
    emp incoming
    sum
    select sum(incoming ),dept_name from dept inner join emp on dept.dept1=emp.dept2 where dept_name="财务" ;

    3.It技术部入职员工的员工号
    emp sid
    dept it技术部门

    name ,sid

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

    方法一:

    SELECT name ,incoming  FROM emp INNER JOIN dept ON dept.dept1 = emp.dept2 WHERE dept_name = "财务" AND incoming >2000;

    方法二:

    Select name from (select * from dept left join emp on dept.dept1=emp.dept2) A where dept_name='财务' and incoming>2000;

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

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

    方法一:

    select woektime_start from emp ,dept  where dept1=dept2 and incoming=(select min(incoming) from dept INNER JOIN emp on dept.dept1=emp.dept2  WHERE  dept_name='销售') and  dept_name='销售'  ; 


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

    方法一:select name,sid,dept_name from dept left JOIN emp on dept1=dept2 where age<(SELECT AVG(age) from emp)

     方法二:select  dept_name,sid,name from   emp INNER JOIN dept on dept1=emp.dept2 where age<(select avg(age) from  emp INNER JOIN dept on dept1=emp.dept2) ; 可以简化方法一

    方法三:Select name,dept_name,sid from (select * from dept left join emp on dept.dept1=emp.dept2) A where age<(select avg(age) from emp);


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

    方法一:

    select dept_name from emp INNER JOIN dept on dept.dept1=emp.dept2 GROUP BY dept_name having sum(incoming)>9000 ;

    方法二:

    select  s.dept_name from (SELECT dept_name,SUM(incoming) from dept INNER JOIN emp on dept.dept1=emp.dept2 GROUP BY dept_name having SUM(incoming)>9000 )s 

    方法三:
    8.查出财务部门工资少于3800元的员工姓名
    财务 dept
    incoming emp

    name
    <

    方法一:

    select  name from(select  * from   dept INNER JOIN   emp  on   dept.dept1=emp.dept2) s where dept_name = "财务" AND incoming < 3800;

    方法二:


    SELECT name FROM dept left JOIN emp on dept.dept1=emp.dept2 WHERE dept_name="财务" and incoming<3800

    方法三:


    9.求财务部门最低工资的员工姓名;
    min
    dept dept_name
    emp incoming min

    方法一:

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


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

    方法一:select name  from   dept INNER JOIN   emp  on   dept.dept1=emp.dept2 where dept_name="销售" and age=(select max(age) from dept INNER JOIN   emp  on   dept.dept1=emp.dept2 where dept_name="销售")

    方法二:

    SELECT name,age from emp WHERE age=(SELECT MAX(age) FROM dept LEFT JOIN emp ON dept.dept1=emp.dept2 WHERE dept_name="销售") and dept2=(select dept1 from dept where dept_name="销售" );

    方法三:

    select name from (select * from (select * from dept left join emp on dept.dept1=emp.dept2 ) A where dept_name='销售') B order by age desc limit 0,1;

     简化:

    select name from (select * from dept left join emp on dept1=dept2 where dept_name='销售') B order by age desc limit 0,1;


    11.求收入最低的员工姓名及所属部门名称:

    方法一:SELECT name,dept_name from dept,emp WHERE dept1=dept2 ORDER BY incoming LIMIT 0,1;

    方法二:

    SELECT name,dept_name FROM dept LEFT JOIN emp ON dept.dept1=emp.dept2 WHERE incoming=(SELECT min(incoming) FROM dept LEFT JOIN emp ON dept.dept1=emp.dept2);

    方法三:SELECT name,dept_name FROM dept LEFT JOIN emp ON dept.dept1=emp.dept2 WHERE incoming=(SELECT  min(incoming) from emp);

    方法四:select name,dept_name from (select * from emp inner join dept on dept.dept1=emp.dept2)a where incoming=(select min(incoming) from emp) ;

    方法五:

    select name,dept_name from (select * from dept left join emp on dept.dept1=emp.dept2 ) B where B.incoming=(SELECT min(incoming) from (select * from dept left join emp on dept.dept1=emp.dept2 ) A)


    12.求李四的收入及部门名称
    方法一:SELECT incoming,dept_name FROM dept LEFT JOIN emp ON dept.dept1=emp.dept2  WHERE name="李四";

    方法二:Select incoming,dept_name from (select * from dept left join emp on dept.dept1=emp.dept2 ) A where name='李四'

    13.求员工收入小于4000元的员工部门编号及其部门名称

    方法一:SELECT sid,dept_name from dept left JOIN emp on dept.dept1=emp.dept2 WHERE incoming<4000

    方法二:select dept1,dept_name from (select * from (select * from dept left join emp on dept.dept1=emp.dept2) A where incoming<4000) B

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

    方法一:

     select dept_name,name,incoming from(SELECT * FROM  dept INNER JOIN   emp  on   dept.dept1=emp.dept2   ORDER BY incoming DESC) a GROUP BY dept_name  ORDER BY  a.incoming desc

    方法二:

    SELECT name,dept_name FROM dept,emp WHERE dept1=dept2 and (age,dept_name) in(
    SELECT MAX(age),dept_name FROM dept,emp WHERE dept1=dept2 GROUP BY dept_name)

     方法三:

    SELECT name,dept_name,incoming from dept left join emp on dept.dept1=emp.dept2 where ('name',dept_name,incoming)=any(SELECT 'name',dept_name,max(incoming) from dept left join emp on dept.dept1=emp.dept2 group by dept_name) ORDER BY incoming desc;

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

    条件: dept_name ="财务"       order by    desc        

    结果: name   sid   incoming

    方法一:

    select sid,name,incoming from dept INNER JOIN emp on dept.dept1=emp.dept2 where dept_name='财务' ORDER BY incoming desc limit 0,2

    方法二:select name,sid,incoming from (select * from (select * from dept left join emp on dept.dept1=emp.dept2 ) A where dept_name='财务') B order by incoming desc limit 0,2

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

    条件:  dept_name ="财务"     incoming <avg(incoming)

    结果:sid   name

    方法一:

    select sid,name from dept left JOIN emp on dept1=dept2 where incoming<(SELECT AVG(incoming) from emp) and dept_name='财务'

    方法二:

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


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

    方法一:select dept_name from(select  dept_name, count(name)a from  emp left join dept on dept1=dept2 GROUP BY dept_name HAVING  a>1 ) s;

    方法二:select dept_name from dept left JOIN emp on dept1=dept2 GROUP BY dept_name HAVING COUNT(name)>1

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

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

    方法一:

    SELECT age,dept1 from dept,emp WHERE dept1=dept2 and incoming<=7500 and incoming>3000;

    方法二:

    select age,sid from (select * from dept left join emp on dept.dept1=emp.dept2) A where incoming>3000 and incoming<=7500;

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

    条件:20世纪:1970-1979

    结果:dept_name

    方法1:SELECT DISTINCT(dept_name) from dept,emp WHERE dept1=dept2 and woektime_start  LIKE '197%'

    方法2:SELECT DISTINCT(dept_name) from dept  where  dept1 in (select  dept2  from  emp  where woektime_start  like '197%')

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

    条件:  name='张三'

    结果:dept_name

    方法一:select dept_name from (select * from dept left join emp on dept.dept1=emp.dept2) A where name='张三'

    方法二:select dept_name from dept RIGHT join emp on dept.dept1=emp.dept2 where name="张三"

    方法三:SELECT dept_name from dept where dept1=(SELECT dept2 from emp where name='张三');

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

    方法一:

    select  name ,dept_name  from   dept,emp where   dept1=dept2 and (dept_name,age)in(SELECT  dept_name,max(age)  from  dept,emp where  dept1=dept2  GROUP BY dept_name);

    方法二:排序只能取一个(当相同的数据只取一个)

    select  name ,dept_name  from  (select  name ,dept_name  from   dept,emp where   dept1=dept2 order by  age  desc)a group by   a.dept_name ;

    方法三:

    select  c.name, c.dept_name  from  (SELECT  dept_name,max(age)a  from  dept,emp where  dept1=dept2  GROUP BY dept_name) s LEFT JOIN  (SELECT  *  from  dept,emp where  dept1=dept2)c on s.dept_name=c.dept_name and  s.a=c.age ;

    当做一个表

    另一张表

     


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

    SELECT dept_name  ,sum(incoming) from dept LEFT JOIN emp on dept.dept1=emp.dept2 group by dept_name;

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

    条件: incoming>7000

    结果:sid  ,dept_name

    方法一:SELECT dept_name,sid from (select * from dept left join emp on dept.dept1=emp.dept2) A where incoming>7000

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

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

    条件: is null     判断: nane   sid   (实际求左独有)

    结果:dept_name

    方法一:select  dept_name from(select  * from   dept RIGHT   join   emp  on   dept.dept1=emp.dept2  union  select  * from   dept left  join   emp  on   dept.dept1=emp.dept2  where name is null) as a where name is null

    方法二:

    SELECT dept_name from dept left JOIN emp on dept.dept1=emp.dept2 WHERE name is NULL

    方法三:

    select  dept_name  from (select * from dept left join emp on dept.dept1=emp.dept2) A where name is null

    方法四:

    SELECT dept_name from dept LEFT JOIN emp on dept.dept1=emp.dept2 GROUP BY dept_name having count(sid)<1;

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

    条件:  order    by    desc          时间:asc   早数值就越小

    d结果:  员工信息表  *

    方法一:

    SELECT *  from emp INNER JOIN dept ON emp.dept2 = dept.dept1 ORDER BY dept1 desc ,woektime_start asc ;

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

    方法一:(重复最高工资就显示一个,缺陷)

    SELECT name,sid FROM dept LEFT JOIN emp on dept1=dept2 WHERE dept_name='财务' ORDER BY incoming DESC LIMIT 0,1;

    方法二:

    SELECT name,sid from dept LEFT JOIN emp on dept.dept1=emp.dept2 where incoming=(SELECT max(incoming) from dept LEFT JOIN emp on dept.dept1=emp.dept2 where dept_name='财务') and dept_name='财务';


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

    方法一:

    SELECT name,dept_name FROM dept LEFT JOIN emp ON dept.dept1=emp.dept2 WHERE incoming<=8500 AND incoming>=7500 and age=(SELECT MAX(age) FROM emp  where  incoming<=8500 AND incoming>=7500  )  ;

    方法二:

    SELECT name,dept_name FROM dept INNER JOIN emp on dept1=dept2 WHERE incoming>=7500 and incoming<=8500 ORDER BY age DESC LIMIT 0,1;

    SELECT dept_name from dept left JOIN emp on dept.dept1=emp.dept2 WHERE name is NULL

  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/xiaolehua/p/15709434.html
Copyright © 2011-2022 走看看