牛客网mysql题库(2-12)

题目2

SQL2 查找入职员工时间排名倒数第三的员工所有信息

思路:1. 按入职时间倒序排列 2. 从2输出1

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

在这里插入图片描述

题目3

SQL3 查找当前薪水详情以及部门编号dept_no

思路:1. 按照需要的输出格式从两个表中select
2. 输出结果按照salaries.emp_no升序排列即可

SELECT dept_manager.emp_no, salaries.salary,salaries.from_date,salaries.to_date, dept_manager.dept_no 
FROM dept_manager,salaries 
WHERE dept_manager.emp_no = salaries.emp_no 
ORDER BY salaries.emp_no ASC

在这里插入图片描述

题目4

SQL4 查找所有已经分配部门的员工的last_name和first_name以及dept_no

思路: 与上题类似,比较emp_no 从两个表里select即可。

SELECT employees.last_name,employees.first_name,dept_emp.dept_no 
FROM employees,dept_emp
WHERE employees.emp_no = dept_emp.emp_no

在这里插入图片描述

题目5

SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no
思路:
这道题和上道的区别在于,如果一个员工没有dept_no,那么也要把它查出来,并且dept_no设置为NULL。根据以上要求,使用左连接就是最好的选择了。

SELECT employees.last_name,employees.first_name,dept_emp.dept_no
FROM employees
LEFT JOIN dept_emp
on employees.emp_no = dept_emp.emp_no;

在这里插入图片描述

题目7(没有6)

SQL7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t

思路:
1、用COUNT()函数和GROUP BY语句可以统计同一emp_no值的记录条数
2、根据题意,输出的变动次数为t,故用AS语句将COUNT(emp_no)的值转换为t
3、由于COUNT()函数不可用于WHERE语句中,故使用HAVING语句来限定t>15的条件

 SELECT emp_no,count(emp_no) AS t FROM salaries 
 GROUP BY 
 emp_no HAVING t > 15;

在这里插入图片描述

题目8

SQL8 找出所有员工当前薪水salary情况

思路:

  1. 先按salary分组
  2. 再按salary排序
  3. select即可
SELECT salary FROM salaries 
GROUP BY salary
ORDER BY salary DESC;

在这里插入图片描述

题目10(没有9)

SQL10 获取所有非manager的员工emp_no
思路1:

  1. 以emp_no左连结表
  2. 判断连结后的dept_no 为null的输出emp_no
SELECT employees.emp_no
FROM employees
LEFT JOIN dept_manager
ON employees.emp_no = dept_manager.emp_no
WHERE dept_no IS NULL;

思路2:

  1. 两次select
  2. employees中的emp_no 不在 dept_manager中
SELECT emp_no 
FROM employees
WHERE emp_no 
NOT IN 
(SELECT emp_no FROM dept_manager)

在这里插入图片描述

题目11

SQL11 获取所有员工当前的manager

思路:

  1. 找到共同的字段 dept_no,以dept_no连结
  2. 再筛选出不是领导的员工即可
SELECT dept_emp.emp_no ,dept_manager.emp_no manager 
FROM dept_emp
RIGHT JOIN dept_manager
ON dept_manager.dept_no = dept_emp.dept_no
WHERE dept_emp.emp_no!=dept_manager.emp_no;

在这里插入图片描述

题目12

SQL12 获取每个部门中当前员工薪水最高的相关信息
思路:
这道题卡我的时间比较长
尤其是SELECT dept_no, dept_emp.emp_no, max(salary) maxSalary这样写会导致emp_no和salary对不上号
没有办法,最后想了个笨办法

  1. 生成一个包涵 部门、工号、薪资的表 t1,此表仅作为一个查询表使用,不排序不分组
  2. 生成一个包涵 部门、最大薪资的表 t2(group by + max)
  3. 判断表t2在表t1中符合的人员,符合条件为薪资和部门号同时相同
  4. 最后按照部门号逆序排列输出即可
SELECT t1.dept_no,t1.emp_no,salary maxSalary
FROM(
    SELECT dept_no, dept_emp.emp_no, salary
    FROM dept_emp
    RIGHT JOIN salaries
    ON dept_emp.emp_no = salaries.emp_no
)AS t1,(
    SELECT dept_no, max(salary) maxSalary
    FROM dept_emp
    RIGHT JOIN salaries
    ON dept_emp.emp_no = salaries.emp_no
    GROUP BY dept_no
)AS t2
WHERE t2.maxSalary = t1.salary AND t2.dept_no = t1.dept_no
ORDER BY t2.dept_no;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值