作爲一個平時不太接觸SQL語句的程序員,平時對SQL的理解僅停留在簡單的CRUD上。
什麼SQL優化完全不知道怎麼回事,,最近終於有機會自己需要自己的寫SQL,中間的磕磕絆絆好不艱辛,特寫文記錄之
第一階段
擁有數據:
表 record
col1 id 類型 INT
。。。
col13 date 類型 DATE TIME (是的這個表非常大,應該說設計的不是很好,不過我們這裏先忽略這個問題 )
任務:
分別以年/月/日查詢表RECORD的數據,按時間升序排列
解決方案:
好的,這個的我知道 用DATE_FORMATE來解析DATETIME就好 DATE_FORMATE(DATE,‘%Y-%m-%d’) = ‘YYYY-mm-dd' 就可以找出指定日期的記錄了,那麼要得到以月爲單位的 2016年 record數量的統計數據對應的SQL語句就是
SELECT COUNT(*)
FROM rec_test
WHERE DATE_FORMAT(rec_time, '%Y') = '2016'
GROUP BY DATE_FORMAT(rec_time ,'%Y-%m');
(這裏強調下DATE_FORMATE中的formate的大小寫敏感的問題,比如%Y就是顯示4爲的年而 %y就只顯示2爲,對應的%m是用2位來顯示月(需要補0) 而%M是以英文縮寫的方式來顯示月的,在傳日期進行比較的話要注意的傳入的字符串日期的格式和DATE_FORMATE中formate是否匹配)
來看些結果 雖然返回的是正確的 不過由於我們date並沒有覆蓋到全年,這樣返回的值是沒辦法直接用的,(對的我們就想一條SQL解決問題,不要和我說再寫條語語句返回對應的有效的日期,我不聽 我不聽)
第二階段:
擁有數據:
同第一階段
任務:
把沒有數據的日期補0
解決方案:
那麼用IFNULL行不行呢?當然不行!IFNULL可以把爲NULL查詢結果變爲你指定的值,但是我們的查詢結果沒有數據的對應日期根本不存在行!!!哎。。。要是我們的record表平時沒有數據日子也加一條NULL記錄就好了。對的就是順着這個思路想下去 造新表----表合併 ----- SQL JOIN !!!(如果你看完SQL相關書籍後 就沒有確實寫過SQL語句,這個語句的作用應該已經被你忘了 快往下看!)
設 左表LT 右表 RT
LEFT JOIN ON
以ON的後的表達式爲匹配條件 返回 LT 並 (LT 交RT)
這樣我們生成一個只包含每天日期的表mdate然後以它爲LT record爲RT 以日期一致爲ON的匹配條件 來生成新表。這樣在新表中來統計record的id數的時候,之前沒有數據的日期就會爲0!我們以爲查詢2017年2月份 中每天數據量的SQL語句爲例
SELECT COUNT(rc.id)
FROM mdate AS mt
LEFT JOIN record AS rc
ON DATE_FORMAT(mt.date,'%Y-%m-%d') = DATE_FORMAT(rc.date,'%Y-%m-%d')
WHERE date_format(mt.date,'%Y-%m')='2017-02'
GROUP BY DATE_FORMAT(mt.date,'%Y-%m-%d') ORDER BY mt.date;
,,,,,,土鱉啃蹄牛