SQL1.请你查找employees里最晚入职员工的所有信息;.
考虑到可能 会有多个员工在同一天入职,且不知道人数。用MAX查出入职时间这一列的最大值,即最晚入职时间。
select MAX(hire_date) from employees
再从职员表中查出入职时间为这天的员工
select * from employees where hire_date = (select MAX(hire_date) from employees)
SQL2.请你查找employees里入职员工时间排名倒数第三的员工所有信息
同理,可能会有多个员工在同一天入职,先用DISTINCT关键词返回入职时间,这样可以去重。同时用ORDER BY DESC进行降序排序。DISTINCT关键词返回唯一不同的值
select distinct hire_date from employees
order by hire_date desc
用LIMIT关键词取第三行数据,即排名倒数第三的入职时间。LIMIT X,Y 和LIMIT Y OFFSET X 都是跳过X行数据,取Y行数据。数据库数据计算是从0开始的
select distinct hire_date from employees
order by hire_date desc
limit 1 offset 2
最后取出员工信息
select * from employees
where hire_date = (
select distinct hire_date from employees
order by hire_date desc
limit 1 offset 2)
SQL3.请你查找各个部门领导薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列
用右连接连接两个表,并用order by排序。右连接以右边的表为参照,只在右边的表有的列和两张表中都有的列会出现在查询结果中,而只在左边的表出现的列不会出现。左连接则相反,只在左边的表有的记录和两张表都有的列会出现在查询结果中。内连接的查询结果只出现两张表都有的列。
select s.*,d.dept_no
from salaries s right dept_manager d
on s.emp_no=d.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 right join dept_emp d
on e.emp_no=d.emp_no
SQL5.请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工
要求也查询出暂时没分配具体部门的员工,查询时以employees表为主,这里使用左连接即可
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
SQL6.请你查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
先使用group by子句根据emp_no分组,再使用聚合函数,统计记录次数,最后使用having字句去掉不符合条件的查询结果。
where子句中不能出现聚集函数,而having子句可以,having子句的筛选单位是组而不是行。当查询语句里同时有where,group by,聚集函数,having时,运行顺序是首先根据where子句的条件筛选出符合条件的数据,再执行group by子句根据条件形成各个组,接着对各个组执行聚集函数,计算出每一组的值,最后执行having子句去掉不符合条件的组。
select emp_no,count(emp_no) as t
from salaries
group by emp_no
having t>15
SQL7.请你找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示
可以用disticnct关键字,也可以用group by语句,再用order by desc实现逆序排序。我做出的结果证明用group by字句会更快。
select salary from salaries
group by salary
order by salary desc