【数据蛙·week1】SQL进阶总结
WEEK1的课程主要还是围绕在SQL进阶部分,对我而言更多的还是复习和补缺了。同时,也通过45题的强化来巩固知识点,尤其是对于某些join和函数用法有了更多的体会。
一、SQL的复习和补缺
1、group by的标准用法是需要把所有聚合的部分都放入其中,但是mysql数据库的兼容性能更高,所以允许不把需要聚合的部分放到group by中。所以,我的想法还是尽量规范标准,这样比较好的习惯,有助于后续的学习以及到其他平台如hive上的代码能力。
2、排序的一些用法:order by在有多个字段为标准排序时候,需要分别在字段名后面注明排序的方式,而不是所有的默认按照最后的那个字段指定方式排序。还有就是limit的灵活用法,limit(a,b)表示从a行开始的b行数据会被选出来。这种可以用来查看某一指定行的数据。例如,中位数其实也可以用这个方法来处理,但是我们更习惯用row_number()over或者直接估计的方式来计算。
3、view的一些高级用法:工作中倒是有用到过view,但是对于view到底是怎么操作的逻辑现在才搞明白。最大的感受是,访问view时候的速度会很慢,但是view的好处是不占据空间,而且会随着原来查询的语句或者表的变化而随之变化。不用担心会错过表中的什么变化。
4、事务:事务定义的是一系列的操作序列,只有所有的行为都完成了才算结束这个事务。如果这个事务在执行一半的时候停止了,那么整个事务的执行就中断了,之前的操作也不会被记录。
5、索引:索引是用来优化搜索,适合速度慢数据量大的情况。反之,则不适合。
6、时间函数:时间函数的运用非常重要,尤其是在将字符串和时间能相互转换,以及对于时间的运算。(1)字符串转时间:str_to_date(str, format),需要将str的格式指定到format里面,这样才能让这个函数明白这个str是怎么构成的;(2)时间转字符串:date_format(time, format),同样也是要告诉这个函数,时间是如何构成的,然后转化为字符串,另外注意这里也可以改写时间的格式;(3)时间的运算,关注的是日期的偏移:date_sub(date, INTERVAL expr type)表示将date进行格式为type的时间格式,数量为expr的增加偏移;date_add(date, INTERVAL expr type)对应为减少偏移;(4)时间差:timestampdiff(unit, begin, end),将end与begin两个时间之间做差,然后以unit的格式输出,这个unit可以自行指定。个人感觉比较常用包括date_format,既可以转化为时间,也可以改写timestamp格式到date格式;还有就是timestampdiff计算时间差,虽然另外可以通过格林尼治时间的秒来转化,但是这个更加简单。
二、45题总结
零零散散花了大概3天总共4个小时把45题做完,没有想象中的难,不过覆盖了很多的点。
(1)自连接的使用:同一张表的left join 可以查出所有涉及同一段比较的信息(第1题)。当然我觉得也可以分开用两个子查询来使用,但是自连接的效率会更高。
(2)left join的on对比where:如果需要把left join出来中为可能为NULL的值也要选出来的话,需要把筛选的条件放到on后面,这样会把left join结果是NULL的也带出来。但是,如果把筛选条件放在where后面,那么NULL值会被过滤掉。
(3)开窗函数和函数的使用:对于涉及排名的问题,我之前一直不明白为什么不能使用row_number(),后来才知道低版本的mysql(8.0以下的版本)是不支持开窗函数的使用。相反,只能用自变量的函数来解决。不过,后来我在网上搜索相关资料的时候,也看到可以自连接的用法来实行,然后通过计数来得到排名,感觉这个方法好像更巧妙了。
(4)化零为整的group_concat(x order by x):如果要比较同一字段中的所有的数据,则可以通过group_concat来把这些字段合并在一起,然后比较即可。我感觉这种用法还是很灵活的,需要在实践中多多尝试和练习。
接下来的目标想把开窗函数再研究一下,然后把牛客网和leetcode上的题目也刷一遍。