谢邀,针对问题给出点个人的经验和见解,希望对题主有帮助 ( PS: 全程亲自手打 / 手画,无任何 Copy )
首先,从博主的提问诉求来看,显然是已经尝试过刷题战术(刷题战术是没问题的,我仍然支持)和其他相关的战术了,主要留存的问题在于记不牢和没有实战过,那么我就针对这些问题,从我个人经历过的一些方法和角度,给出一些建议,希望能帮助到你:
理解记忆
从一个文科生的角度来说,你肯定是没有系统学习过数据库的,那么我认为最好的切入点就是语意理解。你应该听过记忆的方法之一就是理解记忆 —— 然后你是文科生嘛,基本的英语肯定不差的。
那我们来看看一个基本的语法: select * from A —— 他就相当于 Select all from A,翻译过来就是 “从A里查出所有东西”。从这个基本的理解作为衍生,再到where —— 相当于一个从句嘛, select * from a where A.name = 'test' 。 那翻译过来就是 Select all from A where A's name is 'test.' 再加大这个从句的内容描述 —— select * from a where A.name = 'test' group by id, 翻译过来 —— Select all from A where A name is 'test' group by id. (从A中查出所有内容,其中A按照id分组且名称为“test”)
同理你会发现,所有的sql语句,从简单到复杂都能用这个方法来形容描述。由于 Sql 是一门 结构化 的语言,你又是在理解的基础上去记忆的,下次无非就是写重复的内容,不同的只是表和字段而已了。久而久之,你会发现写sql和写一句话一样的简单,信手拈来。
图像记忆
上面说完理解记忆了,现在再说出我的第二个法宝,就是图像记忆 —— 你在针对表写sql的时候,有点卡壳的原因大多数情况下是因为你对表结构不理解不熟悉,所以我建议你建立表的图像。
比如UML建模,或者用PDM画出来,别看到名字就以为很难被吓到,建议你先去百度了解一下,如果不愿意百度,我这里也可以简单的告诉你一下,没多复杂 —— 其实就是一张图的表格。你可以用Navicat对多张表右键【逆向表到模型】,然后就能看到表的内容了,然后再对表设置你想要的颜色(有趣吧),相同的业务用相同的颜色。然后再对表右键来设置主外键关系(就是工具而已,多点一点看一看你就会用了),最终图就像下面这样了:
通过这张我为你建立好的表 —— 你能一目了然的看到上方的 t_user 是主表,下方的 t_user_detail 的是子表,通过外键 user_id 来连接 (注意最开始不需要多复杂的表,当然熟悉后你可以建立更多的表关系来练习) —— 如此,表在你的大脑里就有了清晰的图像了,他的结构你也你清楚,那子表可以是多个内容,你想查一个用户user的用户明细userDetail怎么办?那就是从子表里找这个用户id的内容即可,假设用户id是1,那就是 select * from t_user_detail where user_id = 1。
你可以试试这个方法,因为你建立了图像,针对这个图像你练习了sql。你会记得非常清楚,熟悉了结构,写sql自然而然会更加顺手,甚至有时候吃饭的时候都会想到这个图像的结构...
最后针对你的 “预期每天花费30min深度学习+零散时间30min练习,希望30天内做到熟练” 回答一下 —— 就像我开头说过的,我认为刷题战术是没问题的,所以我仍然支持你刷题,但是要在理解的基础上刷题,比如你连表结构都没熟悉清除,然后业务也没理解透就开始刷题,这是很容易卡壳的。在说你再公司真正的实战,也是在业务理解透出的基础上来写内容的,我们平时工作中也经常会用到我上面都说的PDM画图内容,帮助更好理解。
再多提一嘴,这些都是辅助你理解记忆和练习的。掌握这些了,熟练会写sql了还不够。要写出好的sql还需要一点功夫,好的sql能加快执行效率,节省消耗等等。要学会这些,你就真的要求了解数据库的一些详细知识了,这里简单列举一些能够真正提升你实战技术水平的知识点,比如 —— sql的执行顺序,sql的分析语句,怎样建立索引,索引在什么场景失效,建表的范式,以及适当的逆范式,存储的数据结构,等等(这些我也个人建议在极客时间找专栏看,这里没有任何广告,因为我以前是这样过来的,或者你可以找其他途径来完善自己的数据库知识,那么你每天花的时间不管是深度学习还是零散学习就可以把这个内容包括进去)。
好了,这就是我针对你核心诉求的一些小建议,希望对你有帮助,希望你早日成为 数据库大神 , 谢谢 !