亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL的LEFT JOIN表連接的進階學習教程

2024-07-24 13:08:26
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了MySQL的LEFT JOIN表連接的進階學習教程,包括對左連接的查詢效率分析以及相關建議,需要的朋友可以參考下
 

LEFT JOIN的主表

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

CREATE TABLE IF NOT EXISTS `categories` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(15) NOT NULL,`created` datetime NOT NULL,PRIMARY KEY (`id`));CREATE TABLE IF NOT EXISTS `posts` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`category_id` int(10) unsigned NOT NULL,`title` varchar(100) NOT NULL,`content` varchar(200) NOT NULL,`created` datetime NOT NULL,PRIMARY KEY (`id`),KEY `category_id` (`category_id`));

先注意一下每個表的索引情況,以后會用到,記得隨便插入一點測試數據,不用太多,但怎么也得兩行以上,然后執行以下SQL:

EXPLAIN SELECT *FROM postsLEFT JOIN categories ON posts.category_id = categories.idWHERE categories.id = ‘一個已經存在的ID'ORDER BY posts.created DESC
table   key     Extracategories PRIMARY   Using filesortposts   category_id Using where

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

那explain結果中的Using filesort又是為什么呢?這是因為主表是categories表,從表是posts表,而我們使用從表的字段去ORDER BY,這通常不是一個好選擇,最好改成主表字段,如果鑒于需求所限,無法改成主表的字段,那么可以嘗試添加如下索引:

ALTER TABLE `posts` ADD INDEX ( `category_id` , `created` );

再運行SQL時就不會有Using filesort了,這是因為主表categories在通過category_id連接從表posts時,可以進而通過索引直接得到排序后的posts結果。

主觀上一旦搞錯了主表,可能怎么調整索引都得不到高效的SQL,所以在寫SQL時,比如說在寫LEFT JOIN查詢時,如果希望左表是主表,那么就要保證在WHERE語句里的查詢條件盡可能多的使用左表字段,進而,一旦確定了主表,也最好只通過主表字段去ORDER BY。

LEFT JOIN查詢效率分析
user表:

id | name---------1 | libk2 | zyfon3 | daodaouser_action表:user_id | action---------------1 | jump1 | kick1 | jump2 | run4 | swim

sql:

select id, name, action from user as uleft join user_action a on u.id = a.user_idresult:id | name | action--------------------------------1 | libk | jump ①1 | libk | kick ②1 | libk | jump ③2 | zyfon | run ④3 | daodao | null ⑤

分析:
注意到user_action中還有一個user_id=4, action=swim的紀錄,但是沒有在結果中出現,
而user表中的id=3, name=daodao的用戶在user_action中沒有相應的紀錄,但是卻出現在了結果集中
因為現在是left join,所有的工作以left為準.
結果1,2,3,4都是既在左表又在右表的紀錄,5是只在左表,不在右表的紀錄


結論:
我們可以想象left join 是這樣工作的
從左表讀出一條,選出所有與on匹配的右表紀錄(n條)進行連接,形成n條紀錄(包括重復的行,如:結果1和結果3),
如果右邊沒有與on條件匹配的表,那連接的字段都是null.
然后繼續讀下一條。

引申:
我們可以用右表沒有on匹配則顯示null的規律, 來找出所有在左表,不在右表的紀錄, 注意用來判斷的那列必須聲明為not null的。
如:

select id, name, action from user as uleft join user_action a on u.id = a.user_idwhere a.user_id is NULL

(注意:1.列值為null應該用is null 而不能用=NULL
2.這里a.user_id 列必須聲明為 NOT NULL 的)

result:id | name | action--------------------------3 | daodao | NULL--------------------------------------------------------------------------------

Tips:
1. on a.c1 = b.c1 等同于 using(c1)
2. INNER JOIN 和 , (逗號) 在語義上是等同的
3. 當 MySQL 在從一個表中檢索信息時,你可以提示它選擇了哪一個索引。
如果 EXPLAIN 顯示 MySQL 使用了可能的索引列表中錯誤的索引,這個特性將是很有用的。
通過指定 USE INDEX (key_list),你可以告訴 MySQL 使用可能的索引中最合適的一個索引在表中查找記錄行。
可選的二選一句法 IGNORE INDEX (key_list) 可被用于告訴 MySQL 不使用特定的索引。
4. 一些例子:

mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id;mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id);mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id-> LEFT JOIN table3 ON table2.id=table3.id;mysql> SELECT * FROM table1 USE INDEX (key1,key2)-> WHERE key1=1 AND key2=2 AND key3=3;mysql> SELECT * FROM table1 IGNORE INDEX (key3)-> WHERE key1=1 AND key2=2 AND key3=3;


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久国产精品x99av| 日韩精品视频免费专区在线播放| 久久精品视频中文字幕| 欧美午夜精品在线| 另类少妇人与禽zozz0性伦| 91精品国产乱码久久久久久蜜臀| 国产精品丝袜视频| 欧美成人精品在线播放| 亚洲电影免费观看高清| 欧美性少妇18aaaa视频| 国产精品男人的天堂| 欧美一区二区三区免费视| 91亚洲精品一区二区| 欧美电影院免费观看| 97视频免费观看| 精品成人在线视频| 欧美大胆a视频| 亚洲黄色在线看| 日本韩国欧美精品大片卡二| 精品高清一区二区三区| 精品成人久久av| 欧美精品18videos性欧美| 欧美伦理91i| 国产伊人精品在线| 久久精品视频中文字幕| 国产日韩欧美在线| 国产这里只有精品| 麻豆国产va免费精品高清在线| 91网在线免费观看| 国产精品日日摸夜夜添夜夜av| 亚洲精品视频在线播放| 日韩国产中文字幕| 国产精品久久久久久久久久99| 国产精品视频专区| 91精品免费看| www.久久久久| 久久影院资源站| 久久免费高清视频| 色妞色视频一区二区三区四区| 亚洲激情电影中文字幕| 亚洲人成毛片在线播放| 日韩欧美国产网站| 中文字幕在线看视频国产欧美在线看完整| 色婷婷综合成人| 国产亚洲欧美日韩一区二区| 中文国产成人精品久久一| 亚洲精品视频免费| 国产精品96久久久久久| 成人免费观看49www在线观看| 在线观看日韩www视频免费| 欧美日韩aaaa| 最近中文字幕日韩精品| 精品日本高清在线播放| 懂色av中文一区二区三区天美| 欧美视频一区二区三区…| 国产精品自拍视频| www欧美xxxx| 成人免费看黄网站| 日本成熟性欧美| 国产精品一区二区电影| 国产亚洲视频在线| 亚洲国产精品一区二区三区| 日韩成人黄色av| 欧美日韩在线免费| 日韩精品在线观看网站| 日韩女优人人人人射在线视频| 国外成人在线播放| 欧美有码在线观看| 国产黑人绿帽在线第一区| 欧美最猛黑人xxxx黑人猛叫黄| 在线观看亚洲视频| 亚洲男人av在线| 成人黄色午夜影院| 精品福利在线视频| 美女999久久久精品视频| 2018中文字幕一区二区三区| 亚洲欧美日韩精品久久奇米色影视| 久久久999精品| 欧美日韩国产综合新一区| 国产精品第100页| 久久网福利资源网站| 国产亚洲一区精品| 精品久久久久久中文字幕| 午夜精品久久久久久久久久久久久| 国产欧洲精品视频| 欧美黑人巨大xxx极品| 欧美视频在线观看 亚洲欧| 国内精品小视频在线观看| 亚洲精品美女网站| 日本精品性网站在线观看| 欧美另类老女人| 日韩在线免费av| 日本久久91av| 午夜精品蜜臀一区二区三区免费| 亚洲欧美国产精品专区久久| 欧美理论电影在线观看| 成人欧美一区二区三区在线湿哒哒| 欧美国产日本在线| 欧美性受xxx| 这里只有精品视频| 精品欧美一区二区三区| 欧美日韩第一视频| 久久久久久久久国产| 久久精品成人一区二区三区| 日韩av网站在线| 日韩美女写真福利在线观看| 国产在线播放不卡| 欧美大片在线看免费观看| 日韩毛片在线观看| 亚洲欧美日韩中文在线制服| 日韩精品在线免费观看| 欧美精品成人在线| 精品视频久久久| 国产精品18久久久久久首页狼| 久久电影一区二区| 欧美激情视频网址| 91精品国产91久久久久| 成人午夜高潮视频| 亚洲人成电影网站色| 91超碰中文字幕久久精品| 欧美乱大交xxxxx| 97人人爽人人喊人人模波多| 91精品久久久久久久久久久久久| 国产综合久久久久久| 欧美视频在线观看免费网址| 日韩av观看网址| 久久精品人人做人人爽| 欧美巨乳美女视频| 久久免费高清视频| 九九九热精品免费视频观看网站| 亚洲free性xxxx护士hd| 欧美激情三级免费| 狠狠色狠色综合曰曰| 亚洲成人久久一区| 亚洲精品乱码久久久久久金桔影视| 色偷偷综合社区| 亚洲第一视频在线观看| 国产一区二区精品丝袜| 日韩视频免费观看| 一区二区在线视频播放| 91网站免费观看| 国内免费久久久久久久久久久| 91免费看视频.| 欧美激情综合色综合啪啪五月| 奇米四色中文综合久久| 国产视频久久久久久久| 亚洲毛片在线看| 精品一区二区三区电影| 国产精品91久久久| 日韩av网站导航| 国产美女高潮久久白浆| 国产精品丝袜一区二区三区| 综合av色偷偷网| 亚洲xxxx做受欧美| 97超碰蝌蚪网人人做人人爽| 97香蕉久久超级碰碰高清版| 奇米成人av国产一区二区三区| 久久久久久国产精品美女| 亚洲人成77777在线观看网| 亚洲一区二区三区成人在线视频精品| 亚洲国产天堂网精品网站| 精品人伦一区二区三区蜜桃网站| 中文综合在线观看| 久久人91精品久久久久久不卡|