分享 | 历时一个月多一点,终于把力扣所有的数据库题刷完了,特此留念~
3006
2023.08.11
2023.08.11
发布于 未知归属地

从七月初就开始计划刷力扣的SQL题,到今天已经一个多月的时间了,终于将SQL的全部231道题目都用MySQL实现了一遍!!!

存在的问题

  1. 感觉力扣的SQL题难度标签不是很准确,尤其是会员专属的中等题,大部分都比较简单。相比之下,困难题会准确不少。
  2. 有翻译问题的题目不少,有些直接百度翻译毫无人工干预痕迹,前文还是开车呢,后面就成骑行了......
  3. 有个别题目无法使用力扣的测试功能(本身预设的测试用例报错),但可以通过【已提交issue】。
  4. (2793. 航班机票状态)测试用例有错误,或者说测试用的正确代码有问题【已提交issue】。

刷题建议

如果有朋友也想刷力扣的SQL题,有如下几点建议。

  1. 掌握SQL的基本语法、掌握变量、掌握MySQL8.0新特性(窗口函数 + CTE)【重点】
  2. 测试环境使用MySQL8.0以上版本(因为很多题目需要使用窗口函数和CTE)【重点】
  3. IDE推荐使用datagrip,代码提示比较方便。
  4. 贡献一个我写的清空所有表的存储过程(因为有些题目中的表名会重复,且内部的结构也不相同,如果遇到重复可以运行下文的存储过程删掉所有的表后再执行导入操作)。
  5. 对于做题而言,不需要一开始就注重效率,可以先实现、后优化。
  6. 另外复杂一点的题可以尝试多解。比如使用变量如何解?不用变量如何解?不用窗口函数如何解之类的。
  7. 如果对效率感兴趣也可以自行填充数据测试(我一般用springboot+mybatis-plus+mybatisX插件+hutool随机工具包来填充数据,效率还是挺高的)。

存储过程(注:该存储过程会删除当前数据库的全部表,一定谨慎!!!)

删除当前数据库的所有表
create procedure drop_all_table()
begin
    # 存储cur游标中的每一个表名
    declare cur_name varchar(100) default '';
    # 游标 存储当前表的所有表名 union后的''字符是做游标结束符使用的
    declare cur cursor for
        SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=(select database())
        union
        SELECT '';
    # 打开游标
    open cur;

    fetch cur into cur_name;
    while cur_name != '' do
        # 提前准备好sql语句 表名是不支持?占位符的 所以提前使用concat拼接
        SET @Sentence = concat('drop table ', cur_name);
        PREPARE prod FROM @Sentence;
        EXECUTE prod;
        DEALLOCATE PREPARE prod;
        fetch cur into cur_name;
        end while;
    # 关闭游标
    close cur;
end;

是否值得刷

我感觉还挺不错的,虽然不常用到,一来可以涨涨见识,二来也可以知道SQL究竟能干什么。

刷题过程中遇到问题查文档(MySQL的文档不错),一步步了解MySQL才知道MySQL真的很强大!

有很多黑科技,只是大家平时都不用而已。

刷SQL题确实能提升SQL能力,毕竟SQL语句的逻辑与常见的编程语言的编程逻辑完全不同。

至少我现在觉得即使很难的SQL题目也没有什么可怕的,有种翻手为云覆手为雨的感觉(当然是错觉......)。

评论 (5)