SQL編程格式的優化建議

資料庫發展到今天,可以說是無處不在。作為數據從業大軍的一員,我們都或多或少的需要與數據打交道。下圖展示了主要的SQL 引擎的流行程度,得分反應了搜索引擎的查詢,在線討論的提及,提供的工作,專業資歷的提及,以及tweets。雖然Impala、Spark SQL、Drill、Hawq 和Presto 一直在運行性能、並發量和吞吐量上擊敗Hive,但是Hive 仍然是最流行的(至少根據DB-Engines 的標準)。

在使用SQL編程的時候,我是否有一套可行的編程規範?我們是否考慮了代碼的可讀性、可移植性和性能么?本文的目的也在於此,總結各資料庫的大神相關的SQL編寫風格,利用當前可用的工具與插件優化我們的SQL編寫過程,讓每一個數據從業者的生活更加美好。話不多說,走起來。

SQL編程風格

本部分總結自《Joe Celko"s SQL Programming Style》,通過這位大師見聞與親身經歷,詳細說明了我們應該遵循哪些規則,讓我們跟著這位大師的腳本走進美妙的SQL世界。

Joe Celko 世界著名資料庫專家,曾擔任ANSI SQL標準委員會成員10年之久,也是世界上讀者數量的SQL圖書作者之一

命名的建議

  • 使用統一的、描述性強的欄位命名規則
  • 保證欄位名是獨一無二且不是保留字的,不要使用連續的下劃線,不用下劃線結尾

  • 最好以字母開頭

id 標識符——user_id 用戶標識 item_id 商品標識

dt 表示某個事件發生的時間——ord_dt 訂單時間 exam_dt 考試時間

num 表示某事相關的數字——sale_num 銷量

name 用字母表示名稱——stu_name 學生名 等

格式建議

  • 最好使用標準SQL函數而不是特定供應商Oracle、Mysql等的函數以提高可移植性
  • 大小寫的運用,系統關鍵字大寫,欄位表名小寫
  • 靈活使用空格和縮進來增強可讀性——兩大法寶空白隔道與垂直間距
  • select name,id,sexfrom (select *from school_scorewhere class_cd=110)where sex = "man"and exam_dt = "2016-06-01";--空白隔道+垂直間距+大小寫+縮進SELECT name, id, sex FROM (SELECT * FROM school_score WHERE class_cd = 110) WHERE sex = "man" AND exam_dt = "2016-06-01";

    1. 利用空格保持關鍵字對齊

    2. 在等號前後(=)在逗號後(,)單引號前後(")加上空格
    3. 子查詢縮進並對齊

    感受下是不是下面的看得更清晰有序呢

    語法建議

    • 盡量使用BETWEEN而不是多個AND
    • 同樣,使用 IN 而不是多個OR
    • 利用CASE語句嵌套處理更複雜的邏輯結構
    • 避免UNION語句與臨時表

    SELECT CASE postcode WHEN "BN1" THEN "Brighton" WHEN "EH1" THEN "Edinburgh" END AS city FROM office_locations WHERE country = "United Kingdom" AND opening_time BETWEEN 8 AND 9 AND postcode IN ("EH1", "BN1", "NN1", "KW1");

    TOOLS

    SQL編碼風格說完了,該來點實在的了,畢竟大家寶貴的時間不能浪費在細心敲空格與檢查是否對齊上。

    給大家介紹個插件很強大SQLinForm(SQL Formatter for Professionals - Also Free Online SQL Beautifiers & Plugins available),小到支持NOTEPAD編輯器的插件大到直接對接資料庫軟體,甚至可以網站上在線優化格式,不管你的格式有多爛只要語法正確,SQLinForm保證服務滿意,轉換姿勢多種多樣,只有你想不到的,沒有她滿足不了的,沒收廣告費,我也就不吹了,看一波操作。

    進入官網的在線測試功能Online SQL Formatter,這兒有一堆很亂的SQL代碼,我們要優化它,這兒我簡單設置下代碼風格,保持與我上部分介紹的內容相同,做一個。

    • keywords 關鍵字 這兒我們選擇Left Justify,保持右對齊
    • Linebreaks 換行 選擇After comma ,讓每句的逗號放在句末
    • Brackets 括弧 這兒根據各自的口味選擇,我沒變動

    • Indention 縮進 我選擇4 spaces 默認為10個空格,感覺有點太長了

    • Alignment 對齊 同樣根據自己需求來,默認保持了關鍵字、逗號對齊

    • CASE CASE格式 我取消了THEN後換行 ,保持了同一個WHEN THEN邏輯同一行

    點擊FORMAT SQL,最後輸出如下:

    SELECT price.col1 AS col1 , price.col2 AS col2 , price.col3 AS col3 , MAX(price.col4) AS col4 , CASE WHEN age > 20 THEN 100 ELSE 99 END AS col12, MAX(price.col5) AS col5 , MAX(price.col6) AS col6 , MAX(price.col7) AS col7FROM Table1 t1 INNER JOIN Table2 T2 ON column1 = col2 AND col2 = column3WHERE column1OfTable2 = "abcde"AND ( column7 = "abc123" OR col5 >= 123 )AND volume = 123GROUP BY col1 , column2, tableCol3ORDER BY Column1 , col2 , columName3, c4

    對於Sublime重度愛好者可以安裝zsong/SqlBeautifier插件,CTRL+K 加 CTRT+F 實現格式轉換,相比SQLinForm,自定義功能略顯單薄,但也足夠可用。

    喜歡離線操作的老鐵,可以使用Notepad++的用戶可以安裝插件或者下載官方編程程序,勾選

    LIVE FORMATTING,實現實時自動整理格式的功能。

    一邊敲一邊自動整理格式,精準而優雅

    白衣勝雪,劍若秋水

    更多關於python數據分析與挖掘內容請關注我的專欄:數與碼

    或者關注我的知乎賬號:知行

    專欄持續更新中,求贊求關注

    文章如有不妥之處,歡迎朋友一起討論


    推薦閱讀:

    【知乎】與【Quora】數據對比
    美美的商務范兒——蝴蝶圖
    賈乃亮發文背後的數據
    有哪些學習數據分析的網站
    簡單介紹一下我們的Dota2數據平台

    TAG:SQL | 数据分析 | 数据库 |