简说Python,号主老表,Python终身学习者,数据分析爱好者,从18年开始分享Python知识,原创文章227篇,写过Python、SQL、Excel入门文章,也写过Web开发、数据分析文章,老表还总结整理了一份2022Python学习资料和电子书资源,关注后私信回复:2022 即可领取。
SQL15 查找employees表emp_no与last_name的员工信息
我的思路: 这个从题目标题无法看出需求,需要具体看描述:查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列。直接按照需求写sql即可,这里判断员工编号是否为奇数,可以使用%对2取余数进行判断,余数为1即为奇数。
我的题解:
select * from employees where emp_no % 2 = 1 and last_name != 'Mary' order by hire_date desc ;
涉及知识点:
- 完整sql执行顺序(每天看一遍,不信记不住):
from -> where -> group by -> having -> select -> order by -> limit
- sql 取余数可以直接使用
%
- order by hire_date desc 按hire_date列降序排序
提交结果:
其他题解:
select * from employees where emp_no&1 = 1 and last_name != 'Mary' order by hire_date desc ;
这里判断是否为奇数,也可以使用位运算进行判断,任何数和1的位运算结果如果是1,则是奇数,否则运算结果为0,则为偶数。
这个是真的涨见识了,位运算很好的应用实践。
SQL16 统计出当前各个title类型对应的员工当前薪水对应的平均工资
我的思路: 比较常规,首先明确需求:结果给出title以及平均工资avg,并且以avg升序排序,所以先将titles和salaries进行join连接,然后根据title进行分组求salary的平均值即可,最后按照平均值进行升序排序。
我的题解:
select title, avg(salary) as avg_s from ( select a.emp_no, a.title, b.salary from titles as a join salaries as b on a.emp_no = b.emp_no and a.to_date = b.to_date and a.to_date = '9999-01-01') as c group by title order by avg_s ;
涉及知识点:
- 完整sql执行顺序(每天看一遍,不信记不住):
from -> where -> group by -> having -> select -> order by -> limit
- 窗口函数:avg使用
- group by 分组
- order by 排序,默认是升序
提交结果:
SQL17 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
我的思路: 这个只有一个表,蛮简单的,直接按照salary降序排序,取出第二列数据即可。
我的题解:
select emp_no, salary from salaries where to_date = '9999-01-01' order by salary desc limit 1,1 ;
涉及知识点:
- 完整sql执行顺序(每天看一遍,不信记不住):
from -> where -> group by -> having -> select -> order by -> limit
- order by salary desc 降序排序
- 从指定位置开始取出指定行:limit m,n 从m+1行开始,取出n行数据
提交结果:
其他题解:上面解法有局限性,如果排名第一的有很多个,那么取出来的还是薪水最高的,所以好的方法应该是直接按第二的薪水进行筛选。
所以我们先找出第二薪水是多少,然后筛选出薪水等于第二薪水的行即可。
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 ) order by salary desc ;