牛客SQL编程题1-7

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值