如何编写更优质的 SQL:高级 SQL 第一集
照片由Caspar Camille Rubin拍摄,来自Unsplash
SQL 仍然是数据处理的首选语言。它诞生于 20 世纪 70 年代,是少数几个始终保持不变的技术之一。无论出现多少拖放工具,或者多少新的查询范式试图取代它,SQL 都始终屹立不倒。
SQL 仍然是目前应用最广泛的数据交互技术。即使出现了使用NoSQL或 Not Only SQL 的数据库,但像 Presto 和 Hive 这样的底层技术也已在其之上开发出来,以提供友好的 SQL 交互体验。
不仅如此。
但 SQL 的应用范围早已远远超出了数据工程师和分析师的范畴。
大型科技公司的产品经理、分析合作伙伴和软件工程师通常使用 SQL 来快速访问数据和回答问题。
重点是,SQL 是值得学习的。
但是,一旦掌握了 SQL 的基础知识,该如何继续深入学习呢?
如何才能使 SQL 用户从新手成长为高级用户?
过去几年,我们花了很多时间编写 SQL 代码,用于数据管道、仪表板、数据产品和其他零碎的东西。
我们认为高级 SQL 的重点不在于语法。在学习了分析子句之后,就不会有太多花哨的子句了。
当然,你可以在 SQL 中进行循环,甚至可以编辑文件。
然而,所有这些操作也可以在代码中发生。
那么,SQL 初级用户和 SQL 高级用户之间的区别是什么?
我们认为关键在于从全局角度思考。高级 SQL 开发人员着眼于长远而非短期利益。他们开发的 SQL 代码更易于维护、更易读,也更需要时间和深思熟虑。
在本文中,我们将重点讨论我们认为区分初级 SQL 开发人员和高级 SQL 开发人员的许多设计决策。
你会注意到,这不仅仅局限于 SQL,很多内容还会涉及更概念性的问题,而这些问题并没有明确的最佳解决方案。
建议的格式将分为问题或行为两部分,并辅以解决方案或改进方法。说实话,有些解决方案可能属于设计偏好范畴。
我们相信你们中的一些人可能对我们在这里提供的建议持有不同意见。请留下您的评论和看法,我们很乐意进一步讨论。您也可以点击此处观看视频版本。
那么,让我们开始学习吧!
将逻辑放在 SQL 语句中 vs 放在表中
Case 从句非常有用。但是,有些人使用 Case 从句的方式有两种,可能会在日后给你带来麻烦。
首先,是重复逻辑。
重复逻辑是什么意思?我们指的是在多个查询、视图和管道中使用相同的 case 语句。
例如,我们来看下面的例子。我们在多个地方使用了相同的逻辑。在这个例子中,它既出现在每月重复进行的数据分析中使用的临时查询中,也出现在 BI 开发人员的Tableau仪表板中。
--this query is being used in a tableau dashboard by a BI Developer
SELECT patient_id
,total_cost DATE
,CASE
WHEN PROCEDURE_CODE = BETWEEN '9990'
AND '10000'
AND age BETWEEN 30
AND 40
THEN 'category 1'
WHEN PROCEDURE_CODE = BETWEEN '9980'
AND '9990'
AND age BETWEEN 40
AND 50
THEN 'category 2'
ELSE 'No Category'
END
FROM patient_claims
-- this query is an adhoc query just meant to filter out category 2 by a data analyst on a different team
SELECT patient_id
,total_cost DATE
FROM patient_claims
WHERE PROCEDURE_CODE = BETWEEN '9980'
AND '9990'
AND age BETWEEN 40
AND 50
现在,假设某个类别的逻辑由于某种原因需要更新。您甚至可能不知道所有需要更新的地方。如果不同的团队在管理所有这些不同的查询,又该怎么办?
谁来通知他们进行更新?又该如何告知他们这一变化?
并非每家公司都有强大的工具来帮助查找此类重复逻辑。
另一个类似的问题是,工程师们决定使用 CASE 语句作为枚举,而不是使用表。
例如,我们来看一下下面的查询。
SELECT CASE
WHEN id = 1
THEN 'category 1'
WHEN id = 2
THEN 'category 2'
WHEN id = 3
THEN 'category 3'
WHEN id = 4
THEN 'category 4'
WHEN id = 5
THEN 'category 5'
WHEN id = 6
THEN 'category 6'
WHEN id = 7
THEN 'category 7'
WHEN id = 8
THEN 'category 8'
WHEN id IN (
9
,10
,11
)
THEN 'category 9'
END
FROM dim_procedures
解决方案
在这种情况下,你应该考虑使用表格。这样你就可以在不修改代码的情况下向表格中添加更多 ID。这种方法更简洁,也更容易测试,不易出错。
这两种情况都适用。无论你是像第一个查询那样使用重复逻辑,还是将 SQL 语句当作表来使用。
无论哪种情况,都应该考虑创建表格的利弊。
需要注意的是,这种解决方案也有其优缺点。添加新表意味着需要维护新的代码。精通 SQL 的一部分就是学会权衡利弊。
敬请期待我们的下一篇文章,我们将探讨设计中的权衡取舍。
你将如何提升你的 SQL 技能?
SQL 似乎已经成为主流。事实上,它的发展速度似乎还在加快。现在的挑战是如何将 SQL 技能提升到新的水平。这不仅仅是学习新的语法那么简单。
关键在于学习如何让你的 SQL 代码更易于维护、更易读、更值得信赖。这样做能让你编写出更高层次的 SQL 代码。你将创建出公司所有员工都能长期信赖的数据集、仪表盘和指标,而不仅仅是几个月的短期解决方案。
从产品经理到数据分析师,越来越多的公司职位要求员工至少能够用SQL进行日常对话。在任何职位上,从数据中提取洞见的能力都至关重要。
如果您喜欢这些内容,不妨看看我们其他的精彩视频和文章。
使用 Python 自动从 Google Sheets 中提取数据
将 DynamoDB 和 S3 中的数据连接起来以进行实时即席分析
文章来源:https://dev.to/seattledataguy/how-to-write-better-sql-advanced-sql-episode-1-7e8