就一段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表
id
product_name
1
A
2
B
3
C
4
D
5
E
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
五、以上部分说明源自其他博客。