运行平台:Mysql
目的:比较join......on 后面的and 和where的区别
1)建表
创建A表
- SET FOREIGN_KEY_CHECKS=0;
- -- ----------------------------
- -- Table structure for `a`
- -- ----------------------------
- DROP TABLE IF EXISTS `a`;
- CREATE TABLE `a` (
- `id` decimal(10,0) NOT NULL DEFAULT '0',
- `link` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
- `a_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
- -- ----------------------------
- -- Records of a
- -- ----------------------------
- INSERT INTO `a` VALUES ('1', '1', 'jack');
- INSERT INTO `a` VALUES ('2', '1', 'jack');
- INSERT INTO `a` VALUES ('3', '1', 'leo');
创建B表
- SET FOREIGN_KEY_CHECKS=0;
- -- ----------------------------
- -- Table structure for `b`
- -- ----------------------------
- DROP TABLE IF EXISTS `b`;
- CREATE TABLE `b` (
- `id` decimal(10,0) NOT NULL DEFAULT '0',
- `link` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
- `b_name` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
- -- ----------------------------
- -- Records of b
- -- ----------------------------
- INSERT INTO `b` VALUES ('1', '1', 'frowna');
- INSERT INTO `b` VALUES ('2', '1', 'frowna');
- INSERT INTO `b` VALUES ('3', '1', 'kiki');
2)比较下面的运行结果
- select * from A left join B on A.link =B.link where A.a_name='jack'
- 和
- select * from A left join B on A.link =B.link and A.a_name='jack'
- select * from A inner join B on A.link =B.link where A.a_name='jack'
- 和
- select * from A inner join B on A.link =B.link and A.a_name='jack'
- select * from A right join B on A.link =B.link where A.a_name='jack'
- 和
- select * from A right join B on A.link =B.link and A.a_name='jack'
- select * from A right join B on A.link =B.link where A.a_name is null
- 和
- select * from A right join B on A.link =B.link and A.a_name is null
3)结论
3.1) where 是在两个表join完成后,再附上where条件。
即
- 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';
- 等价为
- 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的区别
### SQL语句JOIN中ON和WHERE的区别 #### 引言 在SQL中,JOIN操作用于合并两个或多个表中的行。正确理解`ON`和`WHERE`子句的区别对于高效地编写查询至关重要。本文将详细解释这两者的不同,并通过具体的例子来加深...
这里我们将深入探讨几种JOIN类型及其使用,以及ON和WHERE子句的区别。 1. INNER JOIN: INNER JOIN返回两个表中匹配的记录。这意味着如果某个记录在其中一个表中没有对应的匹配项,那么这个记录就不会出现在结果集中...
总结,ON和WHERE子句在JOIN操作中的作用不同:ON定义了表间连接的基础,而WHERE则对最终结果进行过滤。对于LEFT JOIN、RIGHT JOIN和FULL JOIN,ON条件的过滤是在生成中间表时进行的,而WHERE是在中间表生成后应用。...
### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...
当我们涉及到LEFT JOIN时,可能会遇到使用ON和WHERE子句的情况,两者虽然都可以用来指定条件,但在语义上有所区别。 首先,ON子句是在生成联接结果集(临时表)时应用的条件。无论ON条件是否为真,都会返回左表的...
根据连接方式的不同,可以分为内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN 和 FULL JOIN)以及交叉连接(CROSS JOIN)。下面我们将详细探讨每种连接方式的特点、适用场景及其具体的实现方法。 #### 内...
总结一下,`ON` 和 `WHERE` 在 `LEFT JOIN` 中的主要区别在于: 1. `ON` 用于在生成临时表时定义连接条件,无论条件是否满足,都会返回左表的所有行。 2. `WHERE` 在临时表生成后进行过滤,如果它包含了连接条件,...
现在,让我们来探讨`LEFT JOIN`与`WHERE`关键字的区别。`WHERE`子句通常用于在单个表格中过滤记录,而不是连接多个表格。在JOIN操作中,`WHERE`子句通常用于在连接后进一步限制结果集,它作用于整个结果集,而不仅仅...
总结来说,ON子句在JOIN操作中定义连接条件,而WHERE子句则在连接后对结果集进行过滤。LEFT JOIN保留左表的所有记录,即使在右表中没有匹配,而INNER JOIN只返回两表的交集。在LEFT JOIN中,WHERE子句可以进一步限制...
在使用LEFT JOIN和RIGHT JOIN时,条件筛选可以使用ON和WHERE子句。它们之间的差异是很多人容易混淆的地方。ON子句是在连接操作中对连接条件进行指定,而WHERE子句通常用于对结果集进行过滤。由于这两者在查询的逻辑...
- **数据同步**:在需要保持两个或多个表间数据一致性时,可以使用 `INNER JOIN` 来定位需要更新或删除的数据,从而确保数据的一致性和完整性。 - **复杂查询**:对于涉及多个表的复杂查询,可能需要先删除某些表中...
这篇博文“深入解析on where谓词的区别”旨在帮助我们理解这两个关键字在联接(JOIN)操作和简单查询中的不同作用。 首先,让我们来看看`WHERE`子句。在SQL中,`WHERE`主要用于基本的单表查询,它在`SELECT`语句...
在进行数据库操作时,理解`ON`与`WHERE`条件的区别至关重要,尤其是在处理表连接(如`LEFT JOIN`、`INNER 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 * ...
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 ...
本文将详细介绍五种主要的`JOIN`类型:`CROSS JOIN`、`LEFT JOIN`、`RIGHT JOIN`、`INNER JOIN`、`SELF JOIN`以及`FULL JOIN`。 #### 1. CROSS JOIN (交叉连接) `CROSS 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. 注意...