运行平台: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的区别以及其原理
Join on/inner join on/full join on/full outer join on/left join on/right join on/cross join on; 在使用jion时,on和where条件的区别;
本篇文章是对Oracle的left join中on和where的区别进行了详细的分析介绍,需要的朋友参考下
left join 过滤条件写在on后面和写在where 后面的区别
1、 on条件是在成临时表时使的条件,它不管on中的条件是否为真,都 2、where条件是在临时表成好后,再对临时表进过滤的条件 1、中间表 2、再对中间表过滤
优先级 ...在left join下,两者的区别: on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (table_name1) 的行。 where则是在生成临时表之后使用的条件,此时已经不管是否使
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。这篇文章主要介绍了sql中的left join以及on、where关键字的区别,需要的朋友可以参考下
有这样的一个问题mysql查询使用mysql中left(right)join筛选条件在on与where查询出的数据是否有差异。可能只看着两个关键字看不出任何的问题。那我们使用实际的例子来说到底有没有差异。例如存在两张表结构表结构1...
主要介绍了mysql中left join设置条件在on与where时的用法区别,结合实例形式分析了mysql中left join设置条件在on与where时的相关用法区别与操作注意事项,需要的朋友可以参考下
ON 子句与 WHERE 子句的不同 一种更好地理解带有 WHERE … IS NULL 子句的复杂匹配条件的简单方法 Matching-Conditions 与 Where-conditions 的不同 关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(...
IEEE论文Abstract—Similarity join processing in the streaming environment has many practical applications such as sensor networks, object tracking and monitoring, and so on. Previous works usually ...
[t0].[Discontinued] FROM [dbo].[Products] AS [t0] LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID] WHERE ([t1].[Country] = @p0) AND ([t0].[UnitsInStock] = @p1) -- @p0...
以下是对在sql语句中left_join、inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下
内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。 内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理 块式管理:把主存分为一大块、一大块的,当所需的程序片断...
68、select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal); --两张表的连接 此种写法比用where更清晰 69、select ename, dname, grade from emp e join dept d on(e.deptno =...