SQL的left join、right join说明,以及on和where的区别

就一段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

五、以上部分说明源自其他博客。

猜你喜欢

转载自blog.csdn.net/m13797378901/article/details/74554202
今日推荐