可维护、可阅读的SQL代码的十个优秀实践
<p>没有正确的指导,它很容易混淆SQL。由于团队中的每个人都可能有自己的写作SQL习惯,因此您可以快速结束一个没有人理解的令人困惑的代码。</p>
<p>
您可能意识到遵循一套良好实践的重要性..这篇文章为您提供了您正在寻找的指导!</p>
<p>
<img title="可维护、可阅读的SQL代码的十个优秀实践" alt="可维护、可阅读的SQL代码的十个优秀实践" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/2bed427b2592d7c0d8f8a40fcc0adc6b.jpg" width="auto"></p>
<h3>
1. 使用大写的关键字</h3>
<p>
让我们从一个基本开始:使用大写的SQL关键字,以及小写的表和列。使用SQL函数的大写(First_Value(),date_trunc()等)也是一个很好的做法。</p>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>select id, name from company.customers </span></span>
</li>
</ol>
<p>
而是:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT id, name FROM company.customers </span></span>
</li>
</ol>
<h3>
2. 使用Snake Case进行Schema,表,列的编写</h3>
<p>
编程语言在案例类型时具有最佳实践:Camelcase,Pascalcase,Kebabuic和Snake_Case是最常见的。</p>
<p>
涉及SQL,Snake Case(有时称为下划线Case)是最广泛使用的约定。</p>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT Customers.id, </span></span>
</li>
<li>
<span> Customers.name, </span>
</li>
<li class="alt">
<span> COUNT(WebVisit.id) as nbVisit </span>
</li>
<li>
<span>FROM COMPANY.Customers </span>
</li>
<li class="alt">
<span>JOIN COMPANY.WebVisit ON <span class="attribute">Customers.id</span><span> = </span><span class="attribute-value">WebVisit</span><span>.customerId </span></span>
</li>
<li>
<span>WHERE Customers.age <span class="tag"><</span><span>= 30 </span></span>
</li>
<li class="alt">
<span>GROUP BY Customers.id, Customers.name </span>
</li>
</ol>
<p>
而是:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT customers.id, </span></span>
</li>
<li>
<span> customers.name, </span>
</li>
<li class="alt">
<span> COUNT(web_visit.id) as nb_visit </span>
</li>
<li>
<span>FROM company.customers </span>
</li>
<li class="alt">
<span>JOIN company.web_visit ON <span class="attribute">customers.id</span><span> = </span><span class="attribute-value">web_visit</span><span>.customer_id </span></span>
</li>
<li>
<span>WHERE customers.age <span class="tag"><</span><span>= 30 </span></span>
</li>
<li class="alt">
<span>GROUP BY customers.id, customers.name </span>
</li>
</ol>
<p>
虽然有些人喜欢包括区分Schema,表和列的变体,但我建议使用Snake Case。</p>
<h3>
3. 在提高可读性时使用别名</h3>
<p>
众所周知,别名是重命名表或列没有意义的表格或列的便捷方式。当他们的名字并不有意义时,请随时向您的表和列提供别名,并别名。</p>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT customers.id, </span></span>
</li>
<li>
<span> customers.name, </span>
</li>
<li class="alt">
<span> customers.context_col1, </span>
</li>
<li>
<span> nested.f0_ </span>
</li>
<li class="alt">
<span>FROM company.customers </span>
</li>
<li>
<span>JOIN ( </span>
</li>
<li class="alt">
<span> SELECT customer_id, </span>
</li>
<li>
<span> MIN(date) </span>
</li>
<li class="alt">
<span> FROM company.purchases </span>
</li>
<li>
<span> GROUP BY customer_id </span>
</li>
<li class="alt">
<span> ) ON <span class="attribute">customer_id</span><span> = </span><span class="attribute-value">customers</span><span>.id </span></span>
</li>
</ol>
<p>
而是:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT customers.id, </span></span>
</li>
<li>
<span> customers.name, </span>
</li>
<li class="alt">
<span> customers.context_col1 as ip_address, </span>
</li>
<li>
<span> first_purchase.date as first_purchase_date </span>
</li>
<li class="alt">
<span>FROM company.customers </span>
</li>
<li>
<span>JOIN ( </span>
</li>
<li class="alt">
<span> SELECT customer_id, </span>
</li>
<li>
<span> MIN(date) as date </span>
</li>
<li class="alt">
<span> FROM company.purchases </span>
</li>
<li>
<span> GROUP BY customer_id </span>
</li>
<li class="alt">
<span> ) AS first_purchase </span>
</li>
<li>
<span> ON <span class="attribute">first_purchase.customer_id</span><span> = </span><span class="attribute-value">customers</span><span>.id </span></span>
</li>
</ol>
<p>
我通常用小写的列别名,以及具有大写的表。</p>
<h3>
4. 格式化:仔细使用缩进和空格</h3>
<p>
即使它是一个基本的原则,使您的代码更具可读性是一个快速的胜利。正如您与Python一样,您应该标识您的SQL代码。</p>
<p>
关键字后,以及使用子查询或派生表后。</p>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT customers.id, customers.name, customers.age, customers.gender, customers.salary, first_purchase.date </span></span>
</li>
<li>
<span>FROM company.customers </span>
</li>
<li class="alt">
<span>LEFT JOIN ( SELECT customer_id, MIN(date) as date FROM company.purchases GROUP BY customer_id ) AS first_purchase </span>
</li>
<li>
<span>ON <span class="attribute">first_purchase.customer_id</span><span> = </span><span class="attribute-value">customers</span><span>.id </span></span>
</li>
<li class="alt">
<span>WHERE customers.age<span class="tag"><</span><span>=30 </span></span>
</li>
</ol>
<p>
而是:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT customers.id, </span></span>
</li>
<li>
<span> customers.name, </span>
</li>
<li class="alt">
<span> customers.age, </span>
</li>
<li>
<span> customers.gender, </span>
</li>
<li class="alt">
<span> customers.salary, </span>
</li>
<li>
<span> first_purchase.date </span>
</li>
<li class="alt">
<span>FROM company.customers </span>
</li>
<li>
<span>LEFT JOIN ( </span>
</li>
<li class="alt">
<span> SELECT customer_id, </span>
</li>
<li>
<span> MIN(date) as date </span>
</li>
<li class="alt">
<span> FROM company.purchases </span>
</li>
<li>
<span> GROUP BY customer_id </span>
</li>
<li class="alt">
<span> ) AS first_purchase </span>
</li>
<li>
<span> ON <span class="attribute">first_purchase.customer_id</span><span> = </span><span class="attribute-value">customers</span><span>.id </span></span>
</li>
<li class="alt">
<span>WHERE customers.age <span class="tag"><</span><span>= 30 </span></span>
</li>
</ol>
<p>
此外,请注意我们如何在where子句中使用白空格。</p>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT id WHERE customers.age</span><span class="tag"><</span><span>=30 </span></span>
</li>
</ol>
<p>
而是:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT id WHERE customers.age </span><span class="tag"><</span><span>= 30 </span></span>
</li>
</ol>
<h3>
5. 避免 Select *</h3>
<p>
值得提醒这种良好的做法。您应该明确关于要选择的内容,因此避免使用SELECT *。</p>
<p>
选择使您的请求不清楚,因为它隐藏了查询背后的意图。另外,请记住,您的表可能会发展和影响选择。这就是为什么我不是除()教学的除外粉丝。</p>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT * EXCEPT(id) FROM company.customers </span></span>
</li>
</ol>
<p>
更喜欢:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT name, </span></span>
</li>
<li>
<span> age, </span>
</li>
<li class="alt">
<span> salary </span>
</li>
<li>
<span>FROM company.customers </span>
</li>
</ol>
<h3>
6. 使用ANSI-92 Join 语法</h3>
<p>
…而不是Join表的SQL where子句。虽然您可以使用where子句和join子句来联结表,但它是使用Join / ansi-92语法的最佳实践。</p>
<p>
虽然性能方面没有差异,但是Join子句将关系逻辑与过滤器分开并提高可读性。</p>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT customers.id, </span></span>
</li>
<li>
<span> customers.name, </span>
</li>
<li class="alt">
<span> COUNT(transactions.id) as nb_transaction </span>
</li>
<li>
<span>FROM company.customers, company.transactions </span>
</li>
<li class="alt">
<span>WHERE <span class="attribute">customers.id</span><span> = </span><span class="attribute-value">transactions</span><span>.customer_id </span></span>
</li>
<li>
<span> AND customers.age <span class="tag"><</span><span>= 30 </span></span>
</li>
<li class="alt">
<span>GROUP BY customers.id, customers.name </span>
</li>
</ol>
<p>
而是:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT customers.id, </span></span>
</li>
<li>
<span> customers.name, </span>
</li>
<li class="alt">
<span> COUNT(transactions.id) as nb_transaction </span>
</li>
<li>
<span>FROM company.customers </span>
</li>
<li class="alt">
<span>JOIN company.transactions ON <span class="attribute">customers.id</span><span> = </span><span class="attribute-value">transactions</span><span>.customer_id </span></span>
</li>
<li>
<span>WHERE customers.age <span class="tag"><</span><span>= 30 </span></span>
</li>
<li class="alt">
<span>GROUP BY customers.id, customers.name </span>
</li>
</ol>
<p>
“Where基于条款”语法 - 也称为ANSI-89 - 比新的ANSI-92大,这就是为什么它仍然很常见。如今,大多数开发人员和数据分析师都使用Join语法。</p>
<h3>
7. 使用公共表表达式(CTE)</h3>
<p>
CTE允许您定义和执行查询,其中结果暂时存在,并且可以在更大的查询中使用。CTE可在大多数现代数据库上获得。</p>
<p>
它类似于派生表,具有2个优点:</p>
<ul>
<li>
使用CTE提高了查询的可读性</li>
<li>
CTE是定义一次,然后可以多次参考</li>
</ul>
<p>
您用 WITH … AS:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>WITH my_cte AS( SELECT col1, col2 FROM table)SELECT * FROM my_cte </span></span>
</li>
</ol>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>SELECT customers.id, </span></span>
</li>
<li>
<span> customers.name, </span>
</li>
<li class="alt">
<span> customers.age, </span>
</li>
<li>
<span> customers.gender, </span>
</li>
<li class="alt">
<span> customers.salary, </span>
</li>
<li>
<span> persona_salary.avg_salary as persona_avg_salary, </span>
</li>
<li class="alt">
<span> first_purchase.date </span>
</li>
<li>
<span>FROM company.customers </span>
</li>
<li class="alt">
<span>JOIN ( </span>
</li>
<li>
<span> SELECT customer_id, </span>
</li>
<li class="alt">
<span> MIN(date) as date </span>
</li>
<li>
<span> FROM company.purchases </span>
</li>
<li class="alt">
<span> GROUP BY customer_id </span>
</li>
<li>
<span> ) AS first_purchase </span>
</li>
<li class="alt">
<span> ON <span class="attribute">first_purchase.customer_id</span><span> = </span><span class="attribute-value">customers</span><span>.id </span></span>
</li>
<li>
<span>JOIN ( </span>
</li>
<li class="alt">
<span> SELECT age, </span>
</li>
<li>
<span> gender, </span>
</li>
<li class="alt">
<span> AVG(salary) as avg_salary </span>
</li>
<li>
<span> FROM company.customers </span>
</li>
<li class="alt">
<span> GROUP BY age, gender </span>
</li>
<li>
<span> ) AS persona_salary </span>
</li>
<li class="alt">
<span> ON <span class="attribute">persona_salary.age</span><span> = </span><span class="attribute-value">customers</span><span>.age </span></span>
</li>
<li>
<span> AND <span class="attribute">persona_salary.gender</span><span> = </span><span class="attribute-value">customers</span><span>.gender </span></span>
</li>
<li class="alt">
<span>WHERE customers.age <span class="tag"><</span><span>= 30 </span></span>
</li>
</ol>
<p>
而是:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>WITH first_purchase AS </span></span>
</li>
<li>
<span>( </span>
</li>
<li class="alt">
<span> SELECT customer_id, </span>
</li>
<li>
<span> MIN(date) as date </span>
</li>
<li class="alt">
<span> FROM company.purchases </span>
</li>
<li>
<span> GROUP BY customer_id </span>
</li>
<li class="alt">
<span>), </span>
</li>
<li>
<span>persona_salary AS </span>
</li>
<li class="alt">
<span>( </span>
</li>
<li>
<span> SELECT age, </span>
</li>
<li class="alt">
<span> gender, </span>
</li>
<li>
<span> AVG(salary) as avg_salary </span>
</li>
<li class="alt">
<span> FROM company.customers </span>
</li>
<li>
<span> GROUP BY age, gender </span>
</li>
<li class="alt">
<span>) </span>
</li>
<li>
<span>SELECT customers.id, </span>
</li>
<li class="alt">
<span> customers.name, </span>
</li>
<li>
<span> customers.age, </span>
</li>
<li class="alt">
<span> customers.gender, </span>
</li>
<li>
<span> customers.salary, </span>
</li>
<li class="alt">
<span> persona_salary.avg_salary as persona_avg_salary, </span>
</li>
<li>
<span> first_purchase.date </span>
</li>
<li class="alt">
<span>FROM company.customers </span>
</li>
<li>
<span>JOIN first_purchase ON <span class="attribute">first_purchase.customer_id</span><span> = </span><span class="attribute-value">customers</span><span>.id </span></span>
</li>
<li class="alt">
<span>JOIN persona_salary ON <span class="attribute">persona_salary.age</span><span> = </span><span class="attribute-value">customers</span><span>.age </span></span>
</li>
<li>
<span> AND <span class="attribute">persona_salary.gender</span><span> = </span><span class="attribute-value">customers</span><span>.gender </span></span>
</li>
<li class="alt">
<span>WHERE customers.age <span class="tag"><</span><span>= 30 </span></span>
</li>
</ol>
<h3>
8. 有时,它可能值得分成多个查询</h3>
<p>
小心这个。让我们给出一些背景:</p>
<p>
我经常在BigQuery上使用Airflow,转换数据和准备数据可视化上执行SQL查询。我们有一个工作流Orchestrator(气流),以定义的顺序执行请求。在某些情况下,我们选择将复杂查询拆分为多个较小的查询。</p>
<p>
代替:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>CREATE TABLE customers_infos AS </span></span>
</li>
<li>
<span>SELECT customers.id, </span>
</li>
<li class="alt">
<span> customers.salary, </span>
</li>
<li>
<span> traffic_info.weeks_since_last_visit, </span>
</li>
<li class="alt">
<span> category_info.most_visited_category_id, </span>
</li>
<li>
<span> purchase_info.highest_purchase_value </span>
</li>
<li class="alt">
<span>FROM company.customers </span>
</li>
<li>
<span>LEFT JOIN ([..]) AS traffic_info </span>
</li>
<li class="alt">
<span>LEFT JOIN ([..]) AS category_info </span>
</li>
<li>
<span>LEFT JOIN ([..]) AS purchase_info </span>
</li>
</ol>
<p>
你可以使用:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>## STEP1: Create initial table </span></span>
</li>
<li>
<span>CREATE TABLE public.customers_infos AS </span>
</li>
<li class="alt">
<span>SELECT customers.id, </span>
</li>
<li>
<span> customers.salary, </span>
</li>
<li class="alt">
<span> 0 as weeks_since_last_visit, </span>
</li>
<li>
<span> 0 as most_visited_category_id, </span>
</li>
<li class="alt">
<span> 0 as highest_purchase_value </span>
</li>
<li>
<span>FROM company.customers </span>
</li>
<li class="alt">
<span>## STEP2: Update traffic infos </span>
</li>
<li>
<span>UPDATE public.customers_infos </span>
</li>
<li class="alt">
<span>SET <span class="attribute">weeks_since_last_visit</span><span> = </span><span class="attribute-value">DATE_DIFF</span><span>(CURRENT_DATE, </span></span>
</li>
<li>
<span> last_visit.date, WEEK) </span>
</li>
<li class="alt">
<span>FROM ( </span>
</li>
<li>
<span> SELECT customer_id, max(visit_date) as date </span>
</li>
<li class="alt">
<span> FROM web.traffic_info </span>
</li>
<li>
<span> GROUP BY customer_id </span>
</li>
<li class="alt">
<span> ) AS last_visit </span>
</li>
<li>
<span>WHERE <span class="attribute">last_visit.customer_id</span><span> = </span><span class="attribute-value">customers_infos</span><span>.id </span></span>
</li>
<li class="alt">
<span>## STEP3: Update category infos </span>
</li>
<li>
<span>UPDATE public.customers_infos </span>
</li>
<li class="alt">
<span>SET <span class="attribute">most_visited_category_id</span><span> = [...] </span></span>
</li>
<li>
<span>WHERE [...] </span>
</li>
<li class="alt">
<span>## STEP4: Update purchase infos </span>
</li>
<li>
<span>UPDATE public.customers_infos </span>
</li>
<li class="alt">
<span>SET <span class="attribute">highest_purchase_value</span><span> = [...] </span></span>
</li>
<li>
<span>WHERE [...] </span>
</li>
</ol>
<p>
警告:即使这种方法在简化复杂查询时,它可能会带来可读性/性能权衡。</p>
<p>
如果您使用OLAP或任何面向列的数据库,则尤其如此,针对聚合和分析查询(选择,AVG,MIN,MAX,…)进行优化,但在交谈时更少的性能(更新)。</p>
<p>
虽然在某些情况下,它也可能提高您的表现。即使使用现代面向列的数据库,也会导致内存或性能问题太多。在这些情况下,拆分您的请求通常有助于性能和内存。</p>
<p>
此外,值得一提的是,您需要某种程序或Orchestrator以定义的顺序执行查询。</p>
<h3>
9. 基于您自己的约定的有意义的名称</h3>
<p>
正确地命名你的模式和表格很难。使用哪些命名约定是值得难得的,但选择一个并坚持下来并非。您应该定义自己的惯例,并通过您的团队通过它。</p>
<table align="center" border="0" cellpadding="6" cellspacing="0" width="95%"><tbody><tr>
<td bgcolor="#fdfddf">
<font color="#FF0000"> </font>计算机科学中只有两个难题:缓存失效和命名的东西。 - 菲尔卡尔顿</td>
</tr></tbody></table>
<p>
以下是我使用的约定示例:</p>
<p>
(1) Schema</p>
<p>
如果您使用多种目的的分析数据库,则是在有意义的模式下组织表的良好做法。</p>
<p>
在我们的BigQuery数据库中,我们每个数据源的一个架构。更重要的是,我们根据其目的输出不同模式的结果。</p>
<ul>
<li>
任何应由第三方工具可访问的任何表都在公共架构中奠定。Dataviz工具,如DataSudio或Tableau从这里获取他们的数据。</li>
<li>
自从我们使用BQML使用机器学习以来,我们有一个专用的Machine_Learning架构。</li>
</ul>
<p>
(2) 表</p>
<p>
表格本身应该根据惯例,我们有几个数据可视化的仪表板,每个仪表板都有自己的目的:营销仪表板,一个产品仪表板,一个行政仪表板,名称为几个。</p>
<p>
我们的公共模式中的每个表都由仪表板的名称前缀。有些例子可能包括:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>product_inbox_usage </span></span>
</li>
<li>
<span>product_addon_competitor_stats </span>
</li>
<li class="alt">
<span>marketing_acquisition_agencies </span>
</li>
<li>
<span>executive_funnel_overview </span>
</li>
</ol>
<p>
在与团队合作时,值得花时间定义您的约定。谈到命名一个新表时,永远不要使用快速和肮脏的名称,你会“更改”:你可能不会。</p>
<p>
随意使用这些示例来定义您的约定。</p>
<h3>
10. 最后,写下有用的注释……但不是太多</h3>
<p>
我同意良好的写作和理所当然地命名的代码不应需要评论的想法。读取代码的人甚至应该在代码本身之前了解逻辑和意图。</p>
<p>
仍然,评论可能在某些情况下很有用。但你肯定应该避免评论的陷阱太多。</p>
<p>
避免:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>WITH fp AS </span></span>
</li>
<li>
<span>( </span>
</li>
<li class="alt">
<span> SELECT c_id, # customer id </span>
</li>
<li>
<span> MIN(date) as dt # date of first purchase </span>
</li>
<li class="alt">
<span> FROM company.purchases </span>
</li>
<li>
<span> GROUP BY c_id </span>
</li>
<li class="alt">
<span>), </span>
</li>
<li>
<span>ps AS </span>
</li>
<li class="alt">
<span>( </span>
</li>
<li>
<span> SELECT age, </span>
</li>
<li class="alt">
<span> gender, </span>
</li>
<li>
<span> AVG(salary) as avg </span>
</li>
<li class="alt">
<span> FROM company.customers </span>
</li>
<li>
<span> GROUP BY age, gender </span>
</li>
<li class="alt">
<span>) </span>
</li>
<li>
<span>SELECT customers.id, </span>
</li>
<li class="alt">
<span> ct.name, </span>
</li>
<li>
<span> ct.c_age, # customer age </span>
</li>
<li class="alt">
<span> ct.gender, </span>
</li>
<li>
<span> ct.salary, </span>
</li>
<li class="alt">
<span> ps.avg, # average salary of a similar persona </span>
</li>
<li>
<span> fp.dt # date of first purchase for this client </span>
</li>
<li class="alt">
<span>FROM company.customers ct </span>
</li>
<li>
<span># join the first purchase on client id </span>
</li>
<li class="alt">
<span>JOIN fp ON <span class="attribute">c_id</span><span> = </span><span class="attribute-value">ct</span><span>.id </span></span>
</li>
<li>
<span># match persona based on same age and genre </span>
</li>
<li class="alt">
<span>JOIN ps ON <span class="attribute">ps.age</span><span> = </span><span class="attribute-value">c_age</span><span> </span></span>
</li>
<li>
<span> AND <span class="attribute">ps.gender</span><span> = </span><span class="attribute-value">ct</span><span>.gender </span></span>
</li>
<li class="alt">
<span>WHERE c_age <span class="tag"><</span><span>= 30 </span></span>
</li>
</ol>
<p>
而是:</p>
<ol class="dp-xml">
<li class="alt">
<span><span>WITH first_purchase AS </span></span>
</li>
<li>
<span>( </span>
</li>
<li class="alt">
<span> SELECT customer_id, </span>
</li>
<li>
<span> MIN(date) as date </span>
</li>
<li class="alt">
<span> FROM company.purchases </span>
</li>
<li>
<span> GROUP BY customer_id </span>
</li>
<li class="alt">
<span>), </span>
</li>
<li>
<span>persona_salary AS </span>
</li>
<li class="alt">
<span>( </span>
</li>
<li>
<span> SELECT age, </span>
</li>
<li class="alt">
<span> gender, </span>
</li>
<li>
<span> AVG(salary) as avg_salary </span>
</li>
<li class="alt">
<span> FROM company.customers </span>
</li>
<li>
<span> GROUP BY age, gender </span>
</li>
<li class="alt">
<span>) </span>
</li>
<li>
<span>SELECT customers.id, </span>
</li>
<li class="alt">
<span> customers.name, </span>
</li>
<li>
<span> customers.age, </span>
</li>
<li class="alt">
<span> customers.gender, </span>
</li>
<li>
<span> customers.salary, </span>
</li>
<li class="alt">
<span> persona_salary.avg_salary as persona_avg_salary, </span>
</li>
<li>
<span> first_purchase.date </span>
</li>
<li class="alt">
<span>FROM company.customers </span>
</li>
<li>
<span>JOIN first_purchase ON <span class="attribute">first_purchase.customer_id</span><span> = </span><span class="attribute-value">customers</span><span>.id </span></span>
</li>
<li class="alt">
<span>JOIN persona_salary ON <span class="attribute">persona_salary.age</span><span> = </span><span class="attribute-value">customers</span><span>.age </span></span>
</li>
<li>
<span> AND <span class="attribute">persona_salary.gender</span><span> = </span><span class="attribute-value">customers</span><span>.gender </span></span>
</li>
<li class="alt">
<span>WHERE customers.age <span class="tag"><</span><span>= 30 </span></span>
</li>
</ol>
<h3>
结论</h3>
<p>
SQL很棒。它是数据分析,数据科学,数据工程甚至软件开发的基础之一:它不会等待。它的灵活性是一种力量,但可以是陷阱。</p>
<p>
您可能不会最初意识到这一点,特别是如果您是唯一负责自己代码的人。但在某些时候,在与团队合作或者有人继续工作时,没有一系列最佳实践的SQL代码将成为负担。</p>
<p>
在本文中,我总结了编写SQL的最常见的优秀实践。当然,有些是争辩或基于个人意见:您可能希望从这里获得灵感,并定义与您的团队不同的东西。</p>
<p>
我希望它能帮助您将您的SQL质量带到一个下一个高度!</p>
<p>
<span><span>原文链接:</span></span><span>https://towardsdatascience.com/10-best-practices-to-write-readable-and-maintainable-sql-code-427f6bb98208</span></p>
<p>
原文链接:https://www.toutiao.com/a6993549976768905732/</p>
頁:
[1]