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-05-05
  • mysql数据库自动添加创建时间及更新时间

    mysql数据库自动添加创建时间及更新时间

    在实际应用中我们时常会需要用到创建时间和更新时间这两个字段,下面这篇文章主要给大家介绍了关于mysql数据库自动添加创建时间及更新时间的相关资料,需要的朋友可以参考下
    2022-05-05
  • MySQL分区之HASH分区详解

    MySQL分区之HASH分区详解

    hash分区的目的是将数据按照某列进行hash计算后更加均匀的分散到各个分区,下面这篇文章主要给大家介绍了关于MySQL分区之HASH分区的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • mysql数据备份与恢复实现方法分析

    mysql数据备份与恢复实现方法分析

    这篇文章主要介绍了mysql数据备份与恢复实现方法,结合实例形式分析了mysql数据备份与恢复常见实现方法与相关操作注意事项,需要的朋友可以参考下
    2020-04-04
  • DQL数据查询语句使用示例

    DQL数据查询语句使用示例

    DQL(Data Query Language 数据查询语言):用于查询数据库对象中所包含的数据。DQL语言主要的语句:SELECT语句。DQL语言是数据库语言中最核心、最重要的语句,也是使用频率最高的语句
    2022-12-12
  • MySQL中不能创建自增字段的解决方法

    MySQL中不能创建自增字段的解决方法

    这篇文章主要介绍了MySQL中不能创建自动增加字段的解决方法,通过本文可以解决导致auto_increament失败的问题,需要的朋友可以参考下
    2014-09-09
  • mysql中错误:1093-You can’t specify target table for update in FROM clause的解决方法

    mysql中错误:1093-You can’t specify target table for update in F

    最近在工作中遇到了一个mysql错误提示1093:You can’t specify target table for update in FROM clause,后来通过查找相关的资料解决了这个问题,现在将解决的方法分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • Mysql使用函数json_extract处理Json类型数据的方法实例

    Mysql使用函数json_extract处理Json类型数据的方法实例

    在日常业务开发中通常mysql数据库中某个字段会需要存储json格式字符串,下面这篇文章主要给大家介绍了关于Mysql使用函数json_extract处理Json类型数据的相关资料,需要的朋友可以参考下
    2022-09-09
  • mysql添加enum类型的字段实现

    mysql添加enum类型的字段实现

    Enum类型它允许我们在一个有限的选项列表中选择一个值,本文主要介绍了mysql添加enum类型的字段实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • MySQL如何解决DOS窗口乱码问题

    MySQL如何解决DOS窗口乱码问题

    这篇文章主要介绍了MySQL如何解决DOS窗口乱码问题,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11

最新评论