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

目录
  • 阐述
  • left join的on和where的条件区别
    • 第一条SQL的过程
    • 第二条SQL的过程

阐述

写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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • sql中的left join及on、where条件关键字的区别详解

    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN. 创建两张表并插入一些

  • 解析sql语句中left_join、inner_join中的on与where的区别

    table a(id, type):id     type ----------------------------------1      1         2      1          3      2          table b(id, class):id    class ---------------------------------1      12      2sql语句1:select a.*, b.* from a left join b on a.id = b

  • mysql中left join设置条件在on与where时的用法区别分析

    本文实例讲述了mysql中left join设置条件在on与where时的用法区别.分享给大家供大家参考,具体如下: 一.首先我们准备两张表来进行测试. CREATE TABLE `a` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(32) DEFAULT '' COMMENT '名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET

  • 解析mysql left( right ) join使用on与where筛选的差异

    有这样的一个问题mysql查询使用mysql中left(right)join筛选条件在on与where查询出的数据是否有差异.可能只看着两个关键字看不出任何的问题.那我们使用实际的例子来说到底有没有差异. 例如存在两张表结构表结构1 复制代码 代码如下: drop table if EXISTS A;  CREATE TABLE A (    ID int(1) NOT NULL,    PRIMARY KEY  (ID)  ) ENGINE=MyISAM DEFAULT CHARSET=lat

  • MySQL left join操作中on和where放置条件的区别介绍

    优先级 两者放置相同条件,之所以可能会导致结果集不同,就是因为优先级.on的优先级是高于where的. 首先明确两个概念: LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在left join下,两者的区别: on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (table_nam

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

    目录 阐述 left join的on和where的条件区别 第一条SQL的过程 第二条SQL的过程 阐述 写SQL时本想通过 A left B join on and 后面的条件查出的两条记录变成一条,奈何发现还是有两条. 后来发现 join on and 不会过滤结果记录条数,只会根据 and 后的条件是否显示 B 表的记录,A 表的记录一定会显示. 不管 and 后面的是 A.id=1 还是 B.id=1,都显示出 A 表中所有的记录,并关联显示 B 中对应 A 表中 id 为 1 的记录或

  • SQL语句中JOIN的用法场景分析

    记录:256 写SQL最高境界:SELECT * FROM 表名.当然这是一句自嘲.探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟. 一.场景 把关系型数据库A中表TEST_TB01和TEST_TB02迁移到大数据平台M(MaxCompute大数据平台).TEST_TB01单表1000万条记录,TEST_TB02单表80万条记录. 在关系型数据库中,TEST_TB01和TEST_TB02中有主键约束.在产生新增业务数据时,不会存在重复数据插入.但是,当数据迁移到大数据平

  • SQL语句中不同的连接JOIN及join的用法

    为了从两个表中获取数据,我们有时会用JOIN将两个表连接起来.通常有以下几种连接方式: JOIN  or  INNER JOIN(内连接) : 这两个是相同的,要求两边表同时有对应的数据,返回行,任何一边缺失数据就不显示. LEFT JOIN(左外连接):即使右边的表中没有匹配,也从左表返回所有的行. RIGHT JOIN(右外连接):即使左边的表中没有匹配,也从右表返回所有的行. FULL JOIN(全外连接):只要其中一个表中存在匹配就返回行. 如例,有grade表(课程号sn,分数scro

  • SQL语句中EXISTS的详细用法大全

    目录 前言 一.建表 二.在SELECT语句中使用EXISTS 1.在SQL中使用EXISTS 2.在SQL中使用NOT EXISTS 3.在SQL中使用多个NOT EXISTS 4.在SQL中使用多个EXISTS 5.在SQL中使用NOT EXISTS和EXISTS 三.在DELETE语句中使用EXISTS 1.在MySQL中使用 2.在Oracle中使用 四.在UPDATE语句中使用EXISTS 1.在MySQL中使用 2.在Oracle中使用 总结 前言 在业务开展中,会遇到类似需求. 需

  • asp的SQL语句中and和or同时使用的注意事项

    今天在调试程序的时候,需要用到and or,如果不掌握技巧输出的结构与我们想象的差距有点大,这里分享一下,希望大家以后多多支持我们 asp的SQL语句中and 和or是不是不可以同时使用呢? 答案是肯定的,下面来看下方法: 1.非常负责任的告诉你,是可以同时使用的.但要看业务要求 2.使用的场景举例: 查询表中2000年和2002年出生的男同学 select * from 学生表 where 性别='男' and (出生年份=2000 or 出生年份=2002) 3.其实or可以用SQL中的In

  • sql 语句中的 NULL值

    今天写了这样的代码 复制代码 代码如下: DECLARE @atr NVARCHAR(20) SET @atr = NULL IF(@atr = NULL) BEGIN PRINT 1 END 原本是想打印出1的.但是没有. 把 代码修改成如下: DECLARE @atr NVARCHAR(20) SET @atr = NULL IF(@atr IS NULL) BEGIN PRINT 1 END 这样就正确打印出1了. 然后自己有做了如下的修改,把if语句修改成 复制代码 代码如下: IF(N

  • SQL语句中含有乘号报错的处理办法

    在ADO中,我们需要在SQL语句中使用乘法运算,可是添加'*'以后执行程序总是会出错,这是因为'*'与sql中的'*'关键字重合了,所以编译会出错. 解决办法:将乘法运算放到sql语句外面,将结果放入一个变量中,然后在sql语句中引用即可 int count = (this.AspNetPager1.CurrentPageIndex-1)*this.AspNetPager1.PageSize; string sql = " select top "+count+" E_Id

  • sql语句中如何将datetime格式的日期转换为yy-mm-dd格式

    如果在asp中我们可以用year(date())这样的格式在sql语句中,不知道这样的效率怎么样不过是个方法 复制代码 代码如下: select substring(convert(char,registdate,120),1,10) as registdate from tbuser

  • python 在sql语句中使用%s,%d,%f说明

    python连接数据库执行增删查改 mysql数据库 import pymysql postgresql数据库 import psycopg2 普通含%的python语句 sql语句中 普通sql语句 select * from tables where tablename = 'table_name' ,所以这里该加的引号还是要加 不加的情况 翻页的情况 like的情况 因为普通sql语句是 where 列名 like '4301%' 这里需要多加一个%防止转义 补充知识:python 中 s

  • SQL语句中公共字段的自动填充方法

    1. 前言 我们在设计数据库的时候一定会带上新增.更新的时间.操作者等审计信息. 之所以带这些信息是因为假如有一天公司的数据库被人为删了,尽管可能有数据库备份可以恢复数据.但是我们仍然需要追踪到这个事是谁干的,在什么时间干的,具体干了哪些事等等,方便定责和修补.但是我们变更每条数据都要去显式变更这些信息就十分繁琐,我们希望无感知的来处理这些信息. 2. 通用方式 那么有什么好的解决思路呢?在Spring Data框架中提供@CreatedBy和@LastModifiedBy来捕捉谁创建或修改的实

随机推荐