牛客网的SQL实战模块:
https://www.nowcoder.com/ta/sql?page=0
SQL1 查找最晚入职员工的所有信息
select * from employees ORDER BY hire_date desc limit 1
order by desc : 降序排列(从大到小),limit 1:只取一条数据
order by 按由大到小排序后选取第一条的方法,但这种方法仅限于当最晚入职数据只有一条时才正确,不能保证有多条同一最晚时间时的准确性。
正确的解题思路:
select * from employees where hire_date = (select max(hire_date) from employees)
使用子查询的方法,先找出所有入职时间里最大(即最晚)的时间,这样可以确保多条最晚入职时间都可以被查询出来。
SQL2 查找入职员工时间排名倒数第三的员工所有信息
select * from employeesorder by hire_date desc limit 2,1;
只能查出入职时间排名三的时间的员工信息(只有一个人),但入职时间排名倒数第三的员工不止一个
正确的解题思路:
select * from employees where hire_date = (select distinct hire_date from employees order by hire_date desc limit 2,1 )
distinct:去除重复值,limit 2,1:第一个参数表示从第几行数据开始查(索引是从0开始),第二个参数表示查几条数据(这里是从第3行开始查一条数据)
同样使用子查询方法,关键是要用distinct去重(因为员工的入职时间是有重复的,入职时间倒数第三,可能倒数第一和倒数第二入职时间相同,并不是真正的倒数第三),去重后会按入职日期进行分组,多个相同入职日期会分为一组。
SQL3 查找当前薪水详情以及部门编号dept_no
select s.emp_no,s.salary,s.from_date,s.to_date,d.dept_no from salaries s, dept_manager d where s.emp_no = d.emp_no
from...where...:从两个表中查询数据
select s.emp_no,s.salary,s.from_date,s.to_date,d.dept_no from salaries s join dept_manager d on s.emp_no = d.emp_no
join...on:连接两个表
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
select e.last_name,e.first_name,d.dept_no from employees e join dept_emp d on e.emp_no = d.emp_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 where d.dept_no is not null
left join:左连接(这里以employees为左表,dept_emp为右表,连接之后会有dept_no会有null)
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
解题思路:employees作为主表,使用左联结,比较简单。