牛客网sql题(未完待续)

文章目录

1-10

  1. 查找最晚入职员工的所有信息
    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
    WHERE hire_date = (SELECT MAX(hire_date) FROM employees)
    
  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
    WHERE hire_date=
    	(SELECT hire_date FROM employees ORDER BY hire_date DESC limit 2,1)
    
  3. 查找各个部门当前(to_date=‘9999-01-01’)领导当前薪水详情以及其对应部门编号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 s.*, d.dept_no
    from salaries as s join dept_manager as d on s.emp_no=d.emp_no
    where s.to_date = '9999-01-01' and d.to_date='9999-01-01';
    
  • 注意:在牛客网里,如果两张表顺序反了,也会报错,但是其实这没错
  1. 查找所有已经分配部门的员工的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 AS e JOIN dept_emp AS d ON (e.emp_no=d.emp_no)
    
  2. 查找所有员工的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 AS e LEFT JOIN dept_emp AS d ON (e.emp_no = d.emp_no)
    
  • 注意:
    INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。
    LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
    RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。
    SQL中JOIN和WHERE的区别: https://www.cnblogs.com/guanshan/articles/guan062.html
    What is the difference between inner join, left join, outer join:https://stackoverflow.com/questions/5706437/whats-the-difference-between-inner-join-left-join-right-join-and-full-join
  1. 查找所有员工入职时候的薪水情况,给出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 as e JOIN salaries as s 
    	ON (e.emp_no = s.emp_no AND e.hire_date = s.from_date)
    ORDER BY e.emp_no DESC 
    
  2. 查找薪水涨幅超过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(salary) as t
    FROM salaries
    GROUP BY emp_no
    HAVING COUNT(salary) > 15
    
  3. 找出所有员工当前(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));

    // 注意这里去掉DISTINCT也是对的,而且DISTINCT语句占用内存很高,不建议使用!!!
    SELECT DISTINCT(salary)
    FROM salaries
    WHERE to_date="9999-01-01" 
    GROUP BY salary
    ORDER BY salary DESC
    
  4. 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=‘9999-01-01’
    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));

    //方案1:
    SELECT d.dept_no, d.emp_no, s.salary 
    FROM salaries AS s JOIN dept_manager AS d 
        ON d.emp_no = s.emp_no
        AND d.to_date = '9999-01-01'
        AND s.to_date = '9999-01-01'
    
    //方案2:
    SELECT d.dept_no, d.emp_no, s.salary
    FROM salaries AS s
        JOIN dept_manager AS d ON d.emp_no=s.emp_no 
    WHERE d.to_date="9999-01-01" AND s.to_date="9999-01-01"
    
  5. 获取所有非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));

    SELECT emp_no FROM employees 
    WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager)
    

11-20

  1. 获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date=‘9999-01-01’。
    结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_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));

    SELECT de.emp_no, dm.emp_no
    FROM dept_emp AS de 
        JOIN dept_manager AS dm ON (de.dept_no=dm.dept_no)
    WHERE de.emp_no<>dm.emp_no 
    	AND de.to_date="9999-01-01" AND dm.to_date="9999-01-01"
    
  2. 获取所有部门中当前员工薪水最高的相关信息,给出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));

    SELECT d.dept_no, d.emp_no, s.salary
    FROM dept_emp AS d 
        JOIN salaries AS s ON (d.emp_no=s.emp_no)
    WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
    GROUP BY d.dept_no
    HAVING MAX(s.salary)
    
  3. 从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);

    SELECT title, COUNT(title) as t
    FROM titles
    GROUP BY title
    HAVING COUNT(title)>=2
    
  4. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
    注意对于重复的emp_no进行忽略。
    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);

    //注意:一个emp_no在不同阶段是不一样的title的
    SELECT title, COUNT(DISTINCT emp_no) as t
    FROM titles 
    GROUP BY title
    HAVING COUNT(title)>=2
    
  5. 查找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));

    SELECT *
    FROM employees
    WHERE emp_no%2<>0 AND last_name<>"Mary"
    ORDER BY hire_date DESC
    
  6. 统计出当前各个title类型对应的员工当前(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);

    SELECT title, AVG(salary)
    FROM salaries AS s JOIN titles AS t 
        ON (s.emp_no=t.emp_no)
    WHERE s.to_date="9999-01-01" AND t.to_date="9999-01-01"
    GROUP BY title
    
  7. 获取当前(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 
    ORDER BY salary DESC limit 1,1
    
  8. 查找当前薪水(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, MAX(s.salary), e.last_name, e.first_name
    FROM employees AS e JOIN salaries AS s 
        ON (e.emp_no = s.emp_no)
    WHERE s.to_date="9999-01-01" AND s.salary NOT IN
        (SELECT MAX(salary) FROM salaries WHERE to_date = '9999-01-01')
    
  9. 查找所有员工的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));

    //此题要想明白left join的功能
    SELECT e.last_name, e.first_name, dp.dept_name
    FROM employees AS e LEFT JOIN dept_emp AS de ON (e.emp_no = de.emp_no)
        LEFT JOIN departments AS dp ON (de.dept_no = dp.dept_no)
    
  10. 查找员工编号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 (
        (SELECT salary FROM salaries WHERE emp_no=10001 ORDER BY to_date DESC limit 1)-
        (SELECT salary FROM salaries WHERE emp_no=10001 ORDER BY to_date ASC limit 1)
    ) AS growth
    

21-30

  1. 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
    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));

    思路:先分别用两次LEFT JOIN左连接employees与salaries,建立两张表,分别存放员工当前工资(sCurrent)与员工入职时的工资(sStart),再用INNER JOIN连接sCurrent与sStart,最后限定在同一员工下用当前工资减去入职工资。

    SELECT sCurrent.emp_no, (sCurrent.salary-sStart.salary) AS growth
    FROM (SELECT s.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') AS sCurrent
            INNER JOIN (SELECT s.emp_no, s.salary FROM employees e LEFT JOIN salaries s 
                        ON e.emp_no = s.emp_no WHERE s.from_date = e.hire_date) AS sStart
            ON sCurrent.emp_no = sStart.emp_no
    ORDER BY growth
    
  2. 统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及次数sum
    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 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));

    本题关键是要将每个部门分组,并分别统计工资记录总数,思路如下:

    1. 用INNER JOIN连接dept_emp表和salaries表,并以dept_emp.no分组,统计每个部门所有员工工资的记录总数
    2. 再将上表用INNER JOIN连接departments表,限制条件为两表的dept_no相等,找到dept_no与dept_name的对应关系,最后依次输出dept_no、dept_name、sum
    SELECT de.dept_no, dp.dept_name, COUNT(s.salary) AS sum 
    FROM dept_emp AS de JOIN salaries AS s ON (de.emp_no = s.emp_no)
    	JOIN departments AS dp ON (de.dept_no = dp.dept_no)
    GROUP BY de.dept_no
    
  3. 对所有员工的当前(to_date=‘9999-01-01’)薪水按照salary进行按照1-N的排名,相同salary并列且按照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));

    本题的主要思想是复用salaries表进行比较排名,具体思路如下:

    1. 从两张相同的salaries表(分别为s1与s2)进行对比分析,先将两表限定条件设为to_date = ‘9999-01-01’,挑选出当前所有员工的薪水情况。
    2. 本题的精髓在于 s1.salary <= s2.salary,意思是在输出s1.salary的情况下,有多少个s2.salary大于等于s1.salary,比如当s1.salary=94409时,有3个s2.salary(分别为94692,94409,94409)大于等于它,但由于94409重复,利用COUNT(DISTINCT s2.salary)去重可得工资为94409的rank等于2。其余排名以此类推。
    3. 千万不要忘了GROUP BY s1.emp_no,否则输出的记录只有一条(可能是第一条或者最后一条,根据不同的数据库而定),因为用了合计函数COUNT()。
    4. 最后先以 s1.salary 逆序排列,再以 s1.emp_no 顺序排列输出结果。
    //选了两张表
    SELECT s1.emp_no, s1.salary, COUNT(DISTINCT s2.salary) AS rank
    FROM salaries AS s1, salaries AS s2
    WHERE s1.to_date = '9999-01-01'  AND s2.to_date = '9999-01-01' AND s1.salary <= s2.salary
    GROUP BY s1.emp_no
    ORDER BY s1.salary DESC, s1.emp_no ASC
    
  4. 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date=‘9999-01-01’
    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));
    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 de.dept_no, s.emp_no, s.salary 
    FROM (employees AS e JOIN salaries AS s ON s.emp_no = e.emp_no AND s.to_date = '9999-01-01')
        JOIN dept_emp AS de ON e.emp_no = de.emp_no
    WHERE de.emp_no NOT IN (SELECT emp_no FROM dept_manager WHERE to_date = '9999-01-01')
    
  5. 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=‘9999-01-01’,
    结果第一列给出员工的emp_no,
    第二列给出其manager的manager_no,
    第三列给出该员工当前的薪水emp_salary,
    第四列给该员工对应的manager当前的薪水manager_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 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));

    本题主要思想是创建两张表(一张记录当前所有员工的工资,另一张只记录部门经理的工资)进行比较,具体思路如下:

    1. 先用INNER JOIN连接salaries和demp_emp,建立当前所有员工的工资记录sem
    2. 再用INNER JOIN连接salaries和demp_manager,建立当前所有员工的工资记录sdm
    3. 最后用限制条件sem.dept_no = sdm.dept_no AND sem.salary > sdm.salary找出同一部门中工资比经理高的员工,并根据题意依次输出emp_no、manager_no、emp_salary、manager_salary
    SELECT sem.emp_no, sdm.emp_no, sem.salary, sdm.salary
    FROM (SELECT s.salary, s.emp_no, de.dept_no FROM salaries s INNER JOIN dept_emp de
         ON s.emp_no = de.emp_no AND s.to_date = '9999-01-01' ) AS sem, 
         (SELECT s.salary, s.emp_no, dm.dept_no FROM salaries s INNER JOIN dept_manager dm
         ON s.emp_no = dm.emp_no AND s.to_date = '9999-01-01' ) AS sdm
    WHERE sem.dept_no = sdm.dept_no AND sem.salary > sdm.salary
    
  6. 汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count
    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 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);

    SELECT de.dept_no, dp.dept_name, t.title, COUNT(t.title)
    FROM titles AS t JOIN dept_emp AS de 
        ON t.emp_no = de.emp_no AND de.to_date = '9999-01-01' AND t.to_date = '9999-01-01'
        JOIN departments AS dp ON de.dept_no = dp.dept_no
    GROUP BY de.dept_no, t.title
    
  7. 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。
    提示:在sqlite中获取datetime时间对应的年份函数为strftime(’%Y’, to_date)
    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 s2.emp_no, s2.from_date, (s2.salary - s1.salary) AS salary_growth
    FROM salaries AS s1, salaries AS s2
    WHERE s1.emp_no = s2.emp_no 
    AND salary_growth > 5000
    AND (strftime("%Y",s2.to_date) - strftime("%Y",s1.to_date) = 1 
         OR strftime("%Y",s2.from_date) - strftime("%Y",s1.from_date) = 1 )
    ORDER BY salary_growth DESC
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值