1. 程式人生 > >例項講解Mysql中各種Join的作用

例項講解Mysql中各種Join的作用

Mysql4.1開始支援SQL的子查詢。這個技術可以使用SELECT語句來建立一個單列的查詢結果,然後把這個結果作為過濾條件用在另一個查詢中。使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死,並且寫起來也很容易。但是,有些情況下,子查詢可以被更有效率的連線(JOIN).. 替代。

Mysql中有左連線(left join)、右連線(right join)和內連線(inner join或者cross join),今天我用一個例項來說明各自的作用:

首先,建立兩個例項資料庫:

表join_a:

CREATE TABLE `join_a` (
 `id` int(4) unsigned NOT NULL auto_increment,
 `name` varchar(20) NOT NULL default '',
 `password` varchar(20) NOT NULL default '',
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

表join_b:

CREATE TABLE `join_b` (
 `id` int(4) unsigned NOT NULL auto_increment,
 `name` varchar(20) NOT NULL default '',
 `sex` tinyint(1) NOT NULL default '0',
 `province` varchar(30) NOT NULL default '',
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

先往表裡插入幾條測試資料

insert into join_a(`name`,`password`) values('xuxingwang','xuxingwang');

insert into join_b(`name`,`sex`,`province`) values('xuxingwang','1','河南');

insert into join_a(`name`,`password`) values('jingzifan','jingzifan');

insert into join_b(`name`,`sex`,`province`) values('baijiangtao','1','河南');

先來看left join:

select * from join_a
left join join_b on join_a.name=join_b.name

結果為:

1 xuxingwang xuxingwang 1 xuxingwang 1 河南
2 jingzifan jingzifan NULL NULL NULL NULL

再來看right join:

select * from join_a
right join join_b on join_a.name=join_b.name

結果為:

1 xuxingwang xuxingwang 1 xuxingwang 1 河南
NULL NULL NULL 2 baijiangtao 1 河南

而用inner join的時候:

select * from join_a
inner join join_b on join_a.name=join_b.name

結果為:

id name password id name sex province
1 xuxingwang xuxingwang 1 xuxingwang 1 河南

 

從上面的結果可以看出,用left join的時候,left join操作符左側表裡的資訊都會被查詢出來,右側表裡沒有的記錄會填空(NULL).right join亦然;inner join的時候則只有條件合適的才會顯示出來