SQL中的LEFT JOIN 和 RIGHT JOIN 以及INNER JOIN

用一个简单的实例说明一下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

posted @ 2014-01-08 16:33  jaw-crusher  阅读(296)  评论(0编辑  收藏  举报