筆記 SQL點滴 2017 08 21

2021-08-07 05:36:39 字數 1260 閱讀 3871

專案中遇到sql, 尤其是跟分組有關, 或者count, sum相關, 寫的不是很好.有時間就記錄點吧, 沒時間就算了..

例如有乙個關於統計的需求,要求主表不管有無從表的統計資料,都要顯示出來:

使用者名稱

訪問記錄

訪問時間

使用者1訪問url

5-18

使用者2訪問url

3-18

使用者1訪問url

5-16

使用者3null

null

使用者列來自主表,其他兩列均來自從表, 兩者之間通過使用者id進行關聯

使用者名稱

訪問次數

使用者12

使用者20

使用者30

select 使用者名稱, count(統計某欄位) 訪問次數 from (

-- 子查詢1(查詢某些條件的使用者表)

-- 當然實際業務要複雜的多, 可能是多表關聯出來的結果集

) t1

-- t1 相當於一張表, 不管裡面的查詢關聯了多少表

left

join (

-- 子查詢2(查詢某些條件的另一張表)

where

time = 5月份

) t2 on t1.id = t2.id

-- t2 是從表, 資料的主要**記錄

group

by t1.id

select 使用者名稱, count(統計某欄位) 訪問次數 from (

-- 子查詢1(查詢某些條件的使用者表)

) t1

left

join t2表名 on t1.id = t2.id

where

time = 5月份

group

by t1.id

最開始我是這樣寫的, 但是出現的資料會變成這樣:

使用者名稱

訪問次數

使用者12

發現使用者2, 使用者3 不見了….

原因: 關聯表時 , 沒有用子查詢, 那麼關聯的所有訪問記錄的資料, 但是如果現在需要查某個時間段的資料, 再最後面肯定會用where time = 5月份這樣的語句, 導致使用者2, 因為它存在訪問記錄, 但是時間在3月份, 這樣它會直接被篩掉, 包括使用者3, 它甚至不存在訪問記錄, 更會被篩掉.

SQL優化點滴記錄

1 在where和order by 涉及的列上加索引 2 引擎會放棄使用索引的情況 1 避免where子句字段進行null值判斷 2 避免where子句中使用 或 操作符 3 避免where子句中使用or。3 慎用in 和not in,in和not in也會進行全表掃瞄 4 like 子句盡量少用,...

SQL點滴文章總結

去年寫了很多關於sql語句的文章,有一些收穫,很多博友也參與到討論中來。sql如果複雜起來會很頭疼的,特別是效能優化,涉及到很多cpu,記憶體知識,我寫的這些只是點點滴滴,表面上的,沒有理論支撐,沒有深入,其實一直想找一本大部頭讀一讀,就是沒有時間和精力,只能遇到問題了總結一下,又遇到了就再總結一下...

sql優化之慢sql優化實踐 點滴

sp order day current 表存在480w條資料 關聯sp service site表id的外來鍵sj site sp service site 表存在3w條資料 1 2 3 4 5 6 7 8 9 in的寫法 22秒 select from sp order day current ...