用一个简单的实例说明一下left join, right join, inner join,建立两个表,使用mysql做一下关联实验:
create_db.sql:
create database small_product; use small_product; create table `product` ( `id` int(10) unsigned NOT NULL auto_increment, `amount` int(10) unsigned default NULL, PRIMARY KEY (`id`) ) ENGINE=MYISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; create table `product_details` ( `id` int(10) unsigned NOT NULL, `weight` int(10) unsigned default NULL, `exist` int(10) unsigned default NULL, PRIMARY KEY(`id`) )ENGINE=MYISAM DEFAULT CHARSET=latin1; insert into product (id, amount) values (1, 100), (2, 200), (3, 300), (4, 400); insert into product_details (id, weight, exist) values (2, 22, 0), (4, 44, 1), (3, 33, 2), (6, 66, 4);
使用左关联,将product作为主表:
select * from product left join product_details on (product.id = product_details.id);
得到结果是这样的.
使用右关联,将product_details作为主表:
select * from product right join product_details on (product.id = product_details.id);
使用inner join:
select * from product inner join product_details on (product.id = product_details.id);
简单的理解就是,左关联以左边的表为主,把数据先从左边的表中找出来,再根据关联字段去找右边表的数据,没有的话,显示NULL。
右关联则以右边的表为主,把数据先从右边表中找出来,再根据关联字段去找左边表的数据,没有的话,同样显示NULL。
inner join是不能包括NULL的,如果使用等值运算符的话,必须两张表中的关联字段相等才行。
关于使用On子句和Where子句的不同:
select * from product left join product_details on (product.id = product_details.id) and product_details.id = 2;
使用where子句:
select * from product left join product_details on (product.id = product_details.id) where product_details.id = 2;
where子句是在匹配结束后执行过滤条件的,所以只有一行结果。
参考:http://www.oschina.net/question/89964_65912?sort=default&p=1#answers