就一段SQL查询代码展开
select * from product right join
(select product_id from product_color where color_id=1 ) as product_color
on
product.id = product_color.product_id
一、数据表如下
product表
color表
id color 1 red 2 green 3 white 4 block 7 yellow
product_color表
id product_id color_id 1 1 3 2 3 4 3 2 1 4 4 2 5 3 1
二、执行结果如下
id product_name product_id 2 B 2 3 C 3
三、 right join、left join的说明
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行
1、right join列子
对于上诉的color表和product表:
select * from color
right join product
on color.id = product.id
结果
(color)id color (product)id product_name 1 red 1 A 2 green 2 B 3 white 3 C 4 black 4 D null null 5 E
left join列子
select * from color
left join product
on color.id = product.id
结果
(color)id color (product)id product_name 1 red 1 A 2 green 2 B 3 white 3 C 4 black 4 D 7 yellow null null
inner join列子
select * from color
inner join product
on color.id = product.id
结果
(color)id color (product)id product_name 1 red 1 A 2 green 2 B 3 white 3 C 4 black 4 D
四、on、where
1、说明
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: 1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。 3、on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的。 2、列子
执行:
select * from product right join
(select product_id from product_color where color_id=1 ) as product_color
on
product.id = product_color.product_id
WHERE product_name='B'
结果
id product_name product_id 2 B 2
将上述的SQL中,where换成and查询结果
id product_name product_id 2 B 2 null null 3
五、以上部分说明源自其他博客。