left join on and 与 left join on where的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

      在使用left jion时,onwhere条件的区别如下:

1 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

       假设有两张表:

1 tab1

id size

1 10

2 20

3 30

2 tab2

size name

10 AAA

20 BBB

20 CCC


两条SQL:
1select * formtab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2select * formtab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

第一条SQL的过程:

1、中间表
on条件
tab1.size = tab2.size

tab1.id    tab1.size   tab2.size     tab2.name

1              10                  10              AAA

2             20                    20             BBB

2            20                     20              CCC

3            30                   (null)             (null)

2、再对中间表过滤
where 条件:
tab2.name=’AAA’

tab1.id      tab1.size       tab2.size     tab2.name

1                 10                 10             AAA

第二条SQL的过程:

1、中间表
on条件
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)

tab1.id      tab1.size        tab2.size       tab2.name

1              10                    10                  AAA

2              20                  (null)              (null)

3              30                   (null)                (null)

     其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回leftright表中的记录full则具有leftright的特性的并集。inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

 

 

mysql>  select * from aaa a left join bbb b on a.id = b.id and b.name = '111111111';
+------+-----------+------+-----------+
| id   | name      | id   | name      |
+------+-----------+------+-----------+
|    1 | 陈亮亮    |    1 | 111111111 |
|    1 | 福特      |    1 | 111111111 |
|    1 | bentian   |    1 | 111111111 |
|    2 | 张云霞    | NULL | NULL      |
|    3 | 陈小平    | NULL | NULL      |
|    4 | 陈小肥    | NULL | NULL      |
|    2 | 宝马      | NULL | NULL      |
|    3 | 奔驰      | NULL | NULL      |
|    4 | 奥迪      | NULL | NULL      |
|    2 | dazong    | NULL | NULL      |
|    5 | ben       | NULL | NULL      |
|    6 | da        | NULL | NULL      |
+------+-----------+------+-----------+
12 rows in set (0.01 sec)

mysql>  select * from aaa a left join bbb b on a.id = b.id where b.name = '111111111';
+------+-----------+------+-----------+
| id   | name      | id   | name      |
+------+-----------+------+-----------+
|    1 | 陈亮亮    |    1 | 111111111 |
|    1 | 福特      |    1 | 111111111 |
|    1 | bentian   |    1 | 111111111 |
+------+-----------+------+-----------+
3 rows in set (0.00 sec)

mysql>  select * from aaa a left join bbb b on a.id = b.id where a.name = 'bentian';
+------+---------+------+-----------+
| id   | name    | id   | name      |
+------+---------+------+-----------+
|    1 | bentian |    1 | 111111111 |
+------+---------+------+-----------+
1 row in set (0.00 sec)

 

mysql> select * from aaa;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 陈亮亮    |
|    2 | 张云霞    |
|    3 | 陈小平    |
|    4 | 陈小肥    |
|    1 | 福特      |
|    2 | 宝马      |
|    3 | 奔驰      |
|    4 | 奥迪      |
|    1 | bentian   |
|    2 | dazong    |
|    5 | ben       |
|    6 | da        |
+------+-----------+
12 rows in set (0.02 sec)

mysql> select * from bbb;
+------+------------+
| id   | name       |
+------+------------+
|    1 | 111111111  |
|    2 | 2222222222 |
|    3 | 3333333333 |
+------+------------+

转载于:https://www.cnblogs.com/leochenliang/p/7364665.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot高性能实现二维码扫码登录(中)——Redis版

前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降。好吧,现在回归传统方式:前端ajax每隔1秒或2秒发一次请求,去…

C# :socket 通讯基础使用实例

们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议&#xff0…

IBM发表论文:可能已找到处理量子计算退相干的方法

在《自然》杂志最近发表的一篇论文中,IBM和其他机构的研究人员设计了两种量子算法,利用变分量子电路和量子核估计器来训练一种支持向量机分类器。这两种算法背后的关键思想是使用量子状态空间作为特征空间表示,有效地构建映射,从原…

PHP + NGINX 控制视频文件播放,并防止文件下载

最简单的方法是使用NGINX的 internal 功能 server { listen 80; server_name www.xxx.com;  location / { index index.php index.html index.htm; root /xxx; if (!-e $request_filename) { rewrite ^/index.php(.*)$ /index.php?s$…

可视化调试工具

rosrun rqt_console rqt_console # 查看日志消息,可filter、highlight指定级别。 rosrun rqt_logger_level rqt_logger_level # 可设在日志记录器的严重级别 rosrun rqt_topic rqt_topic # 显示topic调试信息 rosrun rqt_publisher rqt_publisher # 在界面中管理ro…

C#:委托基础与事件

通过以下思维导图,学习委托的基本概念,后面着重讲解委托的运用,希望通过最简单的方式收获更多的知识。 1.委托的各种写法 1、委托 委托名new 委托(会调用的方法名); 委托名(参数); 2、委托 委托名 会调用…

Git Bash关键命令

1.默认目录是C:\Users\用户名 2.切换目录:$cd c:\\windows 3.切换到上级目录:cd ..,中间有空格 4.列出某目录所有文件,相当于DOS下的dir:ls c:\\windows 5.查看配置信息:git config --list 以下是显示信息 …

C#:invoke 与 BeginInvoke使用区别

invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解。 首先说下,invoke和begininvoke的使用有两种情况: 1. control中的invoke、begininvoke。…

Django基本命令

Django基本命令 1.创建一个Django 项目 django_admin.py startproject mysite当前目录下会生成mysite的工程,目录结构如下: manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。settings.py ---- 包含了项目的默认…

Git忽略规则.gitignore梳理

对于经常使用Git的朋友来说,.gitignore配置一定不会陌生。废话不说多了,接下来就来说说这个.gitignore的使用。首先要强调一点,这个文件的完整文件名就是".gitignore",注意最前面有个“.”。 一般来说每个Git项目中都需…

第二周CoreIDRAW课总结

1.这节课学到了什么知识? 学到了图像的复制,再制鼠标复制,重复,还有对象的对齐,对象的分布顺序。 2.有哪些心得体会? 做了课本的练习,会用窗口里面的泊坞窗造型命令也作出了一个作品。 3.这节课…

axios关于针对请求时长策略设计的思考

前言 在我们的业务请求中,有很多时候会针对有不同时长的需求策略性设置。这里针对这个需求进行详细的展开。 针对这种情况,我们的timout的一般是根据请求地址来的,所以核心处理技巧便是如何根据不同的request地址去设置不同的timeout. 我们之…

C#:WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务栏从而移动窗体 方法一 1.定义一个位置信息Point用于存储鼠标位置 private Point mPoint; 2.给窗体等控件增加MouseDown…

Python 字典删除元素clear、pop、popitem

同其它python内建数据类型一样,字典dict也是有一些实用的操作方法。这里我们要说的是字典删除方法:clear()、pop()和popitem(),这三种方法的作用不同,操作方法及返回值都不相同。接下来就来查看下这些字典特定方法的具体用法是什么…

reactor模式:多线程的reactor模式

上文说到单线程的reactor模式 reactor模式:单线程的reactor模式 单线程的reactor模式并没有解决IO和CPU处理速度不匹配问题,所以多线程的reactor模式引入线程池的概念,把耗时的IO操作交由线程池处理,处理完了之后再同步到selecti…

Elasticsearch实战篇——Spring Boot整合ElasticSearch

2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来探讨Spring Boot整合ElasticSearch的问题。 本文主要讲以下内容…

C#:Dockpanel的一些入门的基本操作

原文链接: 一、引用: 1.建立一个WinForm工程,默认生成了一个WinForm窗体Form1(此处默认为主窗体)。 2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll。 3.设置Form1窗体属性IsMdiContainer…

MyBatis中if,where,set标签

<if>标签 <select id"findActiveBlogWithTitleLike"resultType"Blog">SELECT * FROM BLOG WHERE state ‘ACTIVE’ <if test"title ! null">AND title like #{title}</if> </select> if标签通常伴随着where,set…

Python3基础 __repr__ 类的实例对象的名字 可以打印文字(1)

引用自&#xff1a;http://www.bubuko.com/infodetail-1918622.html 这个__repr__的作用从下边的例子中可以看出,返回实例化对象的表达 code: class MyClass() :def __str__(self) :return "我是MyClass的一个实例"def __repr__(self) :return "这回连print都省…

Day03:文件打开;错误处理

错误处理 try: #要执行的代码 except 错误的类型&#xff08;可选&#xff09;: #发生错误时执行的代码 finally: #有没有发生错误都执行的代码 复制代码with open() as 变量名&#xff1a; with提供一种叫上下文管理协议的python技术&#xff0c;系统会自动关闭文件 open() 默…