MySQL做题实战9|| 3号简单篇(包含题目6道,难度:简单)

简介:题目来自牛客网在线编程SQL实战,文章内容主要是讲解博主自己做题时的思路、相关见解以及要点总结。总的来说,就是明bug易改,暗bug难查,路漫漫其修远兮,吾将上下而求索!

题目一(难度:简单)

假定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;

比较总结:

  • 主要考查两表连接,注意区别主表即可
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值