牛客网入门和简单难度
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字段排序