SQL Join子句,主要用在select語句中,把兩個(gè)或多個(gè)表的行結(jié)合起來,基于這些表之間的共同字段(往往是id字段)來查詢,從多個(gè)表中返回滿足條件的所有行。
常見join子句類型
常見join子句類型有INNER JOIN(同JOIN)、LEFT JOIN、RIGHT JOIN、FULL JOIN,其中第一種為內(nèi)連接,后三種為外連接。
不同的join子句類型區(qū)別如下圖所示:
介紹其中4種:
1、方法一(僅適用單個(gè)字段):使用 not in ,比較容易理解,缺點(diǎn)是效率低
如:select A.ID from A where A.ID not in (select ID from B);
2、方法二(適用多個(gè)字段匹配):使用 left join…on… , “B.ID isnull” 表示左連接之后在B.ID 字段為 null的記錄。
如:select A.ID from A left join B on A.ID=B.ID where B.ID is null ;
3、方法三(適用多個(gè)字段匹配)
如:select * from B where (select count(1) as num from A where A.ID = B.ID) = 0;
4、方法四(適用多個(gè)字段匹配)
如:select * from A where not exists(select 1 from B where A.ID=B.ID)
總結(jié):
方法一:第一種not in 場(chǎng)景使用子查詢數(shù)據(jù)量小的情況。因?yàn)槲易硬樵冎挥?0w的數(shù)據(jù)。但是總表有100w。所以我使用not in的話我使用的是外表的索引所以數(shù)據(jù)較快。弊端。子查詢里面不能存在null字段。如果有,那么你數(shù)據(jù)就會(huì)準(zhǔn)。這種方式的實(shí)際情況其實(shí)是和字表做hash連接。
方法二:左連接:left join 或 left outer join
(1)左向外聯(lián)接的結(jié)果集包括 LEFT OUTER 子句中指定的左表的所有行,而不僅僅是聯(lián)接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值(null)。兩表進(jìn)行關(guān)聯(lián)。數(shù)據(jù)量為兩個(gè)表的笛卡爾積。返回左表的全部數(shù)據(jù)。右邊不滿足條件的為null。如果左表數(shù)據(jù)大的話,這樣關(guān)聯(lián)數(shù)據(jù)也不小。所以速度這么慢,屬于正常。
方法四:第二種not in 場(chǎng)景使用子查詢數(shù)據(jù)量小的情況。因?yàn)槲易硬樵冎挥?0w的數(shù)據(jù)。但是總表有100w。所以我使用not exists的話我使用的是子表的索引。但是我外表數(shù)據(jù)太大。所以導(dǎo)致速度變慢。本質(zhì):對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢。
總結(jié):
如果右表是子表,也就是說右表有多條記錄匹配左表的話,那么展示的最終結(jié)果是多條記錄和左表匹配。如下圖展示
總結(jié):left join 其實(shí)也就是匹配左表的過程,on條件后不應(yīng)該加上左表的條件。文章來源:http://www.zghlxwxcb.cn/news/detail-425879.html
轉(zhuǎn):https://www.cnblogs.com/jelly12345/p/16828722.html文章來源地址http://www.zghlxwxcb.cn/news/detail-425879.html
到了這里,關(guān)于mysql 查詢?cè)谝粡埍聿辉诹硗庖粡埍淼挠涗浀奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!