牛客网Mysql题库 15-21

题目15(没有13、14)

SQL15 查找employees表emp_no与last_name的员工信息
请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列,以上例子查询结果如下:

思路:这道题蛮简单的

  1. 肯定是所有字段都要有,所以Select * from employees;
  2. 工号为奇数,学过一点编程的都知道我们常用的判断奇数的方式 number%2!=0(即不能被2整除)
  3. 名字中不含Mary,这个直接where 名字字段!=“Mary”即可
  4. hire_date 逆序排列 order by + DESC;
SELECT * FROM employees
WHERE emp_no%2 != 0 AND last_name!="Mary"
ORDER BY hire_date DESC;

在这里插入图片描述

题目16

SQL16 统计出当前各个title类型对应的员工当前薪水对应的平均工资
请你统计出各个title类型对应的员工薪水对应的平均工资avg。结果给出title以及平均工资avg,并且以avg升序排序,以上例子输出如下:

思路:

  1. 首先题目要我们输出 科目和平均薪资,所以 select title和avg(s.salary)
  2. 接着把两个表连结成一个表,保证数据上是对应的正确的一致的
  3. 为什么用LEFT而不用RIGHT,是因为该题目测试项2 ,right会出现NULL值
  4. 按照title分组,以avg升序排序即可
SELECT title, avg(s.salary)
FROM titles
LEFT JOIN salaries as s
on titles.emp_no = s.emp_no
GROUP BY title
ORDER BY avg(s.salary)

在这里插入图片描述

题目17

SQL17 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
请你获取薪水第二多的员工的emp_no以及其对应的薪水salary

SELECT emp_no, salary
FROM salaries
ORDER BY salary DESC
LIMIT 1,1

思路:
这道题就简单多了

  1. Order by DESC 逆序排序
  2. limit关键字即可
    在这里插入图片描述

题目18

SQL18 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:
(温馨提示:sqlite通过的代码不一定能通过mysql,因为SQL语法规定,使用聚合函数时,select子句中一般只能存在以下三种元素:常数、聚合函数,group by 指定的列名。如果使用非group by的列名,sqlite的结果和mysql 可能不一样)

思路:
由于不能使用order by,突然一下子被动了许多
但是思路捋一捋就清晰了

  1. 首先选出salary最大的值,再反选剩下的salary中最大的值t
  2. 两张表合成一张表,选出salary正好是t的值

在这里插入图片描述

题目19

SQL19 查找所有员工的last_name和first_name以及对应的dept_name

思路:
其实这个没啥好说的,无非就是三张表两两相连即可

SELECT last_name,first_name,dept_name
FROM departments
RIGHT JOIN (
    SELECT dept_no,employees.emp_no,last_name,first_name
    FROM employees
    LEFT JOIN dept_emp
    ON employees.emp_no = dept_emp.emp_no
) AS t1
ON departments.dept_no =  t1.dept_no;

在这里插入图片描述

题目21(没有20)

SQL21 查找在职员工自入职以来的薪水涨幅情况

请你查找在职员工自入职以来的薪水涨幅情况,给出在职员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序,以上例子输出为
(注: to_date为薪资调整某个结束日期,或者为离职日期,to_date='9999-01-01’时,表示依然在职,无后续调整记录)

思路:
不知道别人怎么写,我这个看起来多,但是其实思路还是很简单的

  1. 分别找到其当前的工资t1 与入职时的工资 t2
  2. t1和t2 连接,把两个工资相减即得到涨幅
SELECT t1.emp_no, maxSalary-minSalary growth
FROM (
    SELECT employees.emp_no,salary maxSalary
    FROM employees
    INNER JOIN salaries
    ON employees.emp_no = salaries.emp_no
    WHERE to_date = "9999-01-01"
    GROUP BY emp_no
    ORDER BY to_date
) AS t1
LEFT JOIN 
(
    SELECT employees.emp_no,salary minSalary
    FROM employees
    INNER JOIN salaries
    ON employees.emp_no = salaries.emp_no
    WHERE from_date = hire_date
    GROUP BY employees.emp_no
) AS t2
ON t1.emp_no = t2.emp_no
ORDER BY growth ASC

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值