精华内容
下载资源
问答
  • 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时...

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

    在使用left jion时,on和where条件的区别如下:

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

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

    eg:

    创建表语句:

    tab1:
    insert into tab1 (id, size) values (1, '10');
    insert into tab1 (id, size) values (2, '20');
    insert into tab1 (id, size) values (3, '30');
    insert into tab1 (id, size) values (4, '11');
    
    tab2:
    insert into tab2 (id, size, name) values (1, '10', 'aaa');
    insert into tab2 (id, size, name) values (2, '20', 'bbb');
    insert into tab2 (id, size, name) values (3, '20', 'ccc');
    

     

    表1

    select * from tab1;

    id

    size

    1

    10

    2

    20

    3

    30

    4

    11

    表2

    select * from tab2;

    size

    name

    10

    aaa

    20

    bbb

    20

    ccc

     

    分析下面两条 sql

    select * from tab1 left join tab2 on (tab1.size = tab2.size)where tab2.name='aaa';

     


    select * from tab1 left join tab2 on (tab1.size = tab2.sizeand tab2.name='aaa');

     

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

    总结:

    1. 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面

    2. 对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。

     

    on后可跟多个条件,语法如下:

    SELECT
                        *
                    FROM
                        dws.dws_t_result_tmp2 tmp2
                    LEFT JOIN
                       ods.ods_t_tmp1 tmp_a
                    ON
                        (tmp2.branchno='WE-BEIJING-1') and ( tmp2.branchno='RE-BEIJING-1')

    on后边加like:

    select position_name,code,senior_name,parent_code,level from position_name_data pnd right join senior_function_data sfd on regexp_replace(sfd.senior_name,'\\\\','/') like  concat('%',regexp_replace(pnd.position_name,'\\\\','/'),'%')  where senior_name is not null group by position_name,code,senior_name,parent_code,level

     

    参考:

    https://www.2cto.com/database/201709/683213.html

    https://www.2cto.com/database/201805/742735.html

    展开全文
  • left join中 on 和where区别

    千次阅读 2019-01-28 18:06:25
    而往往在使用左右连接时,筛选条件on和where在使用时容易出错,这次我们就以left join为例,简单讲述下on和where的用法。 首先我们要清楚左右连接的原理:在通过连接两张或多张表来返回记录时,都会生成一张中间的...

    当我们查询数据库时会经常关联多张表查询,这就使用到了左右连接,即left join、rigth join....。
    而往往在使用左右连接时,筛选条件on和where在使用时容易出错,这次我们就以left join为例,简单讲述下on和where的用法。

    首先我们要清楚左右连接的原理:在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

    on和where的用法:

    1.left join 左连接:展示左表所有数据,右表符合on条件的数据,右表不符合的则为空显示。

    2.where条件:在生成临时表基础上,再加条件限制。

    准备两张测试表bbb和bbb1来具体说明下:

    bbb表结构如下:

    id    age
    1    18
    2    19
    3    20

    bbb1表结构如下:

    id    name
    1    小米
    8    锤子
    10    苹果

     

    执行sql语句:

    1.select * from bbb b left join bbb1  b1 on b.id = b1.id ;

    左表的数据都会展示出来,并展示右表中满足on条件的

    id    age    id1    name
    1    18       1      小米
    2    19     null    null
    3    20     null    null

    2.select * from bbb b left join bbb1  b1 on b.id = b1.id and b1.name='小米';

    左表的数据都会展示出来,并展示右表中id、name满足条件的

    id    age    id1    name
    1    18       1      小米
    2    19      null   null  
    3    20      null   null    

    select * from bbb b left join bbb1  b1 on b.id = b1.id and b1.name='苹果';

    左表的数据都会展示出来,右表中id、name都满足条件的无,就会显示null

    id    age      id1    name
    1    18        null     null   
    2    19        null     null   
    3    20        null     null   

    3.select * from bbb b left join bbb1  b1 on b.id = b1.id where b1.name='小米';

    先产生一张临时表,如下:

    id    age    id1    name
    1    18       1      小米
    2    19     null    null
    3    20     null    null

    再用where条件过滤,只有一条符合,如下显示。

    id    age    id1    name
    1    18       1      小米

     

    end~~~~~

    不足之处,请指正,谢谢!

     

    展开全文
  • left join inner join on 和where区别

    千次阅读 2019-04-20 09:57:20
    在使用left join 时,on和where条件的区别: 1:on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2:where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经...

    在使用left join 时,on和where条件的区别:
    1:on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
    2:where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
    3: inner join是在生成临时表以后再进行过滤的,而且对左表和右表都起作用。

    员工表:
    在这里插入图片描述
    部门表:
    在这里插入图片描述
    查询:

    select * from dept left join emp on dept.deptno = emp.deptno;
    +----+--------+--------+----+------+-----+--------+
    | id | deptno | name   | id | name | sex | deptno |
    +----+--------+--------+----+------+-----+--------+
    |  2 |      2 | 运营部 |  1 | 小张 | 男  |      2 |
    |  1 |      1 | 技术部 |  2 | 小王 | 男  |      1 |
    |  3 |      3 | 市场部 |  3 | 小李 | 女  |      3 |
    |  1 |      1 | 技术部 |  4 | 小杨 | 男  |      1 |
    |  1 |      1 | 技术部 |  5 | 小郑 | 男  |      1 |
    +----+--------+--------+----+------+-----+--------+
    
    
    
    
    select * from dept left join emp on dept.deptno = emp.deptno and emp.sex ='男';
    +----+--------+--------+------+------+------+--------+
    | id | deptno | name   | id   | name | sex  | deptno |
    +----+--------+--------+------+------+------+--------+
    |  2 |      2 | 运营部 |    1 | 小张 | 男   |      2 |
    |  1 |      1 | 技术部 |    2 | 小王 | 男   |      1 |
    |  1 |      1 | 技术部 |    4 | 小杨 | 男   |      1 |
    |  1 |      1 | 技术部 |    5 | 小郑 | 男   |      1 |
    |  3 |      3 | 市场部 | NULL | NULL | NULL | NULL   |
    +----+--------+--------+------+------+------+--------+
    
    on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。显然左连接再加上新的条件:emp.sex='男’,筛选第五行记录。
    
    
    Where:
    
     select * from dept left join emp on dept.deptno = emp.deptno where emp.
    sex ='男';
    +----+--------+--------+----+------+-----+--------+
    | id | deptno | name   | id | name | sex | deptno |
    +----+--------+--------+----+------+-----+--------+
    |  1 |      1 | 技术部 |  2 | 小王 | 男  |      1 |
    |  1 |      1 | 技术部 |  4 | 小杨 | 男  |      1 |
    |  1 |      1 | 技术部 |  5 | 小郑 | 男  |      1 |
    |  2 |      2 | 运营部 |  1 | 小张 | 男  |      2 |
    +----+--------+--------+----+------+-----+--------+
    where是生成临时表以后再进行过滤,对左右表都进行筛选。而and后面的语句如果是对left join中的左表进行过滤将不起任何作用,对右表进行过滤的话,那么左表还是返回所有行,只是右表会被过滤掉一部分行。
    
    
    inner join  
       select * from dept inner join emp on dept.deptno = emp.deptno and emp.sex ='男';
    +----+--------+--------+----+------+-----+--------+
    | id | deptno | name   | id | name | sex | deptno |
    +----+--------+--------+----+------+-----+--------+
    |  1 |      1 | 技术部 |  2 | 小王 | 男  |      1 |
    |  1 |      1 | 技术部 |  4 | 小杨 | 男  |      1 |
    |  1 |      1 | 技术部 |  5 | 小郑 | 男  |      1 |
    |  2 |      2 | 运营部 |  1 | 小张 | 男  |      2 |
    +----+--------+--------+----+------+-----+--------+
      
    select * from dept inner join emp on dept.deptno = emp.deptno where emp.sex ='男';
    +----+--------+--------+----+------+-----+--------+
    | id | deptno | name   | id | name | sex | deptno |
    +----+--------+--------+----+------+-----+--------+
    |  1 |      1 | 技术部 |  2 | 小王 | 男  |      1 |
    |  1 |      1 | 技术部 |  4 | 小杨 | 男  |      1 |
    |  1 |      1 | 技术部 |  5 | 小郑 | 男  |      1 |
    |  2 |      2 | 运营部 |  1 | 小张 | 男  |      2 |
    +----+--------+--------+----+------+-----+--------+
    内连接inner join on and 或者on where不管是对左表还是右表进行过滤,实际都是在生成临时表以后再进行过滤的,而且对左表和右表都起作用,这与左连接left join有本质的区别!!
    
    
    
    展开全文
  • 说道四种连接,就不得不提关于他们在指令操作上的区别 这四种连接都是为了把两个表合成一个表,这两个表呢,其中至少应该有一列的数据属性是相同的,在下面的两个表中,列属性包含id,size,name。那么这两个表共有...

    说道四种连接,就不得不提关于他们在指令操作上的区别

    这四种连接都是为了把两个表合成一个表,这两个表呢,其中至少应该有一列的数据属性是相同的,在下面的两个表中,列属性包含id,size,name。那么这两个表共有属性的列是size,那么久针对这一列的属性把两个表合并的操作就是连接

    表1:tab1

    idsize
    110
    220
    330

    表2:tab2

    sizename
    10AAA
    20BBB
    20CCC

    内连接:关键字:inner join

    select * from employees e inner join department d 
    on e.employee_id = d.department_id  where e.employee_id = "1";
    等价于
    select * from employees e,department d 
    where e.employee_id = d.department_id and e.employee_id = "1";

     这两句第一个关键字为inner join on也就是内连接

    第二句关键字为where

    这两者在实际上是没有区别的,但若是没有了inner,区别就打了。这个问题之后再说,现在先说这四种连接

    举例如下:


                     

    图2:B表数据
    图1:A表数据          

    为了把Bid和Aid加以区分,不让大家有误解,所以把Bid的起始种子设置为100。有SQL基本知识的人都知道,两个表要做连接,就必须有个连接字段,从上表中的数据可以看出,在A表中的Aid和B表中的Bnameid就是两个连接字段。下图3说明了连接的所有记录集之间的关系:

                 

    图3:连接关系图 
    现在我们对内连接和外连接一一讲解。 1.内连接:利用内连接可获取两表的公共部分的记录,即图3的记录集C 语句如下:Select * from A JOIN B ON A.Aid=B.Bnameid 运行结果如下图4所示:其实select * from A,B where A.Aid=B.Bnameid与Select * from A JOIN B ON A.Aid=B.Bnameid的运行结果是一样的。 

     

     
    图4:内连接数据

     

     2.外连接:外连接分为两种,一种是左连接(Left JOIN)和右连接(Right JOIN)
      

     (1)左连接(Left JOIN):即图3公共部分记录集C+表A记录集A1。
     语句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid 
    运行结果如下图5所示:


    图5:左连接数据     

    说明:在语句中,A在B的左边,并且是Left Join,所以其运算方式为:A左连接B的记录=图3公共部分记录集C+表A记录集A1
    在图3中即记录集C中的存在的Aid为:2 3 6 7 8 
    图1中即表A所有记录集A中存在的Aid为:1 2 3 4 5 6 7 8 9  
    表A记录集A1中存在的Aid=(图1中即A表中所有Aid)-(图3中即记录集C中存在的Aid),最终得出为:1 4 5 9  
    由此得出图5中A左连接B的记录=图3公共部分记录集C+表A记录集A1, 最终得出的结果图5中可以看出Bnameid及Bid非NULL的记录都为图3公共部分记录集C中的记录;Bnameid及Bid为NULL的Aid为1 4 5 9的四笔记录就是表A记录集A1中存在的Aid。
     
    (2)右连接(Right JOIN):即图3公共部分记录集C+表B记录集B1。

    语句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid   运行结果如下图6所示:
     

     


    图6:右连接数据 
    说明: 在语句中,A在B的左边,并且是Right Join,所以其运算方式为:A右连接B的记录=图3公共部分记录集C+表B记录集B1 
    在图3中即记录集C中的存在的Aid为:2 3 6 7 8  
    图2中即表B所有记录集B中存在的Bnameid为:2 3 6 7 8 11  
    表B记录集B1中存在的Bnameid=(图2中即B表中所有Bnameid)-(图3中即记录集C中存在的Aid),最终得出为:11  
    由此得出图6中A右连接B的记录=图3公共部分记录集C+表B记录集B1, 最终得出的结果图6中可以看出Aid及Aname非NULL的记录都为图3公共部分记录集C中的记录;Aid及Aname为NULL的Aid为11的记录就是表B记录集B1中存在的Bnameid。    

    交叉连接:两张表联合没有条件情况下,条数 = 图1 * 图2

    那么现在来说说join on和where区别

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

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

    假设有两张表:

    表1:tab2

    idsize
    110
    220
    330

    表2:tab2

    sizename
    10AAA
    20BBB
    20CCC

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

    第一条SQL的过程:

     

    1、中间表
    on条件:
    tab1.size = tab2.size
    tab1.idtab1.sizetab2.sizetab2.name
    11010AAA
    22020BBB
    22020CCC
    330(null)(null)

     

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

     

      

     

    第二条SQL的过程:

     

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

     

     

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

     

    展开全文
  • sql语言中join on和where有什么区别

    千次阅读 2016-08-25 10:56:05
    sql语言中join on和where 区别
  • SQL中JOIN操作后接ON和WHERE关键字的区别

    万次阅读 多人点赞 2018-06-26 17:07:55
    本文主要介绍 SQL(Structured Query Language)中 JOIN 操作后接 ON WHERE 关键字的区别。 说明:本文的用法示例是面向 MySQL 数据库的。 1 概述 当我们使用连接(JOIN)操作,关联两张或多张表来返回记录时...
  • MYSQL on和where区别

    万次阅读 多人点赞 2019-09-01 17:31:19
    多表查询语法结构: ...在多表查询时,ON和where都表示筛选条件,on先执行,where后执行。 区别: 外连接时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而wh...
  • 本篇文章是对Oracle的left join中on和where区别进行了详细的分析介绍,需要的朋友参考下
  • SQL左右连接中的on and和on where区别

    万次阅读 多人点赞 2014-09-29 23:08:28
    本文详细解释了SQL左右连接中的on and和on where区别以及内连接inner join中on and 和on where区别,全部是实例验证,不是空口胡说欢迎拍砖。
  • 主要给大家介绍了关于SQL中过滤条件放on和where中的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
  • 本文简单描述了sql语句join中on和where区别以及其原理
  • SQL中ON和WHERE区别

    万次阅读 2019-03-04 15:13:07
    SQL中ON和WHERE区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用leftjion时,on和where条件的区别如下: 1、on条件是在生成临时表时使用的条件...
  • 最近项目中碰到一个有关多表链接on 和where条件下数据的变换问题。做个简单整理: select count(*) from “SAPHANADB”.“CDHDR” SCR inner JOIN “SAPHANADB”.“CDPOS” SCS ON SCR.MANDANT = SCS.MANDANT AND ...
  • 原文地址如下: https://www.cnblogs.com/dudumiaomiao/p/5724229.html
  • 在使用left jion时,on和where条件的区别如下: 1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经...
  • 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时...
  • MySql中On和Where区别

    千次阅读 2019-03-30 15:13:39
    区别: 先执行on,后执行whereon是建立关联关系,where是对关联关系的筛选。 比如两个表进行left join连接查询结果,where会对查询的结果进行过滤, on会返回驱动表的所有数据。 left join按照条件关联,不管...
  • MYSQL 表连接 ON AND 和ON WHERE区别

    千次阅读 2017-09-15 14:55:53
    原先一直对SQL左右连接中的on and和on where区别不是太了解,直到在网上看到了下面这段话才豁然开朗。  在使用left join时,on and和on where条件的区别如下:  1、on条件是在生成临时表时使用的条件,它...
  • MySQL - ON & WHERE 条件区别和执行顺序

    千次阅读 2018-10-30 15:18:34
    在使用left jion时,on和where条件的区别如下: 1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时...
  • SQL语句中join on和where区别

    千次阅读 多人点赞 2018-05-10 17:36:00
    关于join on后面的条件和where 后面的条件,是基于left join、right join、full join而言的,inner join ?跟内连接无关啦,首先,我们知道SQL的执行循序是:SQL的执行顺序:from join on where group by having ...
  • inner join on where区别

    千次阅读 2016-09-29 10:23:28
    (其他JOIN参数也是显性连接)WHERE和INNER JOIN产生的连接关系,没有本质区别,结果也一样。但是!隐性连接随着数据库语言的规范发展,已经逐渐被淘汰,比较新的数据库语言基本上已经抛弃了隐性连接,全部采用...
  • 左连接中on和where区别

    千次阅读 2018-06-26 14:15:03
    浅谈左连接on和where条件的区别。 如上图所示,现在有5个学生,两个班级, 其中3个学生属于1班,另外两个属于2班。 试猜想,如下SQL执行的结果: SELECT * from student st LEFT JOIN classs cc ON st.cid=...
  • 在使用left join时,on and与on where条件的区别: 1、on条件是在生成临时表时使用的条件,不管on中的条件是否为真,都会返回左边中的记录。(实际上左连接中如果and语句是对左表进行过滤的,那么不管真假都不起...
  • SQL 面试题:WHERE HAVING、ON 有什么区别

    万次阅读 多人点赞 2020-04-09 07:42:16
    SQL 中WHERE和HAVING的区别在于:...SQL 中WHERE和ON区别在于:对于内连接查询,WHERE和ON中的过滤条件等效;对于外连接查询,ON中的过滤条件在连接操作之前执行,WHERE中的过滤条件(逻辑上)在连接操作之后执行。
  • 一、left join on on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 二、left join on and ...(1)如果and语句是对左表进行...三、left join on where where条件是在...
  • onwhere区别

    千次阅读 2019-08-16 19:26:30
    onwhere区别 on是先对表进行筛选再生成关联表,where是先生成关联表再对关联表进行筛选,on执行的优先级高于left join,而where的优先级低于left join 当我们使用on关键字时,会先根据on后面的条件进行筛选,条件...
  • 问题是常规的写法,将 day >= xxx 条件放到 where 中, 如果某些数据近一周没有访问量,那么这条数据就查不出来。解决办法呢,就是将条件放到 LEFT JOIN 中。 MySQL 语句执行顺序 首先先说明一个概念,MySQL 语句...
  • sql执行顺序以及on和where区别

    千次阅读 2017-02-15 23:46:38
    (1.)select语句的执行顺序 Processing Order of the SELECT statement The following steps show the processing order for a SELECT statement. ...2.ON 3.JOIN 4.WHERE 5.GROUP BY 6.WITH CUBE or WITH ROLLU

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,106,806
精华内容 442,722
关键字:

on和where区别