牛客SQL(15-18)

15 查找employees表所有emp_no为奇数,且last_name不为Mary(注意大小写)的员工信息,并按照hire_date逆序排列(题目不能使用mod函数)

解法一

select * from employees
where emp_no%2=1
and last_name != ‘Mary’
order by hire_date desc;

解法二 (使用位运算)

select * from employees
where emp_no&1=1
and last_name != ‘Mary’
order by hire_date desc;
奇数&1=1
偶数&1=0
另外,判定是否为偶数,可以通过先除以2再乘以2
emp_no >> 1 << 1 是否等于emp_no

16 统计出当前(titles.to_date=‘9999-01-01’)各个title类型对应的员工当前(salaries.to_date=‘9999-01-01’)薪水对应的平均工资。结果给出title以及平均工资avg。

select t.title,avg(s.salary) from
titles t inner join salaries s
on t.emp_no = s.emp_no
where t.to_date=‘9999-01-01’
and s.to_date=‘9999-01-01’
group by t.title;

17 获取当前(to_date=‘9999-01-01’)薪水第二多的员工的emp_no以及其对应的薪水salary

解法一 distinct

select emp_no , salary from salaries
where to_date=‘9999-01-01’
and salary =
(select distinct salary from salaries
order by salary desc
limit 1,1);

解法二 group by

select emp_no , salary from salaries
where to_date=‘9999-01-01’
and salary =
(select salary from salaries
group by salary
order by salary desc
limit 1,1);

18 查找当前薪水(to_date=‘9999-01-01’)排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,你可以不使用order by完成吗

去掉最大值再取最大值。
select e.emp_no,s.salary,e.last_name,e.first_name
from employees e inner join salaries s
on e.emp_no = s.emp_no
where salary =
(
select max(salary) from salaries
where salary<(select max(salary) from salaries
where to_date=‘9999-01-01’)
);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值