`

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

    博客分类:
  • DB
 
阅读更多

 

 

 

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

 

 

分享到:
评论

相关推荐

    left_join_on_and与left_join_on_where的区别

    left_join_on_and与left_join_on_where的区别

    sql语句join中on和where的区别

    ### SQL语句JOIN中ON和WHERE的区别 #### 引言 在SQL中,JOIN操作用于合并两个或多个表中的行。正确理解`ON`和`WHERE`子句的区别对于高效地编写查询至关重要。本文将详细解释这两者的不同,并通过具体的例子来加深...

    join on 语句及扩展

    这里我们将深入探讨几种JOIN类型及其使用,以及ON和WHERE子句的区别。 1. INNER JOIN: INNER JOIN返回两个表中匹配的记录。这意味着如果某个记录在其中一个表中没有对应的匹配项,那么这个记录就不会出现在结果集中...

    SQL _join on 和where的执行顺序1

    总结,ON和WHERE子句在JOIN操作中的作用不同:ON定义了表间连接的基础,而WHERE则对最终结果进行过滤。对于LEFT JOIN、RIGHT JOIN和FULL JOIN,ON条件的过滤是在生成中间表时进行的,而WHERE是在中间表生成后应用。...

    left join 过滤条件写在on后面和写在where 后面的区别

    ### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...

    深入Oracle的left join中on和where的区别详解

    当我们涉及到LEFT JOIN时,可能会遇到使用ON和WHERE子句的情况,两者虽然都可以用来指定条件,但在语义上有所区别。 首先,ON子句是在生成联接结果集(临时表)时应用的条件。无论ON条件是否为真,都会返回左表的...

    inner join-outer join-cross join查询方式总结

    根据连接方式的不同,可以分为内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN 和 FULL JOIN)以及交叉连接(CROSS JOIN)。下面我们将详细探讨每种连接方式的特点、适用场景及其具体的实现方法。 #### 内...

    MySQL left join操作中on和where放置条件的区别介绍

    总结一下,`ON` 和 `WHERE` 在 `LEFT JOIN` 中的主要区别在于: 1. `ON` 用于在生成临时表时定义连接条件,无论条件是否满足,都会返回左表的所有行。 2. `WHERE` 在临时表生成后进行过滤,如果它包含了连接条件,...

    sql中的left join及on、where条件关键字的区别详解

    现在,让我们来探讨`LEFT JOIN`与`WHERE`关键字的区别。`WHERE`子句通常用于在单个表格中过滤记录,而不是连接多个表格。在JOIN操作中,`WHERE`子句通常用于在连接后进一步限制结果集,它作用于整个结果集,而不仅仅...

    解析sql语句中left_join、inner_join中的on与where的区别

    总结来说,ON子句在JOIN操作中定义连接条件,而WHERE子句则在连接后对结果集进行过滤。LEFT JOIN保留左表的所有记录,即使在右表中没有匹配,而INNER JOIN只返回两表的交集。在LEFT JOIN中,WHERE子句可以进一步限制...

    解析mysql left( right ) join使用on与where筛选的差异

    在使用LEFT JOIN和RIGHT JOIN时,条件筛选可以使用ON和WHERE子句。它们之间的差异是很多人容易混淆的地方。ON子句是在连接操作中对连接条件进行指定,而WHERE子句通常用于对结果集进行过滤。由于这两者在查询的逻辑...

    【SQL】在sql server中 delete时 使用INNER JOIN

    - **数据同步**:在需要保持两个或多个表间数据一致性时,可以使用 `INNER JOIN` 来定位需要更新或删除的数据,从而确保数据的一致性和完整性。 - **复杂查询**:对于涉及多个表的复杂查询,可能需要先删除某些表中...

    深入解析on where谓词的区别

    这篇博文“深入解析on where谓词的区别”旨在帮助我们理解这两个关键字在联接(JOIN)操作和简单查询中的不同作用。 首先,让我们来看看`WHERE`子句。在SQL中,`WHERE`主要用于基本的单表查询,它在`SELECT`语句...

    on与where、group by的用法

    在进行数据库操作时,理解`ON`与`WHERE`条件的区别至关重要,尤其是在处理表连接(如`LEFT JOIN`、`INNER JOIN`等)时更为关键。这两种条件虽然都能用于限制结果集,但它们在执行时机、作用范围以及对结果的影响上...

    SQL中的left outer join,inner join,right outer join用法详解

    SELECT * FROM t_institution i RIGHT OUTER JOIN t_teller t ON i.inst_no = t.inst_no WHERE i.inst_no = "5801" 全外连接(Full Outer Join) 全外连接是将左、右两个表的全部行连接起来,例如: SELECT * ...

    sql join on 用法

    1. SELECT * FROM a LEFT JOIN b ON a.id = b.id WHERE a.id = 1 2. SELECT * FROM a LEFT JOIN b ON a.id = b.id AND a.id = 1 3. SELECT * FROM a LEFT JOIN b ON a.id = b.id AND b.id = 1 4. SELECT * FROM a ...

    SQL中JOIN的使用详解

    本文将详细介绍五种主要的`JOIN`类型:`CROSS JOIN`、`LEFT JOIN`、`RIGHT JOIN`、`INNER JOIN`、`SELF JOIN`以及`FULL JOIN`。 #### 1. CROSS JOIN (交叉连接) `CROSS JOIN`也称为交叉连接,它的作用是返回两个表...

    SQLServerUpdate多表Join

    - `FROM B INNER JOIN A ON A_ID = B.AID`: 使用 `INNER JOIN` 关联 `A` 和 `B` 两个表,基于 `A_ID` 和 `AID` 的相等关系进行连接。 - `WHERE A_ID = 2`: 更新条件为 `A` 表中的 `A_ID` 的值为 2。 #### 3. 注意...

Global site tag (gtag.js) - Google Analytics