场景
在实际工作中,join
是经常会使用的。其中on
与where
是经常会放在一起使用的。但是结果会随着使用不同的join
而显示不同的结果。本篇博客主要是讲述该区别。
环境
软件 | 版本 |
---|---|
mysql | 5.7.27 |
正文
一、数据准备
1. 建表语句
CREATE TABLE userone (
username varchar(255) NULL,
sex smallint(255) COMMENT '1.男;2.女' NULL,
score int(255) NULL
);
CREATE TABLE usertwo (
username varchar(255) NULL,
sex smallint(255) COMMENT '1.男;2.女' NULL,
score int(255) NULL
);
2. 数据插入
INSERT INTO userone(username, sex, score)
VALUES('name0', 1, 123);
INSERT INTO userone(username, sex, score)
VALUES('name1', 2, 12);
INSERT INTO userone(username, sex, score)
VALUES('name2', 1, 2);
INSERT INTO userone(username, sex, score)
VALUES('name3', 2, 3);
INSERT INTO userone(username, sex, score)
VALUES('name0', 2, 333);
INSERT INTO usertwo(username, sex, score)
VALUES('name0', 1, 31);
INSERT INTO usertwo(username, sex, score)
VALUES('name1', 2,22);
INSERT INTO usertwo(username, sex, score)
VALUES('name4', 1, 42);
INSERT INTO usertwo(username, sex, score)
VALUES('name5', 2, 53);
二、测试
我们这里以一个案例来进行分析。
-
假如我们要获取表
userone
中与usertwo
表相同姓名其性别为男的数据,那么SQL
可以怎么写???SELECT a.username,a.sex,a.score,b.username,b.sex,b.score FROM userone a join usertwo b on a.username=b.username where a.sex=1 SELECT a.username,a.sex,a.score,b.username,b.sex,b.score FROM userone a join usertwo b on a.username=b.username and a.sex=1
就结果来说,上面两行
SQL
的结果是一致的。结果如下:
-
假如我们要获取表
userone
数据,并重点标出与usertwo
表相同姓名、但性别为男的数据,那么SQL
可以怎么写???有人可能会写出下面的SQL
,如下-- SQL1 SELECT a.username,a.sex,a.score,case when b.username is not null then '存在' else '不存在' end as '标记' FROM userone a left join usertwo b on a.username=b.username and a.sex=1 -- SQL2 SELECT a.username,a.sex,a.score,case when b.username is not null then '存在' else '不存在' end as '标记' FROM userone a left join usertwo b on a.username=b.username where a.sex=1
就结果来说,上面两行
SQL
的结果是不一致的,SQL1
获取的结果为:
SQL2
获取的结果为:
就给出的题目来说,我们想要的结果是SQL1
,因为我们要获取全部数据,并需要标明与usertwo
表相同姓名、但性别为男的数据。这里就是体现join
中on
与where
的区别。如果读者比较仔细的话,会发现后面的两个SQL
都使用左连接left join
。左连接代表我们要以左表作为基准,即使不满足条件,也要将其放入作为关联的结果集。而on
后面的条件是不对主表生效的,因为即使不满足条件,按照左右连接的要求,也得将主表中不满足条件的数据放入。而where
关键字是对筛选出的结果集进行过滤,是对整体生效的。所以,从SQL1
和SQL2
的差异来看,结果也大不相同。
总结
join
中的on
是对两个表的笛卡尔积进行过滤的,而where
是对最后关联出来的结果数据进行过滤。如果是左右连接,on
里面的条件则会忽略主表中不满足的数据,不进行过滤;而where
则会对关联结果集进行过滤,不考虑左右关联。
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!