《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動態(tài) > SQL用了兩年多,,分享2個最常用的小技巧

SQL用了兩年多,分享2個最常用的小技巧

2021-07-10
來源:CSDN
關(guān)鍵詞: SQL 小技巧

導(dǎo)讀:SQL是所有數(shù)據(jù)從業(yè)者必須打牢的基本功之一,,扎實的SQL查詢和適當?shù)恼{(diào)優(yōu)技巧是檢驗SQL能力的兩大重要準則,。個人曾經(jīng)專門花費過好多時間用于提升SQL能力,期間也刷了大量的SQL題目,,在這期間也不斷摸索總結(jié)了一些小技巧,,今天本文就來分享其中的兩個,也差不多是日常使用中最為高頻的兩個了,。

為了配合演示這兩個小技巧,,本文所使用示例數(shù)據(jù)如下,其實這也是前幾天推文中所使用的數(shù)據(jù):

微信圖片_20210710225409.png

  SQL的數(shù)據(jù)類型隱式轉(zhuǎn)換

  很多編程語言都限定了數(shù)據(jù)類型,,例如在Python中字符串“0”和數(shù)值0是不相等的,,布爾型True和數(shù)值1也是不相等,但在SQL中則不然,,其內(nèi)置了數(shù)據(jù)類型隱式轉(zhuǎn)換功能,,所以執(zhí)行查詢 select “0”=0 會返回1的,這既說明字符串“0”和數(shù)值0是相等的,,也說明SQL中的布爾值會自動轉(zhuǎn)換為1或0,。

微信圖片_20210710225412.png

  利用這一小技巧,在實現(xiàn)很多統(tǒng)計指標時就可以有很多小技巧,。例如計算學生成績表中每名學生的成績的優(yōu)秀率,,即成績在90分以上的科目與本人總科目的占比,。為實現(xiàn)這一查詢,常規(guī)的操作是分別統(tǒng)計每名學生成績在90分以上的科目數(shù)量和總科目,,然后進行相除得到占比,。

  實際上,在給出前述小例子的基礎(chǔ)上,,這一需求可以如下實現(xiàn):

微信圖片_20210710225414.png

其中,,在每名學生的分組中,條件判斷score>=90返回一組0或1的結(jié)果,,對這組0/1取值進行求均值操作,,即等價于求成績>=90的科目占比。

  巧妙運用if函數(shù)和null

  SQL內(nèi)置了眾多函數(shù),,但對于一名程序員而言if函數(shù)應(yīng)該尤為常見和常用,;另一方面,,null值也是SQL中一個神奇的存在,,它有兩大特性:一是任何值與null的任何計算都會得到null值;二是在任何聚合函數(shù)中,,null值都不參與計算(例如,,count計數(shù)就是查找null以外的結(jié)果數(shù)量)。配合使用if函數(shù)和null值,,有時也可實現(xiàn)很好的效果,。

  例如,仍然針對以上學生成績表,,需要分別統(tǒng)計每名學生成績在80分以上成績的平均值,,也就是如果成績>=80則參與最后均值計算,否則不參與,。配合if函數(shù)和null的特性,,可以如下優(yōu)雅的實現(xiàn):

微信圖片_20210710225417.png

  實際上,上述查詢語句中,,首先通過if函數(shù)衍生一個臨時字段if(score>=80, score, null)其取值為:成績≥80時取成績值,,否則置為null,即相當于僅保留了成績在80分以上的記錄,;而后嵌套一層avg函數(shù)即直接實現(xiàn)了計算80分以上平均值的效果,。

  當然,對于這一需求也可以先用where條件過濾出成績在80分以上的記錄后再聚合統(tǒng)計,。




電子技術(shù)圖片.png

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點,。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,,以便迅速采取適當措施,,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。