牛客SQL二刷(13-18)

13、从titles表获取按照title进行分组

要求:每组个数大于等于2,给出title以及对应的数目t

这道题的话主要是用到一个点 group by having

SELECT title, COUNT(*) AS t
FROM titles
GROUP BY title HAVING COUNT(*) >= 2

14、查找employees表

要求:所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列

这道题就是写出要求的几个过滤条件即可:(再次吐槽一下牛客奇奇怪怪的题目需求)

  1. emp_no是奇数 emp_no % 2 = 1
  2. last_name不是Mary last_name <> 'Mary’
  3. hire_date逆序排序 ORDER BY hire_date DESC
SELECT *
FROM employees
WHERE emp_no % 2 = 1 AND last_name <> 'Mary'
ORDER BY hire_date DESC

15、统计出当前各个title类型对应的员工当前薪水对应的平均工资

这道题用对 title 进行 group by ,然后用两个当前进行过滤即可。

SELECT t.title, AVG(s.salary) AS avg
FROM titles AS t
INNER JOIN salaries AS s
ON t.emp_no = s.emp_no
AND t.to_date = '9999-01-01'
AND s.to_date = '9999-01-01'
GROUP BY t.title

16、获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

这道题的题眼在于薪水第二多,也是笔面试种考核频率较高的一个知识点。一般来说有几种解决方法,第一是如果salary不重复可以直接用LIMIT1, 1,第二种的话是第二高可能会有多个人所以需要用子查询结合MAX,第二种更加准确。

-- salary不重复
SELECT emp_no, salary
FROM salaries
WHERE to_date = '9999-01-01'
ORDER BY salary DESC
LIMIT 1, 1
-- 第二高有多人
SELECT emp_no, salary
FROM salaries
WHERE salary = 
(
    SELECT salary 
    FROM salaries 
    GROUP BY salary
    ORDER BY salary DESC 
    LIMIT 1, 1
) 
AND to_date = '9999-01-01'

Trick 1: 注意第n高这种题目,分清要的结果有没有多个结果。

17、获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

要求:不准使用order by

这个就和上面16题进行对照了,就是常考的点。思路就是把最大的给去掉然后找出最大的。
这里给了一个很巧妙的解法,因为同样第二高薪水的人也不一定只有一个,所以就算一定要使得salary等于找出来的这个数。然后用了小于和MAX。

SELECT e.emp_no, salary, last_name, first_name
FROM employees AS e 
INNER JOIN salaries AS s
WHERE e.emp_no = s.emp_no 
AND s.to_date = '9999-01-01'
AND salary = 
(
    SELECT MAX(salary) 
    FROM salaries 
    WHERE salary < (SELECT MAX(salary) FROM salaries)
) 

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

这题应该是没有难度的,就是把几个表连在一起就行,注意联结的方向。

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个

红包金额最低5元

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

抵扣说明:

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

余额充值