成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

可維護、可閱讀的SQL代碼的十個優秀實踐

數據庫 MySQL
SQL很棒,它是數據分析,數據科學,數據工程甚至軟件開發的基礎之一。在本文中,我總結了編寫SQL的最常見的優秀實踐。

沒有正確的指導,它很容易混淆SQL。由于團隊中的每個人都可能有自己的寫作SQL習慣,因此您可以快速結束一個沒有人理解的令人困惑的代碼。

您可能意識到遵循一套良好實踐的重要性..這篇文章為您提供了您正在尋找的指導!

[[416033]]

1. 使用大寫的關鍵字

讓我們從一個基本開始:使用大寫的SQL關鍵字,以及小寫的表和列。使用SQL函數的大寫(First_Value(),date_trunc()等)也是一個很好的做法。

避免:

  1. select id, name from company.customers 

而是:

  1. SELECT id, name FROM company.customers 

2. 使用Snake Case進行Schema,表,列的編寫

編程語言在案例類型時具有最佳實踐:Camelcase,Pascalcase,Kebabuic和Snake_Case是最常見的。

涉及SQL,Snake Case(有時稱為下劃線Case)是最廣泛使用的約定。

避免:

  1. SELECT Customers.id,  
  2.        Customers.name,  
  3.        COUNT(WebVisit.id) as nbVisit 
  4. FROM COMPANY.Customers 
  5. JOIN COMPANY.WebVisit ON Customers.id = WebVisit.customerId 
  6. WHERE Customers.age <= 30 
  7. GROUP BY Customers.id, Customers.name 

而是:

  1. SELECT customers.id,  
  2.        customers.name,  
  3.        COUNT(web_visit.id) as nb_visit 
  4. FROM company.customers 
  5. JOIN company.web_visit ON customers.id = web_visit.customer_id 
  6. WHERE customers.age <= 30 
  7. GROUP BY customers.id, customers.name 

雖然有些人喜歡包括區分Schema,表和列的變體,但我建議使用Snake Case。

3. 在提高可讀性時使用別名

眾所周知,別名是重命名表或列沒有意義的表格或列的便捷方式。當他們的名字并不有意義時,請隨時向您的表和列提供別名,并別名。

避免:

  1. SELECT customers.id,  
  2.        customers.name,  
  3.        customers.context_col1, 
  4.        nested.f0_ 
  5. FROM company.customers 
  6. JOIN ( 
  7.           SELECT customer_id, 
  8.                  MIN(date) 
  9.           FROM company.purchases 
  10.           GROUP BY customer_id 
  11.       ) ON customer_id = customers.id 

而是:

  1. SELECT customers.id,  
  2.        customers.name,  
  3.        customers.context_col1 as ip_address, 
  4.        first_purchase.date    as first_purchase_date 
  5. FROM company.customers 
  6. JOIN ( 
  7.           SELECT customer_id, 
  8.                  MIN(date) as date 
  9.           FROM company.purchases 
  10.           GROUP BY customer_id 
  11.       ) AS first_purchase  
  12.         ON first_purchase.customer_id = customers.id 

我通常用小寫的列別名,以及具有大寫的表。

4. 格式化:仔細使用縮進和空格

即使它是一個基本的原則,使您的代碼更具可讀性是一個快速的勝利。正如您與Python一樣,您應該標識您的SQL代碼。

關鍵字后,以及使用子查詢或派生表后。

避免:

  1. SELECT customers.id, customers.name, customers.age, customers.gender, customers.salary, first_purchase.date 
  2. FROM company.customers 
  3. LEFT JOIN ( SELECT customer_id, MIN(date) as date FROM company.purchases GROUP BY customer_id ) AS first_purchase  
  4. ON first_purchase.customer_id = customers.id  
  5. WHERE customers.age<=30 

而是:

  1. SELECT customers.id,  
  2.        customers.name,  
  3.        customers.age,  
  4.        customers.gender,  
  5.        customers.salary, 
  6.        first_purchase.date 
  7. FROM company.customers 
  8. LEFT JOIN ( 
  9.               SELECT customer_id, 
  10.                      MIN(date) as date  
  11.               FROM company.purchases 
  12.               GROUP BY customer_id 
  13.           ) AS first_purchase  
  14.             ON first_purchase.customer_id = customers.id 
  15. WHERE customers.age <= 30 

此外,請注意我們如何在where子句中使用白空格。

避免:

  1. SELECT id WHERE customers.age<=30 

而是:

  1. SELECT id WHERE customers.age <= 30 

5. 避免 Select *

值得提醒這種良好的做法。您應該明確關于要選擇的內容,因此避免使用SELECT *。

選擇使您的請求不清楚,因為它隱藏了查詢背后的意圖。另外,請記住,您的表可能會發展和影響選擇。這就是為什么我不是除()教學的除外粉絲。

避免:

  1. SELECT * EXCEPT(id) FROM company.customers 

更喜歡:

  1. SELECT name, 
  2.        age, 
  3.        salary 
  4. FROM company.customers 

6. 使用ANSI-92 Join 語法

…而不是Join表的SQL where子句。雖然您可以使用where子句和join子句來聯結表,但它是使用Join / ansi-92語法的最佳實踐。

雖然性能方面沒有差異,但是Join子句將關系邏輯與過濾器分開并提高可讀性。

避免:

  1. SELECT customers.id,  
  2.        customers.name,  
  3.        COUNT(transactions.id) as nb_transaction 
  4. FROM company.customers, company.transactions 
  5. WHERE customers.id = transactions.customer_id 
  6.       AND customers.age <= 30 
  7. GROUP BY customers.id, customers.name 

而是:

  1. SELECT customers.id,  
  2.        customers.name,  
  3.        COUNT(transactions.id) as nb_transaction 
  4. FROM company.customers 
  5. JOIN company.transactions ON customers.id = transactions.customer_id 
  6. WHERE customers.age <= 30 
  7. GROUP BY customers.id, customers.name 

“Where基于條款”語法 - 也稱為ANSI-89 - 比新的ANSI-92大,這就是為什么它仍然很常見。如今,大多數開發人員和數據分析師都使用Join語法。

7. 使用公共表表達式(CTE)

CTE允許您定義和執行查詢,其中結果暫時存在,并且可以在更大的查詢中使用。CTE可在大多數現代數據庫上獲得。

它類似于派生表,具有2個優點:

  • 使用CTE提高了查詢的可讀性
  • CTE是定義一次,然后可以多次參考

您用 WITH … AS:

  1. WITH my_cte AS( SELECT col1, col2 FROM table)SELECT * FROM my_cte 

避免:

  1. SELECT customers.id,  
  2.        customers.name,  
  3.        customers.age,  
  4.        customers.gender,  
  5.        customers.salary, 
  6.        persona_salary.avg_salary as persona_avg_salary, 
  7.        first_purchase.date 
  8. FROM company.customers 
  9. JOIN ( 
  10.           SELECT customer_id, 
  11.                  MIN(date) as date  
  12.           FROM company.purchases 
  13.           GROUP BY customer_id 
  14.       ) AS first_purchase  
  15.         ON first_purchase.customer_id = customers.id 
  16. JOIN ( 
  17.           SELECT age, 
  18.              gender, 
  19.              AVG(salary) as avg_salary 
  20.          FROM company.customers 
  21.          GROUP BY age, gender 
  22.       ) AS persona_salary  
  23.         ON persona_salary.age = customers.age 
  24.            AND persona_salary.gender = customers.gender 
  25. WHERE customers.age <= 30 

而是:

  1. WITH first_purchase AS 
  2.    SELECT customer_id, 
  3.           MIN(date) as date  
  4.    FROM company.purchases 
  5.    GROUP BY customer_id 
  6. ), 
  7. persona_salary AS 
  8.    SELECT age, 
  9.           gender, 
  10.           AVG(salary) as avg_salary 
  11.    FROM company.customers 
  12.    GROUP BY age, gender 
  13. SELECT customers.id,  
  14.        customers.name,  
  15.        customers.age,  
  16.        customers.gender,  
  17.        customers.salary, 
  18.        persona_salary.avg_salary as persona_avg_salary, 
  19.        first_purchase.date 
  20. FROM company.customers 
  21. JOIN first_purchase ON first_purchase.customer_id = customers.id 
  22. JOIN persona_salary ON persona_salary.age = customers.age 
  23.                        AND persona_salary.gender = customers.gender 
  24. WHERE customers.age <= 30 

8. 有時,它可能值得分成多個查詢

小心這個。讓我們給出一些背景:

我經常在BigQuery上使用Airflow,轉換數據和準備數據可視化上執行SQL查詢。我們有一個工作流Orchestrator(氣流),以定義的順序執行請求。在某些情況下,我們選擇將復雜查詢拆分為多個較小的查詢。

代替:

  1. CREATE TABLE customers_infos AS 
  2. SELECT customers.id, 
  3.        customers.salary, 
  4.        traffic_info.weeks_since_last_visit, 
  5.        category_info.most_visited_category_id, 
  6.        purchase_info.highest_purchase_value 
  7. FROM company.customers 
  8. LEFT JOIN ([..]) AS traffic_info 
  9. LEFT JOIN ([..]) AS category_info 
  10. LEFT JOIN ([..]) AS purchase_info 

你可以使用:

  1. ## STEP1: Create initial table 
  2. CREATE TABLE public.customers_infos AS 
  3. SELECT customers.id, 
  4.        customers.salary, 
  5.        0 as weeks_since_last_visit, 
  6.        0 as most_visited_category_id, 
  7.        0 as highest_purchase_value 
  8. FROM company.customers 
  9. ## STEP2: Update traffic infos 
  10. UPDATE public.customers_infos 
  11. SET weeks_since_last_visit = DATE_DIFF(CURRENT_DATE, 
  12.                                        last_visit.date, WEEK) 
  13. FROM ( 
  14.          SELECT customer_id, max(visit_date) as date 
  15.          FROM web.traffic_info 
  16.          GROUP BY customer_id 
  17.      ) AS last_visit 
  18. WHERE last_visit.customer_id = customers_infos.id 
  19. ## STEP3: Update category infos 
  20. UPDATE public.customers_infos 
  21. SET most_visited_category_id = [...] 
  22. WHERE [...] 
  23. ## STEP4: Update purchase infos 
  24. UPDATE public.customers_infos 
  25. SET highest_purchase_value = [...] 
  26. WHERE [...] 

警告:即使這種方法在簡化復雜查詢時,它可能會帶來可讀性/性能權衡。

如果您使用OLAP或任何面向列的數據庫,則尤其如此,針對聚合和分析查詢(選擇,AVG,MIN,MAX,…)進行優化,但在交談時更少的性能(更新)。

雖然在某些情況下,它也可能提高您的表現。即使使用現代面向列的數據庫,也會導致內存或性能問題太多。在這些情況下,拆分您的請求通常有助于性能和內存。

此外,值得一提的是,您需要某種程序或Orchestrator以定義的順序執行查詢。

9. 基于您自己的約定的有意義的名稱

正確地命名你的模式和表格很難。使用哪些命名約定是值得難得的,但選擇一個并堅持下來并非。您應該定義自己的慣例,并通過您的團隊通過它。

 計算機科學中只有兩個難題:緩存失效和命名的東西。 - 菲爾卡爾頓

以下是我使用的約定示例:

(1) Schema

如果您使用多種目的的分析數據庫,則是在有意義的模式下組織表的良好做法。

在我們的BigQuery數據庫中,我們每個數據源的一個架構。更重要的是,我們根據其目的輸出不同模式的結果。

  • 任何應由第三方工具可訪問的任何表都在公共架構中奠定。Dataviz工具,如DataSudio或Tableau從這里獲取他們的數據。
  • 自從我們使用BQML使用機器學習以來,我們有一個專用的Machine_Learning架構。

(2) 表

表格本身應該根據慣例,我們有幾個數據可視化的儀表板,每個儀表板都有自己的目的:營銷儀表板,一個產品儀表板,一個行政儀表板,名稱為幾個。

我們的公共模式中的每個表都由儀表板的名稱前綴。有些例子可能包括:

  1. product_inbox_usage 
  2. product_addon_competitor_stats 
  3. marketing_acquisition_agencies 
  4. executive_funnel_overview 

在與團隊合作時,值得花時間定義您的約定。談到命名一個新表時,永遠不要使用快速和骯臟的名稱,你會“更改”:你可能不會。

隨意使用這些示例來定義您的約定。

10. 最后,寫下有用的注釋……但不是太多

我同意良好的寫作和理所當然地命名的代碼不應需要評論的想法。讀取代碼的人甚至應該在代碼本身之前了解邏輯和意圖。

仍然,評論可能在某些情況下很有用。但你肯定應該避免評論的陷阱太多。

避免:

  1. WITH fp AS 
  2.    SELECT c_id,               # customer id 
  3.           MIN(date) as dt     # date of first purchase 
  4.    FROM company.purchases 
  5.    GROUP BY c_id 
  6. ), 
  7. ps AS 
  8.    SELECT age, 
  9.           gender, 
  10.           AVG(salary) as avg 
  11.    FROM company.customers 
  12.    GROUP BY age, gender 
  13. SELECT customers.id,  
  14.        ct.name,  
  15.        ct.c_age,            # customer age 
  16.        ct.gender, 
  17.        ct.salary, 
  18.        ps.avg,              # average salary of a similar persona 
  19.        fp.dt                # date of first purchase for this client 
  20. FROM company.customers ct 
  21. # join the first purchase on client id 
  22. JOIN fp ON c_id = ct.id 
  23. # match persona based on same age and genre 
  24. JOIN ps ON ps.age = c_age 
  25.            AND ps.gender = ct.gender 
  26. WHERE c_age <= 30 

而是:

  1. WITH first_purchase AS 
  2.    SELECT customer_id, 
  3.           MIN(date) as date  
  4.    FROM company.purchases 
  5.    GROUP BY customer_id 
  6. ), 
  7. persona_salary AS 
  8.    SELECT age, 
  9.           gender, 
  10.           AVG(salary) as avg_salary 
  11.    FROM company.customers 
  12.    GROUP BY age, gender 
  13. SELECT customers.id,  
  14.        customers.name,  
  15.        customers.age,  
  16.        customers.gender,  
  17.        customers.salary, 
  18.        persona_salary.avg_salary as persona_avg_salary, 
  19.        first_purchase.date 
  20. FROM company.customers 
  21. JOIN first_purchase ON first_purchase.customer_id = customers.id 
  22. JOIN persona_salary ON persona_salary.age = customers.age 
  23.                        AND persona_salary.gender = customers.gender 
  24. WHERE customers.age <= 30 

結論

SQL很棒。它是數據分析,數據科學,數據工程甚至軟件開發的基礎之一:它不會等待。它的靈活性是一種力量,但可以是陷阱。

您可能不會最初意識到這一點,特別是如果您是唯一負責自己代碼的人。但在某些時候,在與團隊合作或者有人繼續工作時,沒有一系列最佳實踐的SQL代碼將成為負擔。

在本文中,我總結了編寫SQL的最常見的優秀實踐。當然,有些是爭辯或基于個人意見:您可能希望從這里獲得靈感,并定義與您的團隊不同的東西。

我希望它能幫助您將您的SQL質量帶到一個下一個高度!

原文鏈接:

https://towardsdatascience.com/10-best-practices-to-write-readable-and-maintainable-sql-code-427f6bb98208

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2023-01-27 14:53:03

2022-08-12 07:48:49

Argo容器

2024-04-08 14:33:18

2021-09-30 09:53:47

網絡安全網絡攻擊網絡威脅

2024-11-21 17:22:40

2024-03-28 10:31:07

CIOIT專業人士IT領導者

2021-07-27 09:00:00

開發Web軟件

2024-02-01 00:13:28

React前端開發

2022-04-11 08:30:00

IT網絡安全工作流程

2013-04-15 09:02:43

JavaScriptJS

2024-09-23 16:49:32

2023-04-10 11:25:29

工程交流DX

2023-02-24 14:28:56

2023-11-08 13:55:27

2022-11-03 15:26:52

2023-07-31 10:21:56

數據中心運營商

2025-03-26 03:20:00

2014-10-23 08:56:42

開源項目C

2022-02-17 10:31:42

云安全IT漏洞

2020-09-16 14:39:13

ReactJavaScript框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品网站 | www.黄网| 天堂av中文 | 国产又色又爽又黄又免费 | 91精品久久久久久久99 | 日韩伦理电影免费在线观看 | 国产成人一区二区三区电影 | 天堂在线中文 | 欧美一卡二卡在线 | 国产欧美一区二区在线观看 | 亚洲第一成人影院 | 天天拍天天操 | 国产中文字幕在线 | 日韩午夜精品 | 韩国理论电影在线 | 亚洲毛片在线 | 日韩人体在线 | 99这里只有精品 | 亚洲国产网址 | 日韩高清在线观看 | 欧美一级艳情片免费观看 | 黄色网址av | 女人毛片a毛片久久人人 | 欧美精品一区二区免费 | 成人美女免费网站视频 | 久久亚洲国产 | 国产福利91精品一区二区三区 | 成人在线视频一区 | 日韩在线小视频 | 午夜激情视频在线 | 黄色免费观看 | 精品视频导航 | 亚洲精品视频免费 | 国产999精品久久久久久绿帽 | 久久美女网 | 亚洲视频在线播放 | 少妇午夜一级艳片欧美精品 | 国产精品久久精品 | 亚洲国产中文在线 | 国产在线精品一区二区 | 天堂一区在线观看 |