作為一名java程序員,求職面試時也會遇到mysql問題,,有次我到一家軟件面試,,就遇到有一道筆試題是考核關(guān)于sql 的。left join和left outer join 有什么區(qū)別,? 關(guān)于left join我平時編寫sql表關(guān)聯(lián)時用得比較多,,但對于left outer join我很少用到,所以對于兩者之間有什么區(qū)別,,我沒搞懂,,于是這道題目有沒有作答,,面試官看了也問了下,我也說不出個所以然,,那次面試總體也不太理想,。join對于接觸過數(shù)據(jù)庫的人,這個詞都不陌生,,而且很多人很清楚各種join,,也有的人對這個理解不是很透徹。首先我們來說結(jié)果,,兩者之間沒有本質(zhì)上的區(qū)別,用法都一樣,。首先,我們創(chuàng)建兩張表,,第一張表命名為tb_user(用戶表),,第二張表命名為tb_user_class(用戶班級表)-- 用戶表 create table `tb_user` ( `id` int(11) not null, `user_name` varchar(255) default null, primary key (`id`) ) engine=innodb default charset=utf8
-- 用戶班級表 create table `tb_user_class` (
`id` int(11) not null,
`class_name` varchar(255) default null,
`user_id` int(11) not null,
primary key (`id`)
) engine=innodb default charset=utf8 然后分別往這兩張表上添加一些數(shù)據(jù)insert into tb_user(id,user_name) values(1,'張三'); insert into tb_user(id,user_name) values(2,'李四'); insert into tb_user(id,user_name) values(3,'小紅'); insert into tb_user(id,user_name) values(4,'小明'); insert into tb_user(id,user_name) values(5,'小林'); insert into tb_user(id,user_name) values(6,'');
insert into tb_user_class(id,class_name,user_id) values(3,'3班',3); insert into tb_user_class(id,class_name,user_id) values(4,'4班',4); insert into tb_user_class(id,class_name,user_id) values(5,'5班',5); 下面我們用關(guān)聯(lián)表查詢這兩張表一,、left join(左連接)顧名思義,,就是“左連接”,表1左連接表2,,以左為主,,表示以表1為主,關(guān)聯(lián)上表2的數(shù)據(jù),,查出來的結(jié)果顯示左邊的所有數(shù)據(jù),,然后右邊顯示的是和左邊有交集部分的數(shù)據(jù)。如下:select a.id, a.user_name, b.class_name from tb_user a left join tb_user_class b on a.id =b.user_id 執(zhí)行上面的SQL輸出結(jié)果如下:二,、right join(右連接)“右連接”,,表1右連接表2,以右為主,,表示以表2為主,,關(guān)聯(lián)查詢表1的數(shù)據(jù),查出表2所有數(shù)據(jù)以及表1和表2有交集的數(shù)據(jù),,如下:select a.id, .user_name, b.class_name from tb_user a right join tb_user_class b on a.id =b.user_id 執(zhí)行上面的SQL輸出結(jié)果如下:三,、joinjoin,其實就是“inner join”,,為了簡寫才寫成join,,兩個是表示一個的,內(nèi)連接,,表示以兩個表的交集為主,,查出來是兩個表有交集的部分,,其余沒有關(guān)聯(lián)就不額外顯示出來,這個用的情況也是挺多的,,如下select a.id, a.user_name, b.class_name from tb_user a join tb_user_class b on a.id =b.user_id 執(zhí)行上面的SQL輸出結(jié)果如下:四,、inner join(內(nèi)連接)內(nèi)連接是最常見的一種連接,只連接匹配的行,。select a.id, a.user_name, b.class_name from tb_user a inner join tb_user_class b on a.id =b.user_id
五,、left outer join左連接,簡單來說,,如果是左連接,,則保留左表所有的行;即使在右表中沒有匹配的行,。select a.id, a.user_name, b.class_name from tb_user a left outer join tb_user_class b on a.id =b.user_id 細心的你會發(fā)現(xiàn) inner join與join執(zhí)行結(jié)果集是相同的,。left outer join 和 left join結(jié)果集是一樣的。現(xiàn)在我們再回過頭看看,,left join和left outer join有什么區(qū)別,?如果非要說有什么區(qū)別的話,,那就是left outer join 比left join 多了一個outer,。left join是left outer join的縮寫,所以作用是一樣的,。不過我見過經(jīng)驗豐富的數(shù)倉工程師,,在關(guān)聯(lián)維表時喜歡用left outer join,這或許是一種個人習(xí)慣吧,。另外在sql里沒有大小寫區(qū)分,,也就是left join和LEFT JOIN都是可以的。值得注意的是,,在編寫sql時,,盡量保持大小寫統(tǒng)一,不要一會兒大寫,,一會兒小寫,,雖然大小寫混合,執(zhí)行結(jié)果數(shù)據(jù)集是一致的,,但還是統(tǒng)一比較好,,做技術(shù)嚴謹點好。總結(jié):left join: 包含左表的所有行,,對應(yīng)的右表行可能為空 right join: 包含右表的所有行,,對應(yīng)的左表行可能為空 inner join: 只包含左右表都匹配并且不為空的行 join: 只包含左右表都匹配并且不為空的行 left outer join: 包含左表的所有行,對應(yīng)的右表行可能為空,。 由于筆者知識及水平有限,文中錯漏之處在所難免,如有不足之處,,歡迎交流,。
|