left jion on and 与 where 的区别

left jion on and 与 where 的区别

参考链接:https://blog.csdn.net/qq_33864656/article/details/77838258

参考链接:https://www.icode9.com/content-4-896261.html

以mysql为例子

小绿CREATE TABLE 
    testa 
    ( 
        id   INT NOT NULL, 
        name VARCHAR(20), 
        PRIMARY KEY (id) 
    ) 
    ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;
CREATE TABLE 
    testb 
    ( 
        Id  INT NOT NULL, 
        age INT, 
        PRIMARY KEY (Id) 
    ) 
    ENGINE=InnoDB DEFAULT CHARSET=latin1 DEFAULT COLLATE=latin1_swedish_ci;
    
insert into testa values(1, '小黄');
insert into testa values(2, '小绿'); 
insert into testa values(3, '小白');
insert into testa values(4, '小黑');
insert into testB values(1, 10);
insert into testB values(2, 11);
insert into testB values(3, 12);
insert into testB values(4, 13);

通过例子说明:

使用left join on where,且where后跟的是右边的条件

-- 使用left join on where,且where后跟的是右边的条件
select * from testa a
left join testb b on a.id = b.id where b.age = 10;

结果:

id name id age
1 小黄 1 10

使用left join and且and后跟的是右边的条件

-- 使用left join and且and后跟的是右边的条件
select * from testa a
left join testb b on a.id = b.id and b.age = 10;

结果:

id name id age
1 小黄 1 10
2 小绿 (NULL) (NULL)
3 小白 (NULL) (NULL)
4 小黑 (NULL) (NULL)

使用left join on where,且where后跟的是左边的条件

-- 使用left join on where,且where后跟的是右边的条件
select * from testa a
left join testb b on a.id = b.id where a.name = '小黄';

结果:

id name id age
1 小黄 1 10

使用left join and且and后跟的是左边的条件

-- 使用left join and且and后跟的是左边的条件
select * from testa a
left join testb b on a.id = b.id and a.name = '小黄';

结果:

id name id age
1 小黄 1 10
2 小绿 (NULL) (NULL)
3 小白 (NULL) (NULL)
4 小黑 (NULL) (NULL)

总结

  1. where 是在两个表join完成后,再附上where条件。

  2. left/right join on and 是在表连接前筛选A表或B表那些数据符合条件,同时还是兼顾是left jion 还是inner join。即如果是left jion的话,如果left loin on and后的条件左边表的某条记录不满足,那么它不进行连接,但任然留在结果集中(此时右边部分的链接结果为NULL)。on条件是在生产临时表时使用的条件,它不管on中的条件是否为真,都会返回左表的记录。

  3. inner jion on and 结果与where一样。

  4. 建议尽量使用where来过滤条件。

posted @ 2022-06-07 11:22  我见青山应如是  阅读(118)  评论(0编辑  收藏  举报