MySQL必知必會摘錄

主題 概要
數據庫 MySQL注意總結
編輯 時間
新建 20160526
序號 參考資料
1 MySQL必知必會

Select結果順序

用select檢索出的數據,不能(也不應該)依賴於檢索結果的順序。如果不明確規定排序順序有意義,則不應該假定檢索出的數據的順序有意義。

Where子句中and優先級最高

用where語句進行過濾時,AND在計算次序中優先級最高,如:
這裏寫圖片描述
結果並不是想像中的自左向右的結合,所有prod_price都大於等於10,而是vend_id=1003 AND prod_price>=10的結果再 OR vend_id=1002。解決方法是按需要加圓括號。

通配符使用技巧

百分號(%)通配符—表示任何字符出現任意次數;
下劃線(_)通配符—只匹配單個字符而不是多個字符;
需注意:
不要過度使用通配符,如果其他操作符能達到相同的目的,應該使用其他操作符。
在確實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜索模式的開始處,否則速度會很慢。
仔細注意通配符的位置,如果放錯地方,可能不會返回想要的數據。

LIKE與REGXP的區別

這裏寫圖片描述
因爲LIKE匹配整個列,如果被匹配的文本僅在列值中出現,LKIE將不會找到它,相應的行也不被返回(除非使用通配符)。而REGEXP在列值內進行匹配,如果被匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回,這是個非常重要的區別。使用^和$定位符,REGEXP也能匹配整個列值。

HAVING分組

HAVING非常類似於WHERE,事實上所有WHERE子句都可用HAVING替代,唯一差別是,WHERE過濾行,而HAVING過濾分組。

各類聯結

等值聯結與內部聯結

通過使用WHERE子句與INNER JOIN語法,如:
這裏寫圖片描述

這裏寫圖片描述
ANSI SQL規範首選INNER JOIN語法,儘管使用WHERE子句定義聯結的確比較簡單,但是使用明確的聯結語法能夠確保不會忘記聯結條件,有時候這樣做也能影響性能。

自聯結

假如你發現某物品(其ID爲DTNTR)存在問題,因此想知道生產該物品的供應商生產的其他物品是否也存在這些問題。此查詢要求首先找到生產ID爲DTNTR的物品的供應商,然後找出這個供應商生產的其他物品,
可通過:
這裏寫圖片描述
等價於:
這裏寫圖片描述
注意:使用自聯結而不用子查詢,自聯結通常作爲外部語句用來替代從相同表中檢索數據時使用的子查詢語句。雖然最終的結果是相同的,但有時候處理聯結遠比處理子查詢快得多。

外部連接(左連接與右連接)

許多聯結將一個表中的行與另一個表中的行相關聯,但有時候會需要包含沒有關聯行的那些行,例如:
對每個客戶下了多少訂單進行計數,包括那些至今尚未下訂單的客戶。
左連接示例:
這裏寫圖片描述

聯結總結

注意所使用的聯結類型,一般我們使用內部聯結,但使用外部聯結也是有效的。
保證使用正確的聯結條件,否則將返回不正確的數據。
應該總是提供聯結條件,否則會得出笛卡爾積。
在一個聯結中可以包含多個表,甚至對每個聯結都可以採用不同的聯結類型,但應該在一起測試前,分別測試每個聯結,方便排除故障。

UNION操作

多數SQL查詢都只包含從一個或多個表中返回數據的單條SELECT語句。MySQL允許執行多個查詢,並將結果作爲單個查詢結果返回,有兩種基本情況:
在單個查詢中從不同的表返回類似結構的數據;
對單個表執行多個查詢,按單個查詢返回數據。
這裏寫圖片描述
注意,所有UNION組合,只能使用一條ORDER BY子句,且必須出現在最後一條SELECT語句之後,不存在用一種方式排序一部分,而又用另一種方式排序另一部分的情況。

提高INSERT操作整體性能

INSERT操作可能很耗時,特別是有很多索引需要更新時,而且它可能降低等待處理的SELECT語句的性能。如果數據檢索是最重要的(通常是這樣),則可以通過在INSERT和INTO之間添加關鍵字LOW_PRIORITY,指示MySQL降低INSERT語句的優先級,如下所示:
INSERT LOW_PRIORITY INTO
這也適用於UPDATE和DELETE語句。

MYSQL引擎類型

常用的幾個引擎:
InnoDB:是一個可靠的事務處理引擎,它不支持全文本搜索;
MEMORY:功能等同於MyISAM,但由於數據存儲在內存(不是磁盤)中,速度很快(特別適合於臨時表);
MyISAM:是一個性能極高的引擎,它支持全文本搜索,但不支持事務處理。

發佈了38 篇原創文章 · 獲贊 29 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章