記一次SQL踩坑之旅


作爲一個平時不太接觸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;


    ,,,,,,土鱉啃蹄牛



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章