数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用1eft jion时,on和where条件的区别如下:1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。假设有两张表:
两条 SQL:1、selectform tabl left join tab2 on(tabl.size=tab2.size)where tab2.name=‘AAA‘2、selectform tabl left join tab2 on(tabl.size=tab2.size and tab2.name=‘AAA)第一条SQL的过程:1、中间表on条件;2、再对中间表过滤where条件:tab2.name=AAA‘tab1.id tab1.size tab2.size tab2.name
第二条SQL的过程:1、中间表on条件:tabl.size=tab2.size and tab2.name=‘AAA‘(条件不为真也会返回左表中的记录)其实以上结果的关键原因就是1eft join,right join,fulljoin的特殊性,不管on上的条件是否为真都会返回1eft或right表中的记录,ful1则具有1eft和right的特性的并集。而inner join 没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。on为了反映外连接中一方的全连接,而where没有这个功能,内连接配对是可以的。
sql中在使用left join 时 on and 和on where 的区别
标签:HERE com where 含义 的区别 orm image 并集 sql
小编还为您整理了以下内容,可能对您也有帮助:
SQL左右连接中的on and和on where的区别
1、现有两张测试表,table_a和table_b。table_a表中的数据:14条记录,主键是(user_id,brand_id),是用户在每个月份访问的上网品牌及其访问频率。table_b表中的数据:主键是user_id,是用户基本类别表,Type_Id是用户在该月份的用户类别。 (1)通过user_id和month_id连接起来的效果:
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 ;
最终的记录数等于主表的记录数。
主表的选择很重要,这里的记录数等于主表记录数,但不是总是这样的,与非主表中的记录组成也有关系。(2)添加where条件的效果:1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 WHERE A1.Brand_Id=‘501B03‘13 ;说明where条件是对连接完成产生的查询结果的再次筛选。会影响到最后的记录数。(3)继续添加where条件的效果:
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 WHERE A1.Brand_Id=‘501B03‘13 AND A2.Type_Id=1014 ;
进一步说明,where条件是对连接产生的查询结果集的二次筛选。
(4)添加更多个on连接条件的效果:1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 AND A1.Brand_Id=‘501B03‘13 ;总结如下:这里是对主表添加了On条件,它会对主表参与多表连接的记录进行一次过滤,只有满足这个条件的主表记录才会参与与其他表的连接操作,获取其他表中的字段组成一条需要的记录;主表中不符合这个on条件的记录也会进入到最后的结果表中,但不会参与与其他表的连接,因此,记录中其他表中获取的字段处全是NULL。这里可以体现出,主表的特殊性,在left join 里面,主表就是多表连接最左边的那张表,表里面所有的记录都会出现在最后的结果集中,但是只有满足on条件的记录才会参与与其他表的连接操作。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 AND A2.Type_Id=1013 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 AND A1.Brand_Id=‘501B03‘13 AND A2.Type_Id=1014 ;这个表就综合了上面两方面,使用Brand_Id=‘501B03‘对主表进行一次筛选,让符合这一条件的记录参与与其他表的连接,其他记录不参与连接,但是仍进入结果表(空位字段补NULL);使用Type_Id=10对被连接表A2首先做一次筛选,让符合这一条件的记录参与与主表A1的连接,不符合这一条件的记录被剔除掉不予考虑,也没有机会参与连接和进入结果表。(5)更改table_b的主键,将其设为(user_id,month_id),并添加一条记录如下:这样再table_b中对应user_id=989832就有两条记录。执行下面的SQL:
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 ;
这样可以看到,最后查询结果集的记录数不再是14条记录,而是15条,这说明了一点,最后的结果集中的记录数并不是和主表中记录数一致的,而是由主表和被连接表根据连接条件共同确定的,还可以说明的一点是,不论on条件是什么样,多简单多复杂,只要没有where条件,最后的查询结果集中的记录数不会少于主表记录数。对于这个例子,主表中的14条记录都会进入结果表,由于主表中的连接条件只有User_Id相等,因此,对于A2表中的User_Id=989832由于存在两条记录,因此都会与A1表User_Id=989832的那一条记录相连,因此产生了两条连接结果记录,所以使得最后的结果集增至15条记录。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 ;
上面给A1和A2表的连接条件增加了一个Month_Id相等的条件,这样只有满足这一条件的A2表记录才会参与连接,这样就对A2表中的User_Id=989832剔除了一条记录,所以最后连接只产生了14条记录。
2、综上所述,予以总结如下:(1)ON条件,不论是A1.COL1=A2.COL2还是A2.COL3=XX,都是对A2表(被连接表)进行的条件筛选,将符合这一条件的记录取出来,参与与主表的连接操作,不符合该条件的记录都会被考虑参与连接。对于条件A1.COL4=XXX,其作用是对A1表(主表)进行条件筛选,符合该条件的记录将会参与与其他表的连接,不符合该条件的记录也会进入最后的结果表,空位补NULL。而A1.COL1=A2.COL2其实也是对A1表的筛选,让满足条件的A1表中的记录参与与其他表的连接,不满足的空位补NULL继续进入结果表。不论怎么使用ON条件,只要没有WHERE条件筛选,最后查询的结果集的记录数都是大于等于主表原始的记录数。(2)WHERE条件,是对查询完毕后的结果集进行的筛选。可使用的筛选条件字段为任意的,因为多表查询实质是多个表之间的全字段连接查询,只是可以指定最后对外显示多少个字段的记录。where条件会从根本上影响最后查询结果集的记录数。(3)如果对连接查询后聚集函数结果进行的筛选则需要使用GROUP BY +HAVING搭配完成。SQL中on和where的使用及其差异
标签:
SQL左右连接中的on and和on where的区别
1、现有两张测试表,table_a和table_b。table_a表中的数据:14条记录,主键是(user_id,brand_id),是用户在每个月份访问的上网品牌及其访问频率。table_b表中的数据:主键是user_id,是用户基本类别表,Type_Id是用户在该月份的用户类别。 (1)通过user_id和month_id连接起来的效果:
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 ;
最终的记录数等于主表的记录数。
主表的选择很重要,这里的记录数等于主表记录数,但不是总是这样的,与非主表中的记录组成也有关系。(2)添加where条件的效果:1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 WHERE A1.Brand_Id=‘501B03‘13 ;说明where条件是对连接完成产生的查询结果的再次筛选。会影响到最后的记录数。(3)继续添加where条件的效果:
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 WHERE A1.Brand_Id=‘501B03‘13 AND A2.Type_Id=1014 ;
进一步说明,where条件是对连接产生的查询结果集的二次筛选。
(4)添加更多个on连接条件的效果:1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 AND A1.Brand_Id=‘501B03‘13 ;总结如下:这里是对主表添加了On条件,它会对主表参与多表连接的记录进行一次过滤,只有满足这个条件的主表记录才会参与与其他表的连接操作,获取其他表中的字段组成一条需要的记录;主表中不符合这个on条件的记录也会进入到最后的结果表中,但不会参与与其他表的连接,因此,记录中其他表中获取的字段处全是NULL。这里可以体现出,主表的特殊性,在left join 里面,主表就是多表连接最左边的那张表,表里面所有的记录都会出现在最后的结果集中,但是只有满足on条件的记录才会参与与其他表的连接操作。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 AND A2.Type_Id=1013 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 AND A1.Brand_Id=‘501B03‘13 AND A2.Type_Id=1014 ;这个表就综合了上面两方面,使用Brand_Id=‘501B03‘对主表进行一次筛选,让符合这一条件的记录参与与其他表的连接,其他记录不参与连接,但是仍进入结果表(空位字段补NULL);使用Type_Id=10对被连接表A2首先做一次筛选,让符合这一条件的记录参与与主表A1的连接,不符合这一条件的记录被剔除掉不予考虑,也没有机会参与连接和进入结果表。(5)更改table_b的主键,将其设为(user_id,month_id),并添加一条记录如下:这样再table_b中对应user_id=989832就有两条记录。执行下面的SQL:
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 ;
这样可以看到,最后查询结果集的记录数不再是14条记录,而是15条,这说明了一点,最后的结果集中的记录数并不是和主表中记录数一致的,而是由主表和被连接表根据连接条件共同确定的,还可以说明的一点是,不论on条件是什么样,多简单多复杂,只要没有where条件,最后的查询结果集中的记录数不会少于主表记录数。对于这个例子,主表中的14条记录都会进入结果表,由于主表中的连接条件只有User_Id相等,因此,对于A2表中的User_Id=989832由于存在两条记录,因此都会与A1表User_Id=989832的那一条记录相连,因此产生了两条连接结果记录,所以使得最后的结果集增至15条记录。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A210 ON A1.User_Id=A2.User_Id11 AND A1.Month_Id=A2.Month_Id12 ;
上面给A1和A2表的连接条件增加了一个Month_Id相等的条件,这样只有满足这一条件的A2表记录才会参与连接,这样就对A2表中的User_Id=989832剔除了一条记录,所以最后连接只产生了14条记录。
2、综上所述,予以总结如下:(1)ON条件,不论是A1.COL1=A2.COL2还是A2.COL3=XX,都是对A2表(被连接表)进行的条件筛选,将符合这一条件的记录取出来,参与与主表的连接操作,不符合该条件的记录都会被考虑参与连接。对于条件A1.COL4=XXX,其作用是对A1表(主表)进行条件筛选,符合该条件的记录将会参与与其他表的连接,不符合该条件的记录也会进入最后的结果表,空位补NULL。而A1.COL1=A2.COL2其实也是对A1表的筛选,让满足条件的A1表中的记录参与与其他表的连接,不满足的空位补NULL继续进入结果表。不论怎么使用ON条件,只要没有WHERE条件筛选,最后查询的结果集的记录数都是大于等于主表原始的记录数。(2)WHERE条件,是对查询完毕后的结果集进行的筛选。可使用的筛选条件字段为任意的,因为多表查询实质是多个表之间的全字段连接查询,只是可以指定最后对外显示多少个字段的记录。where条件会从根本上影响最后查询结果集的记录数。(3)如果对连接查询后聚集函数结果进行的筛选则需要使用GROUP BY +HAVING搭配完成。SQL中on和where的使用及其差异
标签:
SQL左右连接中的on and和on where的区别
on and 是指这前后两个表连接的条件 不止一个条件,两个表会按所有条件进行前后连接,这on和and左右出现的是列与列的关系。他是A和B全部数据按要求的连接。
on where 是指这前后两个表的连接条件只有on后面的一个,然后对连接好的结果,去执行where条件查询,where后面的列可以不是连接相关的列,where后面出现的是某一个列的条件,是对行的筛选条件,不是列与列的连接关系。where是对A或B筛选之后的数据再去按照ON的条件去连接
比如select * from employee A join Salary B on A.name=B.name and A.ID=B.ID
select * from employee A join Salary B on A.name=B.name where A.ID='111'
你感受下
浅谈,SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别
你好,left
join,right,full后on和where的区别就在于:
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录,而where条件是在临时表生成好后,再对临时表进行过滤的条件。
而且除了stu_id=1的那条记录,class表中字段不满足过滤条件的记录(即使被关联到了)全是null,所以on后面的语句最好只写两个表相关联的语句,并不能做单方面的过滤。
也可以这么简单的理解,以坐标为主,先查询出左表的全部记录,然后关联右表,将符合条件的记录的数据填充进查询出来的结果。
right
join
和
full
join
具有相同的特性,但是inner
join不同,它可以在on
那里做过滤处理,也就是说放在on后面和where后面作用是一样的。
希望对你有帮助