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

    1、查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天(sqlite里面的注释为--,mysql为comment)

    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`));
    

    select * 
    from employees
    order by hire_date desc
    limit 0, 1;
    

    2、查找入职员工时间排名倒数第三的员工所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天

    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`));
    

    select * 
    from employees
    order by hire_date desc
    limit 1 offset 2;
    

    3、查找各个部门当前(dept_manager.to_date='9999-01-01')领导当前(salaries.to_date='9999-01-01')薪水详情以及其对应部门编号dept_no
    (注:输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_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`));
    
    
    CREATE TABLE `dept_manager` (
    `dept_no` char(4) NOT NULL, -- '部门编号'
    `emp_no` int(11) NOT NULL, --  '员工编号'
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));
    

    select s.emp_no, s.salary, s.from_date, s.to_date, d.dept_no
    from salaries s
    inner join dept_manager d on s.emp_no = d.emp_no
    where d.to_date='9999-01-01' and s.to_date='9999-01-01'
    order by s.emp_no;
    

    4、查找所有已经分配部门的员工的last_name和first_name以及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`));
    

    select e.last_name, e.first_name, d.dept_no
    from employees e
    inner join dept_emp d on d.emp_no = e.emp_no;
    

    5、查找所有员工的last_name和first_name以及对应部门编号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`));
    

    select e.last_name, e.first_name, d.dept_no
    from employees e
    left join dept_emp d on d.emp_no = e.emp_no;
    

    6、查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_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`));
    
    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
    from employees e
    inner join salaries s on s.emp_no = e.emp_no 
    where e.hire_date = s.from_date
    order by e.emp_no desc;
    

    7、 查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t

    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, count(emp_no) t
    from salaries
    group by emp_no
    having t > 15;
    

    8、找出所有员工当前(to_date='9999-01-01')具体的薪水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 distinct(salary)
    from salaries
    where to_date='9999-01-01'
    order by salary desc;
    

    9、获取所有部门当前(dept_manager.to_date='9999-01-01')manager的当前(salaries.to_date='9999-01-01')薪水情况,给出dept_no, emp_no以及salary,输出结果按照dept_no升序排列(请注意,同一个人可能有多条薪水情况记录)

    CREATE TABLE `dept_manager` (
    `dept_no` char(4) NOT NULL,
    `emp_no` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_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 m.dept_no, m.emp_no, s.salary
    from dept_manager m
    inner join salaries s on s.emp_no = m.emp_no
    where m.to_date='9999-01-01' and s.to_date='9999-01-01'
    order by m.dept_no;
    

    10、 获取所有非manager的员工emp_no

    CREATE TABLE `dept_manager` (
    `dept_no` char(4) NOT NULL,
    `emp_no` int(11) 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 dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
    INSERT INTO dept_manager VALUES('d002',10006,'1990-08-05','9999-01-01');
    INSERT INTO dept_manager VALUES('d003',10005,'1989-09-12','9999-01-01');
    INSERT INTO dept_manager VALUES('d004',10004,'1986-12-01','9999-01-01');
    INSERT INTO dept_manager VALUES('d005',10010,'1996-11-24','2000-06-26');
    INSERT INTO dept_manager VALUES('d006',10010,'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.emp_no 
    from employees e
    left join dept_manager m on e.emp_no = m.emp_no
    where m.dept_no is null;
    

    11、 获取所有员工当前的(dept_manager.to_date='9999-01-01')manager,如果员工是manager的话不显示(也就是如果当前的manager是自己的话结果不显示)。输出结果第一列给出当前员工的emp_no,第二列给出其manager对应的emp_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 `dept_manager` (
    `dept_no` char(4) NOT NULL, -- '部门编号'
    `emp_no` int(11) NOT NULL, -- '经理编号'
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));
    
    如插入:
    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 dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
    INSERT INTO dept_manager VALUES('d002',10006,'1990-08-05','9999-01-01');
    INSERT INTO dept_manager VALUES('d003',10005,'1989-09-12','9999-01-01');
    INSERT INTO dept_manager VALUES('d004',10004,'1986-12-01','9999-01-01');
    INSERT INTO dept_manager VALUES('d005',10010,'1996-11-24','2000-06-26');
    INSERT INTO dept_manager VALUES('d006',10010,'2000-06-26','9999-01-01');
    

    select e.emp_no, m.emp_no manager_no
    from dept_emp e, dept_manager m
    where e.emp_no != m.emp_no
    and e.dept_no = m.dept_no
    and m.to_date = '9999-01-01';
    

    12、获取所有部门中当前(dept_emp.to_date = '9999-01-01')员工当前(salaries.to_date='9999-01-01')薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列。

    【这题做错过】

    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 `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`));
    如插入:
    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,'d001','1996-08-03','1997-08-03');
    
    INSERT INTO salaries VALUES(10001,90000,'1986-06-26','1987-06-26');
    INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
    INSERT INTO salaries VALUES(10002,72527,'1996-08-03','1997-08-03');
    INSERT INTO salaries VALUES(10002,72527,'2000-08-02','2001-08-02');
    INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
    INSERT INTO salaries VALUES(10003,90000,'1996-08-03','1997-08-03');
    

    参考别人的答案

    select uni.dept_no, uni.emp_no, max_salary.salary
    from
        (select d.dept_no, s.emp_no, s.salary
         from dept_emp d join salaries s
         on d.emp_no = s.emp_no
         and d.to_date = '9999-01-01'
         and s.to_date = '9999-01-01'  
        ) as uni, /* 部门编号,员工编号,当前薪水 */
        (select d.dept_no, max(s.salary) as salary
         from dept_emp d join salaries s
         on d.emp_no = s.emp_no
         and d.to_date = '9999-01-01'
         and s.to_date = '9999-01-01'  
         group by d.dept_no
        ) as max_salary /* 部门编号,当前最高薪水 */
    where uni.salary = max_salary.salary
    and uni.dept_no = max_salary.dept_no
    order by uni.dept_no;
    

    13、从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。

    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 titles VALUES(10001,'Senior Engineer','1986-06-26','9999-01-01');
    INSERT INTO titles VALUES(10002,'Staff','1996-08-03','9999-01-01');
    INSERT INTO titles VALUES(10003,'Senior Engineer','1995-12-03','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(10005,'Senior Staff','1996-09-12','9999-01-01');
    INSERT INTO titles VALUES(10005,'Staff','1989-09-12','1996-09-12');
    INSERT INTO titles VALUES(10006,'Senior Engineer','1990-08-05','9999-01-01');
    INSERT INTO titles VALUES(10007,'Senior Staff','1996-02-11','9999-01-01');
    INSERT INTO titles VALUES(10007,'Staff','1989-02-10','1996-02-11');
    INSERT INTO titles VALUES(10008,'Assistant Engineer','1998-03-11','2000-07-31');
    INSERT INTO titles VALUES(10009,'Assistant Engineer','1985-02-18','1990-02-18');
    INSERT INTO titles VALUES(10009,'Engineer','1990-02-18','1995-02-18');
    INSERT INTO titles VALUES(10009,'Senior Engineer','1995-02-18','9999-01-01');
    INSERT INTO titles VALUES(10010,'Engineer','1996-11-24','9999-01-01');
    INSERT INTO titles VALUES(10010,'Engineer','1996-11-24','9999-01-01');
    

    select title, count(title) t
    from titles
    group by title
    having t >= 2;
    

    14、从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
    注意对于重复的emp_no进行忽略(即emp_no重复的title不计算,title对应的数目t不增加)。

    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 titles VALUES(10001,'Senior Engineer','1986-06-26','9999-01-01');
    INSERT INTO titles VALUES(10002,'Staff','1996-08-03','9999-01-01');
    INSERT INTO titles VALUES(10003,'Senior Engineer','1995-12-03','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(10005,'Senior Staff','1996-09-12','9999-01-01');
    INSERT INTO titles VALUES(10005,'Staff','1989-09-12','1996-09-12');
    INSERT INTO titles VALUES(10006,'Senior Engineer','1990-08-05','9999-01-01');
    INSERT INTO titles VALUES(10007,'Senior Staff','1996-02-11','9999-01-01');
    INSERT INTO titles VALUES(10007,'Staff','1989-02-10','1996-02-11');
    INSERT INTO titles VALUES(10008,'Assistant Engineer','1998-03-11','2000-07-31');
    INSERT INTO titles VALUES(10009,'Assistant Engineer','1985-02-18','1990-02-18');
    INSERT INTO titles VALUES(10009,'Engineer','1990-02-18','1995-02-18');
    INSERT INTO titles VALUES(10009,'Senior Engineer','1995-02-18','9999-01-01');
    INSERT INTO titles VALUES(10010,'Engineer','1996-11-24','9999-01-01');
    INSERT INTO titles VALUES(10010,'Engineer','1996-11-24','9999-01-01');
    

    select title, count(distinct emp_no) t
    from titles
    group by title
    having count(*) >= 2;
    

    只需在count中加入distinct '指定列'就可以在计算行数时去掉指定列中重复的值:在count函数计数时去掉重复的emp_no

    15、 查找employees表所有emp_no为奇数,且last_name不为Mary(注意大小写)的员工信息,并按照hire_date逆序排列

    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 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 *
    from employees
    where emp_no % 2 = 1
    and last_name != "Mary"
    order by hire_date desc;
  • 相关阅读:
    关于Maya Viewport 2.0 API 开发的介绍视频
    春节大假
    Some tips about the life cycle of Maya thread pool
    Can I compile and run Dx11Shader for Maya 2015 on my side?
    How to get current deformed vertex positions in MoBu?
    想加入全球首届的 欧特克云加速计划吗?
    三本毕业(非科班),四次阿里巴巴面试,终拿 offer(大厂面经)
    mac、window版编辑器 webstorm 2016... 永久破解方法。
    node 搭载本地代理,处理web本地开发跨域问题
    js 一维数组,转成嵌套数组
  • 原文地址:https://www.cnblogs.com/kylinxxx/p/14008271.html
Copyright © 2011-2022 走看看