什麼是mysql左鏈結查詢 如何使用

2022-04-08 21:57:00 字數 1112 閱讀 8930

mysql左連線查詢是連線查詢中的一種方式,下面就為您介紹mysql左連線查詢中的一些問題談論,如果您感興趣的話,不妨一看。

我這裡所說的主表是指在連線查詢裡mysql以哪個表為主進行查詢。比如說在mysql左連線查詢裡,一般來說左表就是主表,但這只是經驗之談,很多時候經驗主義是靠不住的,為了說明問題,先來個例子,建兩個演示用的表categories和posts:

先注意一下每個表的索引情況,以後會用到,記得隨便插入一點測試資料,不用太多,但怎麼也得兩行以上,然後執行以下

結果如下所示:

在join查詢的explain的結果中,第一行表示的表就是主表。所以說在此查詢裡categories是主表,而在我們的經驗裡,left join查詢裡,左表(posts表)才應該是主表,這產生乙個根本的矛盾,mysql之所以這樣處理,是因為在我們的where部分,查詢條件是按照categories表的字段來進行篩選的,且categories表剛好存在合適的索引,所以在查詢時把categories表作為主表更有利於縮小結果集。

那explain結果中的using temporary; using filesort又是為什麼呢,為什麼created或category_id_created索引無效呢?這是因為主表是categories表,從表是posts表,而我們使用從表的字段去order by,這通常不是乙個好選擇,最好改成主表字段。不過很多時候改不了,那就沒招了。

再看乙個比較怪異的例子:

這個例子裡posts表仍然是從表,但是按照從表排序的結果卻沒有出現檔案排序和臨時表,這是因為已經確定了categories.id,所以主表相當於乙個只有一行資料的常量表了,從表根據category_id_created索引在連線的同時自然就得到排序後的結果。但換個角度看,既然categories.id都是確定的了,那類似這樣的需求,我們一般就不會再使用left join查詢了,而會分成兩個獨立的查詢去檢索categories和posts才對。

主觀上一旦搞錯了主表,可能怎麼調整索引都得不到高效的sql,所以在寫sql時,比如說在寫mysql左連線查詢時,如果希望左表是主表,那麼就要保證在where語句裡的查詢條件盡可能多的使用左表字段,進而,一旦確定了主表,也最好只通過主表字段去order by。

注意:大多數情況下,使用從表字段去排序都是低效的,我最初的例子誤導了大家,已更正。

mysql 什麼是子查詢 mysql子查詢是什麼

mysql的子查詢是多表查詢的乙個重要組成部分,常常和連線查詢一起使用,是多表查詢的基礎。下面本篇文章就來帶大家了解一下子查詢,希望對你們有所幫助。什麼是子查詢?子查詢,又叫內部查詢。當乙個查詢是另乙個查詢的條件時,稱之為子查詢。子查詢可以使用幾個簡單命令構造功能強大的復合命令。子查詢最常用於sel...

MYSQL之內鏈結 左鏈結 右鏈結 區別

mysql中可以通過內外鍵鏈結,將有關係的表中資料合併到一起進行條件篩選 首先建立兩個新錶,資料如下 student 表資料 score 表資料 可以看到students表中stu id為16048008的記錄對應score表沒有資料 1.當進行內連線時,系統會自動忽略兩個表中對應不起來的資料 顯示...

什麼是編譯?什麼是鏈結?

1.一般來說,無論是c c 首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file。2.在編譯時編譯器需要的是語法的正確,函式與變數的宣告的正確。只要所有的語法正確,編譯器就可以編譯出中間目標檔案。一般來說,每個原始檔都應該對應於乙...