zoukankan      html  css  js  c++  java
  • 牛客网sql实战参考答案(mysql版):16-21

    16、统计出当前(titles.to_date='9999-01-01')各个title类型对应的员工当前(salaries.to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg。

    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));
    CREATE TABLE IF NOT EXISTS "titles" (
    `emp_no` int(11) NOT NULL,
    `title` varchar(50) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date DEFAULT NULL);
    
    如插入:
    INSERT INTO salaries VALUES(10001,88958,'1986-06-26','9999-01-01');
    INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
    INSERT INTO salaries VALUES(10004,70698,'1986-12-01','1995-12-01');
    INSERT INTO salaries VALUES(10004,74057,'1995-12-01','9999-01-01');
    INSERT INTO salaries VALUES(10006,43311,'2001-08-02','9999-01-01');
    INSERT INTO salaries VALUES(10007,88070,'2002-02-07','9999-01-01');
    
    INSERT INTO titles VALUES(10001,'Senior Engineer','1986-06-26','9999-01-01');
    INSERT INTO titles VALUES(10003,'Senior Engineer','2001-12-01','9999-01-01');
    INSERT INTO titles VALUES(10004,'Engineer','1986-12-01','1995-12-01');
    INSERT INTO titles VALUES(10004,'Senior Engineer','1995-12-01','9999-01-01');
    INSERT INTO titles VALUES(10006,'Senior Engineer','2001-08-02','9999-01-01');
    INSERT INTO titles VALUES(10007,'Senior Staff','1996-02-11','9999-01-01');
    

    select t.title, avg(s.salary) as avg
    from titles t
    inner join salaries s 
    on s.emp_no = t.emp_no
    and t.to_date='9999-01-01'
    and s.to_date='9999-01-01'
    group by t.title;
    

    17、获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary

    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));
    

    select emp_no, salary
    from salaries
    where salaries.to_date='9999-01-01'
    and salary = (
        select distinct salary from salaries order by salary desc limit 1 offset 1
    );
    

    18、查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,你可以不使用order by完成吗

    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));
    

    select e.emp_no, s.salary, e.last_name, e.first_name
    from employees e
    inner join salaries s
    on s.emp_no = e.emp_no
    where s.to_date='9999-01-01'
    and salary = (
        select max(salary)
        from salaries
        where to_date='9999-01-01'
        and salary < (
            select max(salary)
            from salaries
            where to_date='9999-01-01'
        )
    );
    

    思路:先查到最大的薪水,再查小于最大薪水的最大薪水,就是第二大了

    19、查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

    CREATE TABLE `departments` (
    `dept_no` char(4) NOT NULL,
    `dept_name` varchar(40) NOT NULL,
    PRIMARY KEY (`dept_no`));
    CREATE TABLE `dept_emp` (
    `emp_no` int(11) NOT NULL,
    `dept_no` char(4) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));
    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));
    
    如插入:
    INSERT INTO departments VALUES('d001','Marketing');
    INSERT INTO departments VALUES('d002','Finance');
    INSERT INTO departments VALUES('d003','Human Resources');
    INSERT INTO departments VALUES('d004','Production');
    INSERT INTO departments VALUES('d005','Development');
    INSERT INTO departments VALUES('d006','Quality Management');
    
    INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
    INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
    INSERT INTO dept_emp VALUES(10003,'d004','1995-12-03','9999-01-01');
    INSERT INTO dept_emp VALUES(10004,'d004','1986-12-01','9999-01-01');
    INSERT INTO dept_emp VALUES(10005,'d003','1989-09-12','9999-01-01');
    INSERT INTO dept_emp VALUES(10006,'d002','1990-08-05','9999-01-01');
    INSERT INTO dept_emp VALUES(10007,'d005','1989-02-10','9999-01-01');
    INSERT INTO dept_emp VALUES(10008,'d005','1998-03-11','2000-07-31');
    INSERT INTO dept_emp VALUES(10009,'d006','1985-02-18','9999-01-01');
    INSERT INTO dept_emp VALUES(10010,'d005','1996-11-24','2000-06-26');
    INSERT INTO dept_emp VALUES(10010,'d006','2000-06-26','9999-01-01');
    
    INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
    INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
    INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
    INSERT INTO employees VALUES(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01');
    INSERT INTO employees VALUES(10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12');
    INSERT INTO employees VALUES(10006,'1953-04-20','Anneke','Preusig','F','1989-06-02');
    INSERT INTO employees VALUES(10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10');
    INSERT INTO employees VALUES(10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15');
    INSERT INTO employees VALUES(10009,'1952-04-19','Sumant','Peac','F','1985-02-18');
    INSERT INTO employees VALUES(10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24');
    INSERT INTO employees VALUES(10011,'1953-11-07','Mary','Sluis','F','1990-01-22');
    

    select e.last_name, e.first_name, d.dept_name
    from employees e
    left join (
        select d1.emp_no, d2.dept_name
        from dept_emp d1
        inner join departments d2
        on d1.dept_no = d2.dept_no
    ) d
    on d.emp_no = e.emp_no;
    

    20、查找员工编号emp_no为10001其自入职以来的薪水salary涨幅(总共涨了多少)growth(可能有多次涨薪,没有降薪)

    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));
    

    select max(salary) - min(salary) as growth
    from salaries
    where emp_no = 10001;
    

    21、查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
    (注:可能有employees表和salaries表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工salaries表的最新的to_date!='9999-01-01',这样的数据不显示在查找结果里面)

    【这题做错过】

    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL, --  '入职时间'
    PRIMARY KEY (`emp_no`));
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL, --  '一条薪水记录开始时间'
    `to_date` date NOT NULL, --  '一条薪水记录结束时间'
    PRIMARY KEY (`emp_no`,`from_date`));
    

    参考答案:

    select b.emp_no,(b.salary-a.salary) as growth
    from
    (select e.emp_no,s.salary
    from employees e left join salaries  s on e.emp_no=s.emp_no
    and e.hire_date=s.from_date)a -- 入职工资表
    inner join
    (select e.emp_no,s.salary
    from employees e left join salaries  s on e.emp_no=s.emp_no
    where s.to_date='9999-01-01')b -- 现在工资表
    on a.emp_no=b.emp_no
    order by growth
  • 相关阅读:
    最大连续序列和
    打印有序链表的公共部分
    字符串最长子串大小
    jvm简介
    大浮点数乘法
    java代码的快速排序理解
    从内存分配分析程序初始化和存储
    时间复杂度
    Filter&Listener
    MVC开发模式&EL表达式&JSTL&三层架构开发
  • 原文地址:https://www.cnblogs.com/kylinxxx/p/14016096.html
Copyright © 2011-2022 走看看