题库:https://www.nowcoder.com/activity/oj?tab=1
题目不写了,直接写代码和解题思路。
SQL1 查找最晚入职员工的所有信息
可以利用分页,但是最晚的记录不一定只有一个,所以用子查询先查到最晚的时间,外查询找到入职时间是最晚时间的所有员工。
SELECT * FROM employees
WHERE hire_date = (SELECT MAX(hire_date) FROM employees)
SQL2 查找入职员工时间排名倒数第三的员工所有信息
利用分页。其实同理可能有多个,那就把分页作子查询。但是这个也AC了= =
SELECT * FROM employees
ORDER BY hire_date DESC
LIMIT 2,1;
SQL3 查找当前薪水详情以及部门编号dept_no
考察内连接-等值连接、排序
SELECT s.*,d.dept_no
FROM dept_manager d, salaries s
WHERE d.emp_no = s.emp_no
ORDER BY s.emp_no;
SQL4 查找所有已经分配部门的员工的last_name和first_name以及dept_no
考察内连接-等值连接
SELECT e.last_name, e.first_name, d.dept_no FROM employees e, dept_emp d
WHERE e.emp_no = d.emp_no;
SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no
考察外连接-左外连接
SELECT e.last_name, e.first_name, d.dept_no
FROM employees e LEFT JOIN dept_emp d
ON e.emp_no = d.emp_no;
SQL7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
……怎么没有第6题啊
SELECT emp_no, COUNT(emp_no) t
FROM salaries
GROUP BY emp_no
HAVING t > 15;
SQL8 找出所有员工当前薪水salary情况
SELECT DISTINCT salary FROM salaries
ORDER BY salary DESC;
SQL10 获取所有非manager的员工emp_no
子查询 not in
SELECT emp_no
FROM employees
WHERE emp_no NOT IN(SELECT emp_no FROM dept_manager);
也可以用左外连接做,根据员工编号左外连接后:
SELECT e.emp_no
FROM employees e LEFT JOIN dept_manager d
ON e.emp_no = d.emp_no
WHERE dept_no IS NULL;
SQL11 获取所有员工当前的manager
SELECT e.emp_no, m.emp_no manager
FROM dept_emp e,dept_manager m
WHERE e.dept_no = m.dept_no
AND e.emp_no != m.emp_no;
SQL12 获取每个部门中当前员工薪水最高的相关信息
首先看题干想到:
SELECT d.emp_no, d.dept_no, max(salary)
FROM dept_emp d, salaries s
WHERE d.emp_no = s.emp_no
GROUP BY d.dept_no;
但是报错,