1. 实习广场投递简历分析(一)
题目链接
具体实现:
select job, sum(num)cnt from resume_info where date like '2025%' group by job order by cnt desc;
总结:
- 模糊查询
使用like
,我一开始使用=
报错。 group by
应该在where
后面
2. 实习广场投递简历分析(二)
题目链接
具体实现:
select job, date_format(date, '2025-%m') as mon, sum(num) cnt from resume_info where date like '2025%' group by job, mon order by mon desc, cnt desc;
总结:
- 修改日期格式
注意:是修改格式,而不是筛选格式
date_format(date, format)
where
后的多个条件用and
连接。
3. 查找入职员工时间排名倒数第三位的员工的所有信息
题目链接
具体实现:
select * from employees order by hire_date desc limit 2,1;
总结
limit x, y
:跳过x条数据,然后获取y条数据;
limit y offset x
:跳过x条数据,然后获取y条数据;
4. 查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no
题目链接
具体实现:
select s.*, d.dept_no from dept_manager d join salaries s on d.emp_no=s.emp_no order by s.emp_no;
总结
join有四种类型:
(inner) join
:其中inner
关键字可以省略,只有两个表都有才行;left join
:只要左边的表有就行,右边的表没有显示NULL
;right join
:只要右边的表有就行,左边的表没有显示NULL
;full join
:只要有一个表有就行,两表没有的显示NULL
。
5. 查找薪水记录超过15次的员工…
题目链接
具体实现:
select emp_no, count(salary) t
from salaries
group by emp_no
having t > 15;
总结
group by
后面接having
不接where
。
6. 查找employee表所有emp_no为奇数
题目链接
具体实现:
select * from employees where emp_no&1 and last_name<>"Mary" order by hire_date desc;
总结
emp_no & 1 == emp_no%2==1
,因为在sql中,true=1
,false=0
,所以二者所得结果没有分别;<>
等同于!=
,二者意义相同,但是前者的可移植性要优于后者,所以sql中会尽量使用<>
来做判断。
7. 获取当前薪水第二多的员工的emp_no和salary
题目链接
一开始我没有考虑到可能会有多个员工有相同的工资,所以一开始我是这样写的:
select emp_no, salary
from salaries
order by salary desc
limit 1, 1;
即只考虑了一个人,接下来写正确的具体实现:
select emp_no,salary
from
(select emp_no,salary,rank() over(order by salary desc) t
from salaries) sal
where t=2;
总结
rank()
函数是对某个字段的值进行排名,如果有相同,相同的salary
会有相同的排名,但是会留空位,此时t-2
会输出所有salary
第二多的信息。
8. 每个人的最近登陆日期(四)
题目链接
具体实现:
select date, sum(
case when (user_id, date) in
(select user_id, min(date) from login group by user_id)
then 1 else 0 end
)
from login
group by date
order by date;
总结
条件语句:使用case when
关键字;
case when (#字段) in
(#查询语句query) then
满足条件得到的结果 else 不满足条件满足的结果 end