專案中遇到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 ...