问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL中的ON和WHERE有什么区别啊?谢谢

发布网友 发布时间:2022-04-07 18:58

我来回答

2个回答

懂视网 时间:2022-04-07 23:19

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 A2
10 ON A1.User_Id=A2.User_Id
11 AND A1.Month_Id=A2.Month_Id
12 ;

最终的记录数等于主表的记录数。

技术分享

主表的选择很重要,这里的记录数等于主表记录数,但不是总是这样的,与非主表中的记录组成也有关系。 (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 A2
10 ON A1.User_Id=A2.User_Id
11 AND A1.Month_Id=A2.Month_Id
12 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 A2
10 ON A1.User_Id=A2.User_Id
11 AND A1.Month_Id=A2.Month_Id
12 WHERE A1.Brand_Id=‘501B03‘
13 AND A2.Type_Id=10
14 ;

技术分享 

进一步说明,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 A2
10 ON A1.User_Id=A2.User_Id
11 AND A1.Month_Id=A2.Month_Id
12 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 A2
10 ON A1.User_Id=A2.User_Id
11 AND A1.Month_Id=A2.Month_Id
12 AND A2.Type_Id=10
13 ;

 技术分享

技术分享
总结如下:这里添加了对被连接表的On条件,这个条件也不会影响主表在最后结果集中的记录,它的作用主要是对被连接表首先进行一次筛选,它会让符合这个条件的被连接表中的记录去参与与主表的连接操作,其他不符合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 A2
10 ON A1.User_Id=A2.User_Id
11 AND A1.Month_Id=A2.Month_Id
12 AND A1.Brand_Id=‘501B03‘
13 AND A2.Type_Id=10
14 ;
技术分享 技术分享 这个表就综合了上面两方面,使用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 A2
10 ON A1.User_Id=A2.User_Id
11 ;

技术分享 

这样可以看到,最后查询结果集的记录数不再是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 A2
10 ON A1.User_Id=A2.User_Id
11 AND A1.Month_Id=A2.Month_Id
12 ;

 上面给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的使用及其差异

标签:

热心网友 时间:2022-04-07 20:27

本质上的区别不是很清楚.
实际应用中的,比较了解,on 条件是用于外键连接,where 条件是用于筛选纪录.
on可适用于多条记录,asp批量处理时候常用.where必将常见于单条记录读取查询.
而且on一般跟join连用的,where是条件语句,听说在有索引的情况下,join的效率会更快点,但具体没亲自测试过.

where是SQL-89语法,用on是SQL-92语法,都还没过时,具体看实际用途进行选择.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
胶原蛋白线双眼皮是不是永久性 双眼皮埋线是蛋白质还是尼龙绳-双眼皮埋线蛋白线多久能吸收 人体输液的“港口”完全植入式输液港 双眼皮宽变窄修复的方法 同心保家庭重疾险靠不靠谱?便宜吗? 做完双眼皮一宽一窄怎么办 喝全脂奶粉对长高有没有什么好处? redmine中“选择一个项目..."下拉列表框中为什么只列出一个项目,我建... 南充市龙门中学实力现在怎样?他的奥赛班是重点班么? 感情中为什么总是不知足呢? 解放前的清朝时期东北是几个省? 东北原来四个省叫什么 43岁女人家庭条件一般买什么保险好呢 43岁男的可以买哪些保险? ASUS主板工具,探测CPU温度.求教高手,急!谢谢!! 华硕有查看笔记本温度等信息的软件吗?? 43岁的老人该买什么保险? 华硕主板p5b怎么在bios下查cpu温度? 华硕笔记本A52jt桌面小工具里有个看cpu温度的怎么显示不出来cpu温度呢? 飞行堡垒8怎么看CPU温度? 华硕天选怎么看cpu温度 我离婚了,房产证过户要什么资料 我家次卧室门斜对着厨房,不是正对的那种,这是风水上说的门冲吗?怎么化解? 未来家居生活趋势会是全场景AI吗? TCL C7剧院电视的全场景AI怎么使用? 哪个品牌的电视具有“全场景AI画质增强”技术? 全场景AI和家庭陪伴有什么关系? 全场景AI对单身人士有什么好处? 全场景AI真的可以学习吗? 全场景AI的陪伴是什么意思? 以前的东北五省是哪五个省份 东北原有几个省? 东北有几个省? 都是哪些? 东北地区都包括哪几个省? 1935年东北有几个省? 东北三省最早叫什么? 东北有几个省 东北有几个省,东三省是什么 东北三个省分别是什么 东北都包括那几个省份 东北包括哪几个省?有什么城市? 谁有 海参干燥工艺 方面的资料啊?谢谢! 冻干的海参为什么都是枯黄色,懂的大侠能否帮忙解答一下原理? 脱检一年多了,去年的交强险没交,今年要检车,要不要补交保险才能检吗? 车辆脱审的情况下平安的交强险能报吗? 交强险脱保的车能买吗 美国非农数据是什么?关于非农数据的重要性等相关知识越详细越好…… 美国非农数据怎么统计出来的? 蹄花汤要加什么香料 玉米猪蹄汤能合三七粉一起吃吗