iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql 的join on上的过滤和在where上过滤的区别
  • 652
分享到

Mysql 的join on上的过滤和在where上过滤的区别

Mysql的joinon上的过滤和在where上过滤的区别 2016-11-01 16:11:00 652人浏览 猪猪侠
摘要

测试如下: (1)创建两张表,并插入数据,sql语句如下: a表: CREATE TABLE `a` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50

Mysql 的join on上的过滤和在where上过滤的区别

测试如下:

(1)创建两张表,并插入数据,sql语句如下:

a表:

CREATE TABLE `a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT "",
  `grade` int(11) DEFAULT NULL,
  `dept` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  CHARSET=utf8mb4


insert into `a` (`id`, `name`, `grade`, `dept`) values("1","LIJIE1","100","10");
insert into `a` (`id`, `name`, `grade`, `dept`) values("2","LIJIE2","90","20");
insert into `a` (`id`, `name`, `grade`, `dept`) values("3","LIJIE3","60","10");
insert into `a` (`id`, `name`, `grade`, `dept`) values("4","LIJIE4","80","10");
insert into `a` (`id`, `name`, `grade`, `dept`) values("5","LIJIE5","70","20");

b表:

CREATE TABLE `b` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8mb4

insert into `b` (`id`, `NAME`) values("10","IT");
insert into `b` (`id`, `NAME`) values("20","IT2");

表数据显示:

a表:

id  name    grade   dept
1   lijie1  100     10
2   lijie2  90      20
3   lijie3  60      10
4   lijie4  80      10
5   lijie5  70      20

b表:

id  name
10  IT1
20  IT2

(2)left join 中on和where条件的对比

1.两张表join并且筛选分数大于等于80的,条件放在join on上面

select 
    A.id,A.name,A.grade,A.dept,B.id,B.name 
from
    A left outer join B
on
    A.dept = B.id 
and 
    A.grade >=80 

查询结果:

2.两张表join并且筛选分数大于等于80的,条件放在where上面

select 
    A.id,A.name,A.grade,A.dept,B.id,B.name 
from
    A left outer join B
on
    A.dept = B.id
where
    A.grade >=80 

查询结果:

  • 结论

当把过滤条件写在left join on上面会让基表所有数据都能显示(不管是否在on条件中如何限定了基表,最多只对基表进行分组,而不是过滤,即不论on条件中如果限制基表,基表的记录都会显示,但是on中会过滤非基表的记录)不满足条件的右表会以null填充,当过滤条件写在where上只会让符合筛选条件的数据显示。

多表join时条件写在where和on的区别(总结篇)

开发过程中经常遇到这种情况:
多表关联join时,到底限制的条件是写在where后面效率高还是写在on后面,又或者是先对表过滤使表的数据量减少,到底这三种效率哪种更高,看了一堆网上说的,都没有说到具体点上,现在对这三种情况专门做以下详细说明,你就会明白到底是怎么回事了

干货总结:(以下只适用于left join,right join,full join,不适合inner join)
1、left join where + 基表过滤条件:先对基表执行过滤,然后进行left join;
2、left join where + 被关联表过滤条件:先执行left join,然后执行关联表的过滤条件;
3、left join on+基表过滤条件:满足过滤的基表记录执行left join,不满足的基表记录后面补null,然后两集合并一起;
4、left join on+被关联表过滤条件:先执行被关联表的过滤条件,然后执行left join;

示例:

sql:

CREATE TABLE app_test_01 (
	id INT AUTO_INCREMENT PRIMARY KEY,
	city VARCHAR(50) DEFAULT ""
)

INSERT INTO app_test_01 VALUES
(NULL,"北京"),(NULL,"上海"),(NULL,"深圳"),(NULL,"上海"),(NULL,"湖南"),(NULL,"湖北"),(NULL,"武汉");


CREATE TABLE app_test_02 (
	id INT AUTO_INCREMENT PRIMARY KEY,
	stu VARCHAR(50) DEFAULT "",
	city VARCHAR(50) DEFAULT ""
)

INSERT INTO app_test_02 VALUES
(NULL,"一","北京"),(NULL,"二","北京"),
(NULL,"三","上海"),(NULL,"四","北京"),
(NULL,"五","深圳"),(NULL,"六","深圳"),
(NULL,"七","湖南"),(NULL,"八","湖北");

on和where对比:

一、第一种情况:

(1)表条件写在where后面:

SELECT 
  a.id,
  b.stu 
FROM
  app_test_01 a 
  LEFT JOIN app_test_02 b 
    ON a.id = b.id 
WHERE a.`city` = "深圳" ;

结果:

(2)先对基表进行过滤,然后关联

SELECT 
  a.id,
  b.stu 
FROM
  (SELECT 
    id 
  FROM
    app_test_01 
  WHERE city = "深圳") a 
  LEFT JOIN app_test_02 b 
    ON a.id = b.id ;

结果:

这两种写法的执行顺序是一样的都是先执行过滤,然后执行关联;所以运行效率是一样的!

二、第二种情况

(1)where条件放基表

SELECT 
  a.id,
  b.stu 
FROM
  app_test_01 a 
  LEFT JOIN app_test_02 b 
    ON a.id = b.id
    WHERE a.city = "深圳";

结果:

(2)where条件放关联表

SELECT 
  a.id,
  b.stu 
FROM
  app_test_01 a 
  LEFT JOIN app_test_02 b 
    ON a.id = b.id 
WHERE b.city = "深圳" ;

结果:

第一种执行顺序:<1>先对a表进行where过滤,<2>再对过滤后的a表与b表进行关联
第二种执行顺序:<1>先a表和b表进行关联,<2>再对关联的结果执行where后面b表的条件

三、第三种情况

(1)第一种:基表过滤条件写where后面

SELECT 
  a.id,
  b.stu 
FROM
  app_test_01 a 
  LEFT JOIN app_test_02 b 
    ON a.id = b.id 
WHERE a.city = "深圳" ;

结果:

(2)第二种:基表条件写on后面

SELECT 
  a.id,
  b.stu 
FROM
  app_test_01 a 
  LEFT JOIN app_test_02 b 
    ON a.id = b.id 
    AND a.city = "深圳" ;

结果:

(3)第三种情况:基表过滤条件和被关联表的过滤条件都写在on后面

SELECT 
  a.id,
  b.stu 
FROM
  app_test_01 a 
  LEFT JOIN app_test_02 b 
    ON a.id = b.id 
    AND a.city = "深圳" 
    AND b.`city` = "深圳" 

结果:

第一种执行顺序是:

    <1>先对a表执行过滤条件,
    <2>然后过滤后的a表和b表进行关联;
第二种执行顺序:

<1>先使用a.city="深圳"的过滤条件将a表分为两部分,一部分满足过滤条件,一部分不满足过滤条件(即on后面基表的条件只是用来和被关联表进行关联),
<2>对满足条件的与b表关联,不满足条件的后面字段补null,然后将满足和不满足的两部分集union起来成最后结果集;

第三种执行顺序:

<1>先对b表进行b.city=‘上海’条件对b表进行过滤,
<2>使用a.city="深圳"条件将a表分为满足和不满足条件的两部分集
<3>对满足集合与过滤后的b表进行关联,不满足集后面字段直接补null,最后将两个集合union起来成最终结果集

 

以上都是经过查看执行计划并且经过具体测试得出的结论,所以针对不同的业务场景可以选择不同的写法来提高执行效率。

我相信有了上面几种情况的掌握,无论在怎么添加条件,都能很快的判断出代码的执行顺序!!!

您可能感兴趣的文档:

--结束END--

本文标题: Mysql 的join on上的过滤和在where上过滤的区别

本文链接: https://www.lsjlt.com/news/6293.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL中过滤条件放on和where中的区别有哪些
    这篇文章主要介绍SQL中过滤条件放on和where中的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!join过程可以这样理解:首先两个表做一个笛卡尔积,on后面的...
    99+
    2024-04-02
  • mysql中where和on的区别
    where 和 on 在 mysql 中的区别是:用法:where 用于过滤记录,而 on 用于连接表。语句:where 用在 select、up...
    99+
    2024-05-01
    mysql
  • sql中on和where的区别
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • MYSQL之on和where的区别解读
    目录on和where的区别区别on & where条件区别和执行顺序一、案例二、on、where、having 区别以及顺序三、优化分析总结on和where的区别...
    99+
    2023-03-20
  • MYSQL之on和where的区别是什么
    这篇“MYSQL之on和where的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MYSQL之on和wh...
    99+
    2023-07-05
  • mysql left join的基本用法以及on与where的区别
    前言 我们在写sql语句的时候,总是无法避免使用到连接关键词,比如内连接、外连接。种类是很多的,我在这里贴上一张在别处找到的图: 这张图我认为是非常详细了,它展示出了SQL语句中常见的链接类型,以本文中的left jo...
    99+
    2023-05-05
    mysql left join
  • sql的join和where有什么区别
    小编给大家分享一下sql的join和where有什么区别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!join关键字的...
    99+
    2024-04-02
  • 过滤器和拦截器的区别
    文章目录 一、拦截器和过滤器的区别1、过滤器1、实现方式2、应用场景 2、拦截器1、实现方式2、应用场景 总结 一、拦截器和过滤器的区别 过滤器和拦截器触发时机不一样,过...
    99+
    2023-09-12
    servlet java spring
  • MySQL left join操作中on和where放置条件的区别有哪些
    这篇文章给大家分享的是有关MySQL left join操作中on和where放置条件的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。优先级两者放置相同条件,...
    99+
    2024-04-02
  • Spring拦截器和过滤器的区别在哪?
    目录一、概述二、拦截器和过滤器介绍2.1 过滤器 (Filter)2.2 拦截器 (Interceptor)2.3 主要区别三、拦截器和过滤器的区别3.1 实现原理不同3.2 使用范...
    99+
    2024-04-02
  • Mysql中where与on的区别是什么
    这篇文章主要讲解了“Mysql中where与on的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql中where与on的区别是什么”吧!之前在写连表查询的...
    99+
    2023-06-20
  • Mysql中关于on,in,as,where的区别
    目录Mysql on,in,as,where的区别Mysql语句问题解决1、left join数据筛选问题2、相同数据重复筛选使用问题3、根据某个字段排序取每个类别最后三条...
    99+
    2023-03-20
    Mysql中on Mysql中in Mysql中as Mysql中where
  • mysql中left join设置条件在on与where时的用法区别分析
    本文实例讲述了mysql中left join设置条件在on与where时的用法区别。分享给大家供大家参考,具体如下: 一、首先我们准备两张表来进行测试。 CREATE TABLE `a` ( ...
    99+
    2024-04-02
  • Mysql中on,in,as,where的区别是什么
    这篇文章主要讲解了“Mysql中on,in,as,where的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql中on,in,as,where的区别是什么...
    99+
    2023-07-05
  • MySQL查询条件中on和where的区别是什么
    今天就跟大家聊聊有关MySQL查询条件中on和where的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。MySQL 语句执行顺序...
    99+
    2024-04-02
  • mysql中where和having的区别
    where 子句过滤行,应用于分组前;having 子句过滤组,应用于分组后且可使用组聚合函数的结果。 WHERE 与 HAVING 子句的区别 在...
    99+
    2024-05-02
    mysql 聚合函数
  • sql中的left join及on、where条件关键字的区别详解
    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 LEFT JOIN 关键字语法 SELECT co...
    99+
    2024-04-02
  • 过滤器和拦截器的区别有哪些
    这篇文章主要讲解了“过滤器和拦截器的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“过滤器和拦截器的区别有哪些”吧!Filter的使用首先,要使用F...
    99+
    2024-04-02
  • Java拦截器和过滤器的区别分析
    目录一、过滤器(filter)二、拦截器(interceptor)三、拦截器与过滤器的区别 四、详细说明 一、过滤器(filter) 过滤器处于客户端与Web资源(Servlet、J...
    99+
    2024-04-02
  • 过滤器和拦截器的区别是什么
    本篇内容介绍了“过滤器和拦截器的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们在项目中同时配置 拦截器 和 过滤器。过滤器的配...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作