本文已参与「新人创作礼」活动,一起开启掘金创作之路。
🔖文章摘要
题目选自牛客网在线编程SQL实战,文章包含6道题,难度简单,内容依次为:①题目介绍、②代码编写要求、③解题思路、④解题代码和⑤要点总结共五大部分。
📝题目一(难度:简单)
📌题目介绍
假定test数据库存在表titles_test,表内数据如下:
📌编写要求
删除emp_no重复的记录,只保留最小的id对应的记录。删除后titles_test表为(注:最后会select * from titles_test表来对比结果)
📌解题思路
📌解题代码
delete from titles_test
where id not in (
select * from (
select min(id) from titles_test
group by emp_no
) as table1 );
📌要点总结
- delete语法:delete from 表名 【where 筛选条件】【limit m, n】
- 在MySQL中(注意是MySQL中,mssql与oracle不会出错),不允许一边select查询数据,同时根据条件进行更新update、删除delete表内数据。也就是说,不能边查边删。
不然会报错:SQL_ERROR_INFO:"You can‘t specify target table 'titles_test' for update in FROM clause"
📝题目二(难度:简单)
📌题目介绍
假定test数据库存在表titles_test,表内数据如下:
📌编写要求
将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。 更新后titles_test 表的值如下:
📌解题代码
update titles_test
set to_date=null,from_date='2001-01-01'
where to_date='9999-01-01';
📌要点总结
- update用法:update 表名 set 字段=值,字段=值 【where 筛选条件】;
📝题目三(难度:简单)
📌题目介绍
假定test数据库存在表titles_test,表内数据如下:
📌编写要求
将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现,直接使用update会报错。更新后titles_test 表的值如下:
📌解题代码
UPDATE titles_test
set emp_no=replace(emp_no,10001,10005)
where id=5;
📌要点总结
- replace函数用法:replace(string,from_str,to_str) 也就是:将string中所有出现的from_str替换为to_str
- 题中set emp_no=replace(emp_no,10001,10005)将emp_no中为10001替换为10005,由于后面有where id=5的条件限制,因此只修改了id=5的emp_no内容
📝题目四(难度:简单)
📌题目介绍
假定test数据库存在表titles_test,表内数据如下:
📌编写要求
将titles_test表名修改为titles_2017。更新后使用表的情况如下:
📌解题代码
alter table titles_test rename to titles_2017;
📌要点总结
- alter table 表名 rename to/as 新表名;
- 其他修改语法:
📝题目五(难度:简单)
📌题目介绍
在牛客刷题的小伙伴们都有着牛客积分,积分(grade)表简化可以如下:(解释:id为用户主键id,number代表积分情况)
📌编写要求
写一个sql查询,积分表里面出现三次以及三次以上的积分,查询结果如下:
注意:若有多个符合条件的number,则按number升序排序输出。
📌解题思路
📌解题代码
# 解法一:
select number
from (select number,count(*) as cnt from grade group by number) as table1
where cnt>=3
# 解法二:
select number from grade
group by number
having count(*)>=3
📌要点总结
- where是分组前筛选,having是分组后筛选
- where+子查询 可替代 having 效果
📝题目六(难度:简单)
📌题目介绍
有一个person表,主键是id,如下:
有一个任务(task)表如下,主键也是id,如下:
📌编写要求
找到每个人的任务情况,并且输出出来,没有任务的也要输出,而且输出结果按照person的id升序排序,输出情况如下:
📌解题思路
📌解题代码
select person.id, person.name, task.content
from person left join task
on person.id = task.person_id
order by person.id;
📌要点总结
- 主要考查两表连接,注意区别主表即可