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,但要考虑是否影响正确结果。)

 

 

你可能感兴趣的:(join on和join where的区别---》需要自己做实验待总结!!!)