如何更優(yōu)雅的寫出你的SQL語(yǔ)句
毫無(wú)疑問(wèn),編寫代碼是一門藝術(shù)而非科學(xué),沒有程序員可以編寫出既可讀又可維護(hù)的漂亮代碼,即使有經(jīng)驗(yàn)也是如此。
一般來(lái)說(shuō),當(dāng)您學(xué)習(xí)編碼的藝術(shù)時(shí),編碼水平會(huì)隨著經(jīng)驗(yàn)而提高,例如,你會(huì)變得更喜歡組合而不是繼承或更喜歡接口而不是實(shí)現(xiàn),但是只有少數(shù)開發(fā)人員能夠掌握這些技術(shù)。
SQL查詢也是如此。您構(gòu)建查詢的方式,您編寫它的方式,如果正確的話,可以很好地將您的意圖傳達(dá)給其他開發(fā)人員。
常常,在我看到來(lái)自多個(gè)開發(fā)人員的電子郵件中的SQL查詢時(shí),我能看出他們的編寫風(fēng)格的顯著差異。一些開發(fā)人員編寫得非常整潔,并且對(duì)查詢進(jìn)行了適當(dāng)?shù)目s進(jìn),這使得很容易發(fā)現(xiàn)關(guān)鍵細(xì)節(jié),例如,從哪個(gè)表中提取哪些列以及哪些是條件。
因?yàn)樵趯?shí)際的項(xiàng)目中,SQL查詢并不是單行的,所以當(dāng)您需要以后閱讀這些SQL查詢或需要將該查詢共享給某人進(jìn)行檢查或執(zhí)行時(shí),這種情況下,學(xué)習(xí)正確的編寫SQL查詢的方式會(huì)帶來(lái)很大的不同。
在本文中,我將向您展示一些我過(guò)去嘗試過(guò)的編寫風(fēng)格,介紹它們的優(yōu)缺點(diǎn)以及我認(rèn)為***的SQL查詢編寫方式。
除非你有很好的理由不使用我推薦的風(fēng)格,例如:你有更好的風(fēng)格,或者你想堅(jiān)持項(xiàng)目中一直使用的風(fēng)格(一致性壓倒一切),沒有理由不使用它。
順便說(shuō)一句,我希望您熟悉SQL,了解SQL查詢中的不同子句及其含義。如果不是,你***通過(guò)參加一個(gè)很好的課程來(lái)獲得SQL經(jīng)驗(yàn),比如:
From 0 To 1:SQL And Databases — Heavy Lifting by Loony Corn
Introduction to SQL by Jon Flanders
我強(qiáng)烈推薦后者。
***種寫SQL的方式
- SELECT e.emp_id, e.emp_name, d.dept_name, p.project_name from Employee e
- INNER JOIN Department d ON e.dept_id = d.dept_id INNER JOIN Projects p
- ON e.project_id = p.project_id Where d.dept_name="finance" and e.emp_name
- like '%A%' and e.salary > 5000;
優(yōu)點(diǎn):
- 1)使用了大小寫混合將關(guān)鍵字從列和表名之間分開,如SELECT使用大寫,而Employee使用首字母大寫,但如果你喜歡一致性的話,可以讓from關(guān)鍵字也大寫,沒有研究只顯示那種寫法更好。
缺點(diǎn):
- 1)大小寫混合
- 2)整個(gè)查詢寫在一行上,一旦表和列的數(shù)量增加,這一行就不可讀了
- 3)在添加新條件或刪掉條件時(shí)沒有靈活性
第二種書寫SQL查詢的方式
- SELECT e.emp_id, e.emp_name, d.dept_name, p.project_name
- from Employee e
- INNER JOIN Department d ON e.dept_id = d.dept_id
- INNER JOIN Projects p ON e.project_id = p.project_id
- Where d.dept_name="finance"
- and e.emp_name like '%A%'
- and e.salary > 500;
改進(jìn):
- 1) SQL查詢被劃分為多行,使其更具可讀性
問(wèn)題
- 1)大小寫混合
- 2) where子句上的所有條件位于同一行上,也就是說(shuō)通過(guò)注釋排除它們不是那么容易。
第三種書寫SQL的方式,也是做好的一種
- select e.emp_id, e.emp_name, d.dept_name
- from Employee e
- inner join Department d on e.dept_id = d.dept_id
- where d.dept_name = 'finance'
- and e.emp_name like '%A%'
- and e.salary > 500;
- 1)將SQL查詢劃分為多行可以提高可讀性
- 2)使用適當(dāng)?shù)目s進(jìn)可以很容易地找到數(shù)據(jù)源,例如表和join
- 3)讓條件語(yǔ)句都放在單獨(dú)的行上,可以容易的注釋掉某個(gè)條件進(jìn)行調(diào)試。
- select e.emp_id, e.emp_name, d.dept_name
- from Employee e
- inner join Department d on e.dept_id = d.dept_id
- where d.dept_name = 'finance'
- -- and e.emp_name like '%A%';
- add e.salary > 5000
順便說(shuō)一句,如果您喜歡用大寫字母表示關(guān)鍵字,您還可以編寫如下所示的相同的SQL查詢,這些規(guī)則是相同的,只是關(guān)鍵字是大寫字母。
這就是我要說(shuō)的如何編寫可讀和更易于維護(hù)的SQL查詢。對(duì)于SQL查詢的縮進(jìn)或樣式化,您有什么看法?
這是一種簡(jiǎn)單的技術(shù),但非常強(qiáng)大,對(duì)于提高涉及多個(gè)連接的復(fù)雜SQL查詢的可讀性大有幫助,如我前面的示例所示。
如果您喜歡,也可以在網(wǎng)上使用各種SQL格式器,但我建議您學(xué)習(xí)一種樣式并堅(jiān)持使用它,而不是依賴于格式器。
感謝閱讀本文,請(qǐng)讓我們知道如何編寫SQL查詢?你用的是哪種風(fēng)格,還是你有自己的風(fēng)格?如果您是初學(xué)者和學(xué)習(xí)SQL,您會(huì)發(fā)現(xiàn)我的免費(fèi)SQL課程和書籍列表對(duì)你會(huì)有幫助。