Leecode之sql解题记录(一)

牛客网入门和简单难度

1、查找最晚入职员工的所有信息

select * from employees order by hire_date  desc limit 1

思路:根据入职日期字段倒序排列,最晚 limit 1

2、查找所有已经分配部门的员工的last_name和first_name以及dept_no

select e.last_name,e.first_name,d.dept_no 
from employees as e,dept_emp as d
where e.emp_no = d.emp_no

思路:员工表和部门表联查,根据字段emp_no相等,判断员工是否已经分配部门

3、查找入职员工时间排名倒数第三的员工所有信息

select * from employees
order by hire_date desc 
limit 1 offset 2 

思路:根据字段hire_date倒序排列,倒数第三  就要偏移2,所以offset 2

4、查找当前薪水详情以及部门编号dept_no

select s.*,d.dept_no 
from salaries as s inner join dept_manager as d
on s.emp_no=d.emp_no
where s.to_date="9999-01-01"
and d.to_date="9999-01-01"
order by s.emp_no

思路:2个表联查,使用内连接,根据字段emp_no判断是否是领导,根据s.emp_no排序

5、查找所有员工的last_name和first_name以及对应部门编号dept_no

select e.last_name,e.first_name,d.dept_no 
from employees as e left join dept_emp as d 
on e.emp_no = d.emp_no

思路:使用外连接的左连接,左边是大表,右边是小表,根据字段emp_no判断

6、查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t

select emp_no,count(emp_no) as t
from salaries
group by emp_no having t>15

思路:count(字段),作为新字段t,,根据字段emp_no分组,然后having筛选

7、找出所有员工当前薪水salary情况

select distinct salary from salaries 
order by salary desc 

思路:根据salary字段排序,desc倒序关键字,只显示一次 去重关键字 distinct

8、获取所有非manager的员工emp_no

select e.emp_no 
from employees as e
where e.emp_no not in(
    select emp_no  from dept_manager)

思路:先查询出是manager的员工,然后not in 
 

9、获取所有员工当前的manager

select a.emp_no,b.emp_no
from dept_emp as a inner join dept_manager as b 
on a.dept_no=b.dept_no
and a.to_date="9999-01-01"
and b.to_date="9999-01-01"
and a.emp_no <> b.emp_no

思路:使用内连接,确定连接字段为dept_no,

条件是 员工级别显示,经理自己不显示,那么emp_no字段不相等就可以达成

10、查找employees表emp_no与last_name的员工信息

select * from employees
where emp_no % 2=1 and last_name <> "Mary"
order by hire_date desc

思路:emp_no字段为奇数,last_name不等于Mary

hire_date倒序排列

11、获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

select emp_no,salary from salaries
order by salary desc 
limit 1 offset 1

思路:先按照salary字段降序排序,然后第二多表示第一名偏移1

12、将employees表的所有员工的last_name和first_name拼接起来作为Name

SELECT CONCAT(last_name," ",first_name) as name FROM employees

思路:mysql里面的语法连接就是 concat(字段1,字段2) as 新字段名

select (last_name || ' ' || first_name) as name

from employees

注意:sqlite里面的语法,连接是 ||

13、批量插入数据

insert into actor  VALUES
(1,"PENELOPE","GUINESS","2006-02-15 12:34:33"),
(2,"NICK","WAHLBERG","2006-02-15 12:34:33")

思路:批量插入数据语法为  insert into table values(.....),(......)

14、删除emp_no重复的记录,只保留最小的id对应的记录

delete from titles_test
WHERE id not in (select * from
(select min(id) from titles_test GROUP by emp_no) as t)

思路:在MYSQL里,不能先select一个表的记录,再按此条件进行更新和删除同一个表的记录,会报错,所以需要再select一次,然后删除

15、将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。

update titles_test SET
to_date=null,from_date="2001-01-01" 
WHERE to_date="9999-01-01" 

思路:更新记录的语法,update table set 字段1=值1,字段2=值2 ,where进行筛选

16、将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005

UPDATE titles_test SET 
emp_no=REPLACE(emp_no,"10001","10005")
WHERE id=5

思路:直接使用update会报错,replace(字段名,旧值,新值)

17、将titles_test表名修改为titles_2017

ALTER table titles_test
RENAME to titles_2017

思路:考察语法  alter table 旧表名 rename 头 新表名

18、出现三次以上相同积分的情况

select number FROM grade
GROUP BY number
HAVING COUNT(id)>=3

思路:将积分字段分组,筛选出ID出现三次及以上的number

19、找到每个人的任务

select p.id,p.name,t.content
from person p
left join task t
on p.id = t.person_id
order by p.id

思路:左连接,确定连接字段,根据person表的ID排序

20、牛客每个人最近的登录日期(一)

select user_id,max(date) as d
FROM login
group by user_id
order by user_id

思路:最近的日期,max(date),然后每一个user_id 显示一次,group by分组去重

再根据user_id排序

21、查询各个岗位分数的平均数,并且按照分数降序排序,结果保留小数点后面3位(3位之后四舍五入):

select job,round(avg(score),3) as avg
FROM grade
GROUP by job
ORDER by avg DESC

思路:平均数avg(字段),分数降序排序order by字段 desc  保留三位小数,round(数字,小数位数) 

22、牛客的课程订单分析(一)

select *
FROM order_info
WHERE date>"2025-10-15" 
and status="completed"
and product_name in ("C++","Java","Python")
order by id

思路:日期在2025-10-15之后,状态为完成,课程字段为C++、Java、Python

根据ID排序

23、在2025年内投递简历的岗位和数量,并且按数量降序排序

select job,sum(num) as cnt
from resume_info
WHERE date>="2025-01-01"
and date<="2025-12-31"
GROUP by job
order by cnt DESC

思路:在2025年内还有一种表示为  year(date)=“2025”

group by 去重分组,cnt字段排序

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值