数据库学习系列:join 中 on 与 where的区别

场景

在实际工作中,join是经常会使用的。其中onwhere是经常会放在一起使用的。但是结果会随着使用不同的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);

二、测试

我们这里以一个案例来进行分析。

  1. 假如我们要获取表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的结果是一致的。结果如下:
    在这里插入图片描述

  2. 假如我们要获取表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表相同姓名、但性别为男的数据。这里就是体现joinonwhere的区别。如果读者比较仔细的话,会发现后面的两个SQL都使用左连接left join。左连接代表我们要以左表作为基准,即使不满足条件,也要将其放入作为关联的结果集。而on后面的条件是不对主表生效的,因为即使不满足条件,按照左右连接的要求,也得将主表中不满足条件的数据放入。而where关键字是对筛选出的结果集进行过滤,是对整体生效的。所以,从SQL1SQL2的差异来看,结果也大不相同。

总结

join中的on是对两个表的笛卡尔积进行过滤的,而where是对最后关联出来的结果数据进行过滤。如果是左右连接,on里面的条件则会忽略主表中不满足的数据,不进行过滤;而where则会对关联结果集进行过滤,不考虑左右关联。

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!
在这里插入图片描述
拜拜

猜你喜欢

转载自blog.csdn.net/u013084266/article/details/113702591