热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单的一道SQL题,谈如何提高编程水平

把时间投

点击蓝色“有关SQL”关注我哟

加个“星标”,天天与12238人一起快乐成长

前两天发了一篇《SQL的3列4种对比方法》,近500 阅读。一个月没更文了,没想到朋友们都还关注着,我很激动,非常感谢。

这题是工作中的一个实战题,求维度建模中数据的完整性。因为投行的数据敏感性,我就用阿里的天池竞赛数据,改造了下。

所以有几处地方,被我们微信群里的 xuhui 大佬看出来有瑕疵。在这要声明下,大家对题目中的前置条件,有迷糊的地方,一定找我问清楚。我的微信是 dbLenis.

再次感谢 xuhui 大佬,itpub 的金牌坛主,万忙中,依然愿意在群里为我们解答数据库相关的问题。

有的朋友问我,为什么要写这么一篇没有多少干货的文章呢,难道对比下字段,还有谁不会的么?

就如我在文章中提过的那样,写这篇文章,并不想证明技术实现上有多么的难,或者我的技术水平有多么牛。

只是文中遇到的这个场景,和我在处理时想到的解法及其产生缘由,一定适合每个 SQL 君参考。在为读者们珍惜秀发的方向上,我一直不遗余力,不用谢。

接下来,3个提升编程水平的技巧,送给你。

一,发挥想象,刨根问底

碰到问题,多想解决思路,不必急于解答完。

我留意很多朋友,吃东西时,进食速度特别快。哐哐哐一顿猛吃。印象最深的是,公司有天下午发苹果,有位朋友就是这样,别人一半还没吃完,他就已经洗好嘴巴,跟我们来唠嗑了。

结果有位女士惊奇的一叫,“这苹果里居然有条虫”。“我这里也有,还不止一条”。我就看着这位已经吃完的小伙伴,脸色慢慢由红变黑。

编程我认为也一样。看到一个问题,解决的速度太快,反而失去原本你应该细想,从而找到更优解的机会。

把想当然认为只有一个解的问题,用尽所有方法去寻找一个最优解,并把它记录下来,形成自己的知识库。这是学的最快,也最扎实的路径。

我原本没有这个习惯,认为笔记是学生时代的技巧,对付考试用的。但后来被无数次证明,我是错的。

在电子厂,我们开始用 Oracle 时,我总是记不住那些函数,因为文档特别复杂:

从这里可以看到,你要灵活使用存储过程,就不能靠背,而且文档也做到了,让你背不下来。

文档上的例子,看的时候总觉得会了,会了。但真正用的时候,我是 100% 想不到,原来还可以这么用。

比如 SQL 里面的递归。第一眼看到源码,喜的直呼“惊为天人”,就像张无忌得了乾坤大挪移。有了这“屠龙技”,以后对付树状结构,简直秒杀。

但是,一个月过后,完全就不记得,这“屠龙技”的一招半式,更别说去识别隐藏很深的递归模式。理解模式识别,是晋级必经之路。以后会再提。

后来我碰到一个同事,乙方来的。我问他,有什么好的学 Oracle 的方法。你猜他怎么教我的。

他没给我讲项目,也没给我讲看什么书。他把自己整理的一份 Oracle 编程手册,MSN 上传给了我。

当我看到那份手册,看到他整理的函数大纲,原理图解,还有每种问题的不同解法,我瞬间就明白了,“纸上得来终觉浅”。

于是,我花半个月,整理出来一个 Oracle 知识体系,慢慢往里面填内容。就连安装步骤,我也做了 Red Hat, CentOS, Solaris, AIX 版本。

我在即刻上,看到有朋友说,他按照网上博客,搭建了 5 遍也没搞定安装。于是我就这么回了他:

太急于把一件事情做好,反而会乱了心态。不如好好安下心来,碰到问题,解决问题,想明白背后解决的本质,或许会比单纯做成一件事,收获更多。

二,善用搜索,巧搭框架

整理知识框架,工作量大,但非常有意义。在看 SQL Server/Oracle 那段时间,我刚开始,就是记函数,记技巧。常常为递归,动态 SQL ,开窗函数这些小伎俩而沾沾自喜。

直到海量数据统计,数据库崩溃,大量用户堵塞,这些把我打得毫无招架时,我才发现,原来这些 SQL 编程,都不是太难的问题,真正有难度的是维护一个库的高效、稳定、安全。

这开启了我对数据库体系的探索,于是有了以下这些思维导图:

有过这样的整理后,我继续整理了编程语言类的脑图:

拿着这些脑图,碰到类似的 MySQL, Scala,我就会按图索骥,看看他们是怎么实现已有的 RDBMS/OOP 功能,又有什么新特性需要注意。

于是,当我告诉朋友,Python 上手只要有编程经验,4个小时就可以学会。他表现的十分惊讶。知识框架的迁移,大概率他没有体会过。

那,怎么样才能搭建起自己对行业知识的框架呢。一是阅读;二是搜索

阅读是最基本的技能。在读的过程中,整理出一份属于自己的思维导图,慢慢扩枝散叶,把整个版图无限的扩大。

但仅有读,还不够。得写,写出来是自己懂,而且是真的懂,除非你是在抄书。所以这个写,必须是基于自己实战的写。

说到阅读,并不仅限于读书。书是比较讲全的地方,全方位的讲述知识体系。它的最大弱势,体现在容易落后时代的发展。

比如我在看 Flink 的书,普遍还在讲 Flink 1.1, 1.2, 可官网最新版本,已经是 Flink 1.14 了,如此悬殊的版本差异,做起例子来,自然错误百出。以我这段时间的上手实操,发现最多的问题,都是 ClassNotDefined 相关。

以现在的藏书量,你要看完,才动手做一件事情,几乎很难。读完一本完整体系的书,就要开始往里填东西。切莫说,要等读完所有的书,再去做实验,那就太晚了。等你读完一本,可能又有新书出来了。

除了书,官网,还可以多看些近些年的硕博论文。这些论文,普遍都能嗅到实战的气息。甚至有些论文,就是大厂案例直接写进来的。特别有意义。

前两天我有个读者问我,哪里有银行业的数据维度建模案例可以参考。其实很多时候,去知网搜索下就知道了:

书,网摘(博客,公众号文章),论文,这些都是信息源,过去信息非常闭塞,只有少数人在讨论,在发声,我们想要了解一个技术,行业,往往热衷于混论坛,订阅 RSS. 

而现在的互联网,乐于分享的人多了,造成了信息过剩。内容一旦量产,同质化就会很严重,于是判断一个信息源是否可信,就非常关键。

有时候即使付费了,依然得不到有用的信息,时间金钱两丢。

以我的经验,一般会选择书,论文,网文这样的顺序。同一信源中,还要挑选优质的作者,出版社。这就更需要花时间了。

如果有朝一日,我的公众号《有关SQL》能在你的收录名单里,我会非常开心。当然,我会尝试做得更好,写更优质的文章。

世上什么最贵?信任!!!

三,多做多试,勤于记录

相信你身边一定有这样的人,遇到难题请教他们时,他们会很快回答你:哦,这个事情啊,很简单,只要这样这样,那样那样。

或者给他们一些任务时,他们永远反馈:放心吧,这个简单,给我 2天时间,就能搞定。

我见过很多这样的人,事情刚在脑子里登机,结论马上从口里降落了。他们究竟是要展示大包大揽的勇气,还是自己快人一拍的智商?

这些年,啪啪啪打脸的经验告诉我,最危险的,也是收获最小的做事方式:脑子里煮饺子,就是吃不着。说人话,纯靠脑子里的臆想,从来不主动落实,就永无完成日。

大致上,做事情有规律可循:计划,实施,检验,重复,即 PDCA. 这样的做事路径,再配合每次对各个步骤的时间统计,就能估摸出一件事情的时间成本。

就拿学数据库这样的系统性工程,大约学到能干活的程度,需要掌握整个体系的40%。

从整理得到的 RDMBS 体系章节来看,也就是要掌握 6 个知识点,即 SQL, 内存管理,存储结构,事务控制,权限控制,查询引擎,就可以找到一份工作。

那么 6个知识点,乍一看,非常简单。读一遍目录,只要没语言障碍,就那么点东西,2分钟读完了。

此时,脑子给你的反馈就是,撑死 8天。但现实,往往是,就装个 MySQL, 可能  2 天时间就没了。还时不时的连不上,各种给你脸色看。

这个时候,你就会开始怀疑自己的能力和智商了。

解决之道,便是相信记录。事无巨细,哪怕是一个奇怪的异常,都要记录下来。把目前的困境,用过的解决方案,尝试写下来,问题就具象化了。

你的记录越多,越能感知时间的消耗。等到任务完成,立体的时间成本就会向你报到。

我一直推荐,柳比歇夫的笔记方式。做完一件事,及时写上这件事的用时,培养自己的时间观。

让自己变平庸的方式有很多,只用已有的技巧和经验,去不停的解决同一类问题,便是一种。这就是大家深恶痛绝的“卷”,枯燥且无意义!

这篇文章,并不是我一本正经教大家怎么学 SQL,同时也是写给我自己看的,时刻提醒自己,多尝试,多实验。

最后我以最近在学的 Maven, Flink 及 Scala 的任务看板,作为今天的结尾,我和大家一样,也在不断地扩展自己的技术领域,相信不久的将来,我能多写一些其他编程领域的知识。你我共勉!

--完--

往期精彩:

本号精华合集(三)

外企一道 SQL 面试题,刷掉 494 名候选人

我在面试数据库工程师候选人时,常问的一些题

零基础 SQL 数据库小白,从入门到精通的学习路线与书单




推荐阅读
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • PostgreSQL 与 MySQL 的主要差异及应用场景分析
    本文详细探讨了 PostgreSQL 和 MySQL 在架构、性能、功能以及适用场景方面的关键差异。通过对比分析,帮助读者更好地理解两种数据库系统的特性和优势,为实际应用中的选择提供参考。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 本文深入探讨了 C# 中 `SqlCommand` 和 `SqlDataAdapter` 的核心差异及其应用场景。`SqlCommand` 主要用于执行单一的 SQL 命令,并通过 `DataReader` 获取结果,具有较高的执行效率,但灵活性较低。相比之下,`SqlDataAdapter` 则适用于复杂的数据操作,通过 `DataSet` 提供了更多的数据处理功能,如数据填充、更新和批量操作,更适合需要频繁数据交互的场景。 ... [详细]
  • 作为第一个正式项目,感触颇多,系统刚做完没多久,写点笔记记录下来吧。本系统主要功能是进行数据统计,比如统计学院的进馆次数,平均次数,进馆排行,图书馆年报等等在接到这个商用项目时,听 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • Flink1.10定义UDAGG遇到SQL
    按照以下代码测试定义的UDAGG会一直出现org.apache.flink.table.api.ValidationException:SQLvalidationfailed.nu ... [详细]
author-avatar
mobiledu2502911857
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有