1.編寫SQL語句時,不要習慣性編寫select *,只返回自己想要的字段
2.連接多表時使用表的別名並在每個字段前面加上別名,這樣可以減少解析時間並且由字段歧義引起的語法錯誤
3.減少重復的工作,例如減少數據類型轉化的次數;一次update可以完成的操作,不要使用多個update
4.若語句復雜,可使用臨時表或變量來分布查詢;若需要多次來用到同一部分數據,可以用臨時表來暫存這部分數據
什么是相關子查詢?
如果子查詢的條件中使用了其外層的表的字段,這種子查詢就叫作相關子查詢。
相關子查詢可以用IN、NOT IN、EXISTS、NOT EXISTS引入。
(1)可以改用LEFT JOIN來代替NOT IN、NOT EXISTS的相關子查詢 select A.name from A where p_id not in(where p_id from B where type='physic') 可以改成 select A.name from A left join B on B.type='physic' and A.p_id=B.p_id where B.p_id is null (2)若子查詢沒有重復,可以用inner join 來代替in ,exists select A.name from A where p_id in(where p_id from B where type='physic') 可以改成 select distict A.name from A inner join B on A.p_id=B.p_id and B.type='physic' (3) IN的相關子查詢用EXISTS代替 (4) 不要用COUNT(*)的子查詢判斷是否存在記錄,最好用LEFT JOIN或者EXISTS select aid from A where (select count(*) from B where B.bid=A.aid)=0 可以改成 select aid from A left join B on A.p_id=B.p_id and B.id is null 或 select aid from A where exists (select 1 from B where B.bid=A.aid)
注:inner join 是內連接,INNER JOIN 關鍵字在表中存在至少一個匹配時返回行,A表中的行在B表中至少有一個進行匹配,才會返回結果 left join 與right join是外連接 再寫下sql的left join 、right join 、inner join之間的區別 left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 ,右表中沒有的值會補null right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄,左表中沒有的值會補null inner join(等值連接) 只返回兩個表中聯結字段相等的行,沒有null的情況
4.查詢語句時盡量使用索引
使用索引是需要注意的幾點
(1)不對索引字段進行計算,而是做變換
select id from where num/2=100
應改為:
select id from where num=100*2
(2)避免對索引字段進行格式轉換
(3)避免對索引字段使用函數
日期字段的例子:
where datediff(day, 日期,'2010-06-30')=0
應改為:where 日期='2010-06-30'
(4)不要對索引字段進行多字段連接
where name+'. '+fname='wei,com'
應改為:
where name='wei' AND fname='com'
5.寫存儲過程,如果語句比較長的話,最好用標記符標開,這樣可讀性會很好
這些是我看大佬博客時自己做的一些整理
