1、SQL中的字符串都要用單引號
不用單引號也可能會執行,但是會有類型轉換,而類型轉換設計函數操作,引起索引失效或邏輯錯誤的問題。
2、SQL書寫順序和邏輯順序要一致
- order by要放在句末
- select a,b from t order by c ,c不在select項中,數據庫引擎是怎么處理的?
MySQL進行數據的邏輯存儲,以page為單位,會抽取所有數據。 - select id1 as fid from t where fid = 2 能執行嗎?
不能;執行順序是先where,再select。
3、內連接與外鏈接
內聯接(典型的聯接運算,使用像 = 或 <> 之類的比較運算符)
包括相等聯接和自然聯接。
內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。外聯接
外聯接可以是左向外聯接、右向外聯接或完整外部聯接。
在 FROM子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。-
考慮這個SQL語句:
select count(*) from a2 left join b2 on a2.id = b2.id
這個語句沒有意義:因為a2作為左表,數據項都會被顯示,而count將每次都得到相同的結果。
-
外鏈接的內部處理方式:(可以從擴展執行計劃中查看具體的執行過程,類似于單步調試)
有where條件的left join查詢,內部將以內連接處理。
4、語法細節
-
update同時更新多條,以逗號“,”將update的值分隔,一并執行:
update a1 set a = 1,b = 2 where ...
delete from t where id;
可以正常執行:id有值的數據都滿足。truncate和delete *
truncate是原子事務,沒有日志記錄(或者說只有一條語句執行的日志),所以不能進行事務回滾。
delete操作將產生詳細的日志,IO頻繁,支持事務回滾。
5、Quanr數據庫命名規范
庫、表、字段命名
- 必須使用小寫字母,并采用下劃線分割;
- 不超過32個字符;
- 必須見名知意,與事務、產品線相關;
- 禁用MySQL保留字;
- 臨時表以tmp_做前綴,日期做后綴,如:tmp_hourse_xxx_20170301
- 備份表以bak_做前綴,日期做后綴,如:bak_hourse_xxx_20170301
索引命名
- 小寫字母,下劃線分割,禁用駝峰式;
- 非唯一索引:idx_字段名稱[_字段名稱]
- 唯一索引:uniq_字段名稱[_字段名稱]
6、Quanr數據操作基礎規范
- 使用INNODB存儲引擎并且使用業務不相關自增ID為主鍵;
- 使用UTF8 / UTFMB4字符集;
- 所有表、字段都要加注釋;
- 禁止在數據庫中存放圖片、文件等;
- 每張數據表數據量控制在5000W以內;
- 禁止在線上做數據庫壓力測試;
- 禁止從測試、開發環境直連數據庫。