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;
  • 相关阅读:
    Apollo配置中心环境搭建(Linux)
    SpringBoot整合Swagger2
    DevExpress ASP.NET v18.2新功能详解(四)
    UI控件Telerik UI for WinForms发布R1 2019|附下载
    DevExpress WinForms使用教程:Data Grid
    开发框架DevExtreme全新发布v18.2.6|附下载
    DevExpress ASP.NET v18.2新功能详解(三)
    .NET界面控件DevExpress全新发布v18.2.6|附下载
    DevExpress WinForms使用教程:图表控件
    VCL界面控件DevExpress VCL Controls发布v18.2.4|附下载
  • 原文地址:https://www.cnblogs.com/kylinxxx/p/14008271.html
Copyright © 2011-2022 走看看