SQL语句中LEFT JOIN的ON和WHERE有什么区别

 更新时间:2022年12月16日 14:31:20   作者:知其黑、受其白  
这篇文章主要介绍了SQL语句中LEFT JOIN的ON和WHERE之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

阐述

写SQL时本想通过 A left B join on and 后面的条件查出的两条记录变成一条,奈何发现还是有两条。

后来发现 join on and 不会过滤结果记录条数,只会根据 and 后的条件是否显示 B 表的记录,A 表的记录一定会显示。

不管 and 后面的是 A.id=1 还是 B.id=1,都显示出 A 表中所有的记录,并关联显示 B 中对应 A 表中 id1 的记录或者B表中 id 为 1 的记录。

SELECT u.id,u.nickname,c.content FROM chat_user u
LEFT JOIN chat_communication c
on u.id=c.toid order by c.id

+----+------------------+--------------+
| id | nickname         | content      |
+----+------------------+--------------+
| 86 | 大美如斯         | NULL         |
| 88 | 悦悦             | NULL         |
| 89 | 雨薇             | NULL         |
| 87 | 大金             | 你好         |
| 85 | Love violet life | 你也好       |
| 87 | 大金             | 你在干嘛     |
| 87 | 大金             | 你还在吗     |
| 87 | 大金             | 订单         |
+----+------------------+--------------+
8 rows in set (0.00 sec)

SELECT u.id,u.nickname,c.content FROM chat_user u
LEFT JOIN chat_communication c
on u.id=c.toid and u.nickname="大金" order by c.id
+----+------------------+--------------+
| id | nickname         | content      |
+----+------------------+--------------+
| 85 | Love violet life | NULL         |
| 86 | 大美如斯         | NULL         |
| 88 | 悦悦             | NULL         |
| 89 | 雨薇             | NULL         |
| 87 | 大金             | 你好         |
| 87 | 大金             | 你在干嘛     |
| 87 | 大金             | 你还在吗     |
| 87 | 大金             | 订单         |
+----+------------------+--------------+
8 rows in set (0.00 sec)
SELECT u.id,u.nickname,c.content,c.fromname FROM chat_user u
LEFT JOIN chat_communication c
on u.id=c.toid and c.fromname="雨薇" order by c.id

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

left join的on和where的条件区别

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

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

新建两张表:

CREATE TABLE test1(id int,size int); 
INSERT INTO test1 VALUES (1,10),(2,20),(3,30); 
CREATE TABLE test2(size int,nikname varchar(10));
INSERT INTO test2 VALUES (10,"AAA"),(20,"BBB"),(20,"CCC"); 

表1:test1

mysql> select * from test1;
+------+------+
| id   | size |
+------+------+
|    1 |   10 |
|    2 |   20 |
|    3 |   30 |
+------+------+
3 rows in set (0.00 sec)

表2:test2

+------+---------+
| size | nikname |
+------+---------+
|   10 | AAA     |
|   20 | BBB     |
|   20 | CCC     |
+------+---------+
3 rows in set (0.01 sec)

第一条 SQL

SELECT * FROM test1
LEFT JOIN test2 ON (test1.size = test2.size)
WHERE test2.nikname = "AAA";
+------+------+------+---------+
| id   | size | size | nikname |
+------+------+------+---------+
|    1 |   10 |   10 | AAA     |
+------+------+------+---------+
1 row in set (0.00 sec)

第二条 SQL

select * FROM test1 left join test2 
on (test1.size = test2.size and test2.nikname="AAA");
+------+------+------+---------+
| id   | size | size | nikname |
+------+------+------+---------+
|    1 |   10 |   10 | AAA     |
|    2 |   20 | NULL | NULL    |
|    3 |   30 | NULL | NULL    |
+------+------+------+---------+
3 rows in set (0.00 sec)

第一条SQL的过程

1、中间表 on 条件 : test1.size = test2.size

+------+------+------+---------+
| id   | size | size | nikname |
+------+------+------+---------+
|    1 |   10 |   10 | AAA     |
|    2 |   20 |   20 | BBB     |
|    2 |   20 |   20 | CCC     |
|    3 |   30 | NULL | NULL    |
+------+------+------+---------+
4 rows in set (0.00 sec)

2、再对中间表过滤 where 条件:test2.nikname="AAA"

+------+------+------+---------+
| id   | size | size | nikname |
+------+------+------+---------+
|    1 |   10 |   10 | AAA     |
+------+------+------+---------+
1 row in set (0.00 sec)

第二条SQL的过程

1、中间表on条件:test1.size = test2.size and test2.nikname=’AAA’

(条件不为真也会返回左表中的记录)

+------+------+------+---------+
| id   | size | size | nikname |
+------+------+------+---------+
|    1 |   10 |   10 | AAA     |
|    2 |   20 | NULL | NULL    |
|    3 |   30 | NULL | NULL    |
+------+------+------+---------+
3 rows in set (0.00 sec)

其实以上结果的关键原因就是 left join,right join,full join 的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录。

full 则具有 left 和 right 的特性的并集。

而 inner join 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

到此这篇关于SQL语句中LEFT JOIN的ON和WHERE有什么区别的文章就介绍到这了,更多相关SQL LEFT JOIN内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 很全面的Mysql数据库、数据库表、数据基础操作笔记(含代码)

    很全面的Mysql数据库、数据库表、数据基础操作笔记(含代码)

    这篇文章主要为大家分享了很全面的Mysql数据库、数据库表、数据基础操作笔记,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 防止mysql重复插入记录的方法

    防止mysql重复插入记录的方法

    这篇文章主要为大家详细介绍了防止mysql重复插入记录的方法,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 一台服务器部署两个独立的mysql数据库操作实例

    一台服务器部署两个独立的mysql数据库操作实例

    这篇文章主要给大家介绍了关于一台服务器部署两个独立的mysql数据库的相关资料,同一台服务器装两个数据库,可以通过虚拟化技术实现,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • mysql5.7大量sleep进程常规处理方式及配置示例

    mysql5.7大量sleep进程常规处理方式及配置示例

    这篇文章主要给大家介绍了关于mysql5.7大量sleep进程常规处理方式及配置的相关资料,sleep连接过多会严重消耗mysql服务器资源(主要是cpu,内存),并可能导致mysql崩溃,需要的朋友可以参考下
    2023-08-08
  • MySQL OOM 系统二 OOM Killer

    MySQL OOM 系统二 OOM Killer

    前面一节重点分享了Linux的内存分配策略,基于上述的分配策略,为了规避超售的风险,Linux采了一种OOM Killer的机制,即系统可用内存(包括Swap)即将使用完之前,选择性的Kill掉一些进程以求释放一些内存
    2016-07-07
  • Mysql并发常见的死锁及解决方法

    Mysql并发常见的死锁及解决方法

    死锁是在并发执行的过程中,两个或多个事务相互等待对方释放资源的情况,本文主要介绍了Mysql并发常见的死锁及解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • mysql数据库replace、regexp的用法

    mysql数据库replace、regexp的用法

    mysql数据库中replace、regexp的用法,主要是通过sql语句实现数据的替换,使用mysql的朋友可以参考下。
    2011-08-08
  • 数据库设计工具MySQL Workbench使用教程(超级详细!)

    数据库设计工具MySQL Workbench使用教程(超级详细!)

    MySQL Workbench为数据库管理员、程序开发者和系统规划师提供可视化的Sql开发、数据库建模、以及数据库管理功能,下面这篇文章主要给大家介绍了关于MySQL设计工具Workbench使用的相关资料,需要的朋友可以参考下
    2023-02-02
  • MySQL8自增主键变化图文详解

    MySQL8自增主键变化图文详解

    众所周知MySQL 的主键可以是自增的,下面这篇文章主要给大家介绍了关于MySQL8自增主键变化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 开发人员为什么必须要了解数据库锁详解

    开发人员为什么必须要了解数据库锁详解

    这篇文章主要给大家介绍了关于开发人员为什么必须要了解数据库锁的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用数据库具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03

最新评论