题目
SQL196 查找入职员工时间排名倒数第三的员工所有信息 X
SELECT * FROM employees
WHERE hire_date=
( SELECT DISTINCT hire_date
FROM employees
ORDER BY hire_date DESC
LIMIT 1 OFFSET 2
)
SQL197 查找当前薪水详情以及部门编号dept_no √
SELECT salaries.*, dept_manager.dept_no
FROM salaries, dept_manager
WHERE salaries.emp_no = dept_manager.emp_no
ORDER BY salaries.emp_no
SQL198 查找所有已经分配部门的员工的last_name和first_name以及dept_no √
SQL199 查找所有员工的last_name和first_name以及对应部门编号dept_no X
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
注意LEFT JOIN的语法, 是ON
SQL204
所有非部门领导的员工emp_no
用以下查询语句不能实现:
SELECT DISTINCT employees.emp_no
FROM employees, dept_manager
WHERE employees.emp_no != dept_manager.emp_no
因为用了他会逐行比较左边表列与右边表列不相等的情况, 所以只要右表的列与坐标的列有不相同的, 那就会返回, 所以在原题目会返回10001, 10002, 10003
, 实际上应该用
SELECT emp_no
FROM employees
WHERE emp_no NOT IN (
SELECT emp_no
FROM dept_manager
)
SQL205 获取所有员工当前的manager
最好使用连接, 使得逻辑更清晰
SELECT dept_emp.emp_no, dept_manager.emp_no as manager
FROM dept_emp
INNER JOIN dept_manager
ON dept_emp.dept_no = dept_manager.dept_no
WHERE dept_emp.emp_no != dept_manager.emp_no
我第一次写的是如下也能过但是不清晰
SELECT dept_emp.emp_no, dept_manager.emp_no as manager
FROM dept_emp, dept_manager
WHERE dept_emp.emp_no != dept_manager.emp_no AND dept_emp.dept_no = dept_manager.dept_no
TO_DATE的妙用
正在职位的员工和领导的日期都会设置为9999-01-01
, AND to_date = '9999-01-01'
是一个额外的条件,它在查询中用于筛选当前任职的部门领导。在这种情况下,日期 ‘9999-01-01’ 被假设为一个特殊的值,用于表示当前在职的部门领导,因为 ‘9999-01-01’ 比任何其他日期都要远大于当前日期。
通过添加 AND to_date = '9999-01-01'
条件,查询语句会限制结果只包括当前在职的部门领导,而排除已经离职的部门领导。这样可以确保只返回有效的部门领导记录。
如果部门领导表中的离职日期(to_date)的值为 ‘9999-01-01’,那么查询结果将只包含当前在职的部门领导的员工编号。
欢迎在评论区中进行批评指正,转载请注明来源,如涉及侵权,请联系作者删除。