以下源于编程实战:SQL数据库实战题_面试必刷+解析_牛客题霸_牛客网
描述:有一个员工employees表简况如下。
有一个各个部门的领导表dept_manager简况如下:
有一个全部员工的薪水表salaries简况如下:
有一个员工职称表titles简况如下:
有一个部门表departments表简况如下:
SQL1:查找最晚入职员工的所有信息
SELECT *
FROM employees
WHERE hire_date =
(SELECT max(hire_date) FROM employees )
##考虑到如果只有一条记录在这一天入职,也可以这么解
select * from employees order by hire_date desc limit 1
SQL2:查找倒数第三晚入职员工的所有信息
窗口函数参考链接:
mysql实现开窗函数、Mysql实现分析函数 - 郭大侠1 - 博客园
MySQL操作实战(二):窗口函数_陆-CSDN博客_mysql窗口函数
# 从0开始计数,第三行的下标即为2
# 1为步长
# 2,1即取第三行
# 存在bug:如果第三名有多个则无法满足
select *
from employees
ORDER BY hire_date DESC
limit 2,1
# distinct解法
SELECT *
FROM employees
WHERE hire_date = (SELECT DISTINCT hire_date
FROM employees
ORDER BY hire_date
DESC LIMIT 2,1)
# 窗口函数解法
SELECT emp_no,birth_date,first_name,last_name,gender,hire_date
FROM (
SELECT *, DENSE_RANK() OVER (ORDER BY hire_date DESC) as row_num
FROM employees
) tmp
WHERE row_num = 3
SQL3:查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序
SELECT s.*, d.dept_no
FROM salaries s JOIN dept_manager d ON s.emp_no = d.emp_no
ORDER BY s.emp_no
SQL4:找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示
select last_name, first_name, dept_no
from employees e join dept_emp d ON e.emp_no = d.emp_no
SQL5:查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工
SELECT last_name, first_name, dept_no
FROM employees e LEFT JOIN dept_emp d ON e.emp_no = d.emp_no
SQL7:查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
SELECT emp_no, COUNT(1) t
FROM salaries
GROUP BY emp_no
HAVING t > 15
SQL8:找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示
SELECT DISTINCT salary
FROM salaries
ORDER BY salary DESC
SQL10:找出所有非部门领导的员工emp_no
SELECT emp_no
FROM employees
WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager)
SQL11:获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示
SE