join on和join where的区别---》需要自己做实验待总结!!!

 

 

 

运行平台:Mysql 
目的:比较join......on 后面的and 和where的区别 

1)建表 
创建A表 

Java代码    收藏代码
  1. SET FOREIGN_KEY_CHECKS=0;  
  2.   
  3. -- ----------------------------  
  4. -- Table structure for `a`  
  5. -- ----------------------------  
  6. DROP TABLE IF EXISTS `a`;  
  7. CREATE TABLE `a` (  
  8.   `id` decimal(10,0) NOT NULL DEFAULT '0',  
  9.   `link` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,  
  10.   `a_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,  
  11.   PRIMARY KEY (`id`)  
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;  
  13.   
  14. -- ----------------------------  
  15. -- Records of a  
  16. -- ----------------------------  
  17. INSERT INTO `a` VALUES ('1''1''jack');  
  18. INSERT INTO `a` VALUES ('2''1''jack');  
  19. INSERT INTO `a` VALUES ('3''1''leo');  



创建B表 

Java代码    收藏代码
  1. SET FOREIGN_KEY_CHECKS=0;  
  2.   
  3. -- ----------------------------  
  4. -- Table structure for `b`  
  5. -- ----------------------------  
  6. DROP TABLE IF EXISTS `b`;  
  7. CREATE TABLE `b` (  
  8.   `id` decimal(10,0) NOT NULL DEFAULT '0',  
  9.   `link` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,  
  10.   `b_name` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,  
  11.   PRIMARY KEY (`id`)  
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;  
  13.   
  14. -- ----------------------------  
  15. -- Records of b  
  16. -- ----------------------------  
  17. INSERT INTO `b` VALUES ('1''1''frowna');  
  18. INSERT INTO `b` VALUES ('2''1''frowna');  
  19. INSERT INTO `b` VALUES ('3''1''kiki');  



2)比较下面的运行结果 

Java代码    收藏代码
  1. select * from A left join B on A.link =B.link where A.a_name='jack'  
  2. 和  
  3. select * from A left join B on A.link =B.link and A.a_name='jack'  



 

Java代码    收藏代码
  1. select * from A inner join B on A.link =B.link where A.a_name='jack'  
  2. 和  
  3. select * from A inner join B on A.link =B.link and A.a_name='jack'  



 

Java代码    收藏代码
  1. select * from A right join B on A.link =B.link where A.a_name='jack'  
  2. 和  
  3. select * from A right join B on A.link =B.link and A.a_name='jack'  



 

Java代码    收藏代码
  1. select * from A right join B on A.link =B.link where A.a_name is null  
  2. 和  
  3. select * from A right join B on A.link =B.link and A.a_name is null   



3)结论 
3.1) where 是在两个表join完成后,再附上where条件。 
 

Java代码    收藏代码
  1. select * from (select A.a_name,B.b_name from A left join B on A.link =B.link)t where t.a_name='jack';  
  2. 等价为  
  3. select A.a_name,B.b_name from A left join B on A.link =B.link  where A.a_name='jack'  



3.2) 
而 and 则是在表连接前过滤A表或B表里面哪些记录符合连接条件,同时会兼顾是left join还是right join。即 
假如是左连接的话,如果左边表的某条记录不符合连接条件,那么它不进行连接,但是仍然留在结果集中(此时右边部分的连接结果为NULL)。 

3.3)建议尽量用where来过滤条件,以避免复杂的逻辑考虑。(除非在某些情况下(后接其他sql语句),用and会报错,才用and,但要考虑是否影响正确结果。)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值