MySQL JOIN鏈接查詢知識點

MySQL JOIN鏈接查詢知識點

MySQL支持的join操做:JOIN、STRAIGHT_JOIN、LEFT JOIN、RIGHT JOIN。不支持FULL OUTER JOIN。html

在MySQL中,JOIN, CROSS JOIN, 和INNER JOIN相互等價。可是在正常的SQL標準中,他們是不等價的。INNER JOIN一般和ON字句一塊兒使用,CROSS JOIN以其餘方式使用。mysql

MySQL使用大名鼎鼎的Nested-Loop Join算法來執行Join操做的。算法

在使用join查詢時須要考慮的因素

  • 當沒有鏈接條件的時候,INNER JOIN和','在語義上是等價的:在指定的表之間生成笛卡爾積(也就是說,第一個表中的每行跟第二個表的每行做鏈接)。
  • 在ON子句指定如何鏈接兩個表,在where子句約束要返回的結果集。
  • 經過STRAIGHT_JOIN能夠強制指定兩個表的鏈接順序,即左邊的表在右邊的表以前加載。

LEFT JOIN和RIGHT JOIN優化

MySQL以以下方式執行 A LEFT JOIN B join_condition:sql

  • 表B被設置爲依賴於表A和表A依賴的全部表。
  • 表A被設置爲依賴於left join條件中使用的全部表(除了表B)。
  • left join條件被用來決定如何從表B檢索行。(也就是說,不會使用where子句中的條件)
  • 執行全部的標準join優化,一個表老是在他所依賴的全部表被讀取以後纔會被讀取。若是有表循環依賴,MySQL會提示錯誤。
  • 執行全部的標準where優化。
  • 若表A中的某行匹配where子句,可是表B中沒有匹配ON子句的行,則表B會生成一個全部列都爲NULL的行。
  • 若使用left join查詢表中不存在的行,例如:where子句包含條件 col_name IS NULL,col_name列被聲明爲NOT NULL,MySQL在匹配到LEFT JOIN條件的一行後會中止查詢更多的行。

注意:使用left join的時候先使用on子句的條件檢索行,最後再根據where子句條件過濾結果集。而不會在檢索表B的時候使用where條件過濾。可是在使用join的時候,過濾條件放在on子句和放在where子句是同樣的。oop

STRAIGHT_JOIN說明

STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer puts the tables in the wrong order.優化

這句話的意思就是:除了STRAIGHT_JOIN能夠指定左表在右表以前被讀取以外,STRAIGHT_JOINJOIN是相似的。當MySQL的join優化器載入表的順序不是最優的時候,可使用STRAIGHT_JOIN來指定。code

聯表查詢的基礎知識

  • 因爲MySQL索引是基於B-Tree的,因此組合索引有」字段順序「概念。當查詢條件中有cat2 in (1,2),而組合索引是(cat1,cat2),則該查詢沒法使用到這個組合索引。
  • MySQL表關聯的算法是Nest Loop Join
  • Join,是經過驅動表的結果集做爲循環基礎數據,而後一條一條地經過該結果集中的數據做爲過濾條件到下一個表中查詢數據,而後合併結果。
  • EXPLAIN 結果中,對於序號相同的記錄第一行出現的表就是驅動表(Important!)
  • 驅動表能夠直接排序,對非驅動表(的字段排序)須要對循環查詢的合併結果(臨時表)進行排序!(Important!)
  • 當進行多表鏈接查詢時,驅動表的定義爲:
    1. 指定了聯接條件時,知足查詢條件的記錄行數少的表爲[驅動表];
    2. 未指定聯接條件時,行數少的表爲[驅動表](Important!)。

參考:htm

相關文章
相關標籤/搜索