精华内容
下载资源
问答
  • 一张图告诉你SQL使用inner joinleft join

    万次阅读 多人点赞 2018-12-17 09:42:13
    sql之left join、right join、inner join的区别 union、union all的区别跳转https://www.cnblogs.com/logon/p/3748020.html SQL JOINS: Please refer the link :...

    sql之left join、right join、inner join的区别

    union、union all的区别跳转https://www.cnblogs.com/logon/p/3748020.html

    SQL JOINS:

     

    Please refer the link : https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins 

     

    如图:

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
    inner join(等值连接) 只返回两个表中联结字段相等的行

    举例如下: 
    --------------------------------------------
    表A记录如下:
    aID     aNum
    1     a20050111
    2     a20050112
    3     a20050113
    4     a20050114
    5     a20050115

    表B记录如下:
    bID     bName
    1     2006032401
    2     2006032402
    3     2006032403
    4     2006032404
    8     2006032408

    --------------------------------------------
    1.left join
    sql语句如下: 
    select * from A
    left join B 
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    5     a20050115    NULL     NULL

    (所影响的行数为 5 行)
    结果说明:
    left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
    换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
    B表记录不足的地方均为NULL.
    --------------------------------------------
    2.right join
    sql语句如下: 
    select * from A
    right join B 
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    NULL     NULL     8     2006032408

    (所影响的行数为 5 行)
    结果说明:
    仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
    --------------------------------------------
    3.inner join
    sql语句如下: 
    select * from A
    innerjoin B 
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404

    结果说明:
    很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
    --------------------------------------------
    注: 
    LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

    原文:http://www.cnblogs.com/pcjim/articles/799302.html

    展开全文
  • SQL LEFT JOIN 关键字

    2020-12-16 17:16:23
    SQL LEFT JOIN 关键字 SQL LEFT JOIN 关键字 LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。 SQL LEFT JOIN 语法 SELECT column_name(s) FROM...
  • left join

    千次阅读 2012-07-03 10:58:07
    1、首先如果用left join,想要的结果就是把左边的表(主表或驱动表)全部显示,根据条件来显示右边的表(最终出现的条数取决于on条件和where 条件;如果只有on条件那么最终的条数>=左表条数;如果带有where条件,...

    left  join 

     

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

     

    1、首先如果用left  join,想要的结果就是把左边的表(主表或驱动表)全部显示,根据条件来显示右边的表(最终出现的条数取决于on条件和where 条件;如果只有on条件那么最终的条数>=左表条数;如果带有where条件,那么条数不定)。

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

    on 是用来限制右表(辅表)的最终显示结果,所以on 后无论用多少andornot ,也不论这些条件是在左表还是右表,对左表不起任何作用;

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

    就全部过滤掉。

    3、  生成临时表的后对两张连接的表还是可以区分的,如果这是where 条件限制右表,那么就会把临时表中符合这个条件的返回给用户。

     Left join 如果想限制左表(主表或驱动表),需用where条件,或者把驱动表先限制好再left join。例如

    SELECT t.*, f.deptno, f.dname FROM emp t LEFTJOIN dept f ON t.deptno = f.deptno WHERE t.deptno = 20;

    SELECT t.*, f.deptno, f.dname

      FROM (SELECT * FROM emp WHERE deptno = 20) t

      LEFTJOIN dept f ON t.deptno = f.deptno

    两个语句结果是一样的;

     

    但是如果要限制附表(右表),要么把条件放在on后面,要么用where先把附表限制好再跟主表left  join。例如

    SELECT t.*, f.deptno, f.dname FROM emp t LEFTJOIN dept f ON t.deptno = f.deptno WHERE f.dname='SALES';

     

    SELECT t.*, f.deptno, f.dname FROM emp t LEFTJOIN dept f ON t.deptno = f.deptno AND f.dname='SALES';

    SELECT t.*, n.deptno, n.dname

      FROM emp t

      LEFTJOIN (SELECT f.deptno, f.dname FROM dept f WHERE f.dname='SALES') n ON t.deptno = n.deptno;

    三个语句结果是不一样的,并且第二句和第三句是正确的;

     

    注意:如果想单独限制右表,就把条件放在on后,如果想单独限制左表就把条件放在where后。

    另外现在试验的情况是:如果把限制右表的情况也放在where 条件中,那么left join inner join 就没有区别了;所以说如果只是限制右表那么就放到on 之后吧。

     

    举例说明:

    假设有两张表:

    1 mytest1

            ID NAME
    ---------- --------------------
             1 a
             2 b
             3 c
               d

    2 mytest2

            ID NAME
    ---------- --------------------
             1 A
             2 B
             3 C
               D


    两条SQL:
    1
    select * from mytest1 left join mytest2 on (mytest1.id=mytest2.id) where mytest2.name='B';
    2
    select * form. mytest1 left join mytest2 on (mytest1.id = mytest2.id and mytest2.name='B');

    第一条SQL的过程:

    1、中间表
    on
    条件:
    mytest1.id=mytest2.id

            ID NAME                         ID NAME
    ---------- -------------------- ---------- --------------------
             1 a                             1 A
             2 b                             2 B
             3 c                             3 C
               d

    2、再对中间表过滤
    where
    条件:
    mytest2.name='B';

            ID NAME                         ID NAME
    ---------- -------------------- ---------- --------------------
             2 b                             2 B


    第二条SQL的过程:

    1、中间表
    on
    条件:
    mytest1.id=mytest2.id and mytest2.name='B'

            ID NAME
    ---------- --------------------
             2 B

    2、对结果集进行连接.
    (
    条件不为真也会返回左表中的记录)

            ID NAME                         ID NAME
    ---------- -------------------- ---------- --------------------
             2 b                             2 B
                d
             3 c
             1 a


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

    full则具有leftright的特性的并集。inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

    展开全文
  • SQL语法——left join on 多条件

    万次阅读 多人点赞 2018-03-30 22:22:30
    left join on +多条件与where区别 重点 先匹配,再筛选where条件。 本文将通过几个例子说明两者的差别。 表1:product id amount 1 100 2 200 3 300 4 400 表2:product_details...

    left join on +多条件与where区别

    重点

    先匹配,再筛选where条件。


    本文将通过几个例子说明两者的差别。

    表1:product

    idamount
    1100
    2200
    3300
    4400

    表2:product_details

    idweightexist
    2220
    4441
    5550
    6661

    1. 单个条件

    select * from product a
    left join  product_details b
    on a.id  = b.id
    

    以左表为准匹配,结果:

    idamountidweightexist
    1100nullnullnull
    22002220
    3300nullnullnull
    44004441

    2. 条件写在on 与where区别

    查询1:

    SELECT * FROM product LEFT JOIN product_details
    ON (product.id = product_details.id)
    AND   product.amount=200;
    

    结果:

    idamountidweightexist
    1100nullnullnull
    22002220
    3300nullnullnull
    4400nullnullnull

    把on的所有条件作为匹配条件,不符合的右表都为null。
    查询2:

    SELECT * FROM product LEFT JOIN product_details
    ON (product.id = product_details.id)
    WHERE product.amount=200;
    
    idamountidweightexist
    22002220

    匹配完再筛选,结果只有一条记录。

    3. where XXX is null 情况

    使用该语句表示:删除掉不匹配on后面条件的记录。
    where XXX is not null 则表示筛选出符合on后面条件的记录。
    常用于只需要左表的数据,比如count id这类。

    SELECT a.* FROM product a LEFT JOIN product_details b
    ON a.id=b.id AND b.weight!=44 AND b.exist=0
    WHERE b.id IS NULL;
    

    结果:

    idamount
    1100
    3300
    4400

    可以直观看出,只有id=2的纪录完全匹配上三个条件,所以筛除这条纪录,另三条保留,此时这三条纪录的右表均为null。
    筛选出不符合on后面条件的,即 !(a.id=b.id AND b.weight!=44 AND b.exist=0).
    !(a.id=b.id AND || !(b.weight!=44) || !(b.exist=0).
    (a.id != b.id AND || (b.weight = 44) || ( b.exist! = 0).
    逻辑 AND 和 逻辑 OR表达式,其操作数是从左到右求值的。如果第一个参数做够判断操作结果,那么第二个参数便不会被计算求值(短路效果)。

    下面语句与该语句效果相同:(这里相同指的是最后只用到左表数据,若是将右表数据写出来是不一样的)

    SELECT a.* FROM product a LEFT JOIN product_details b
    ON a.id=b.id
    WHERE b.id is null OR b.weight=44 OR b.exist=1;
    

    将on的否定条件写在where后,效果相同。

    注:
    如果你使用 LEFT JOIN 来寻找在一些表中不存在的记录,你需要做下面的测试:WHERE 部分的 col_name IS NULL,MYSQL 在查询到一条匹配 LEFT JOIN 条件后将停止搜索更多行(在一个特定的组合键下)。

    参考:https://blog.csdn.net/czhphp/article/details/18657341

    展开全文
  • left semi joinleft join 联系和区别 1、都是左表连接,但是semi join右表关联不左表也不会出来,left join不一样 2、semi join只能查询左表信息,left join可以查询所有 3、semi joinleft join的一种优化 4、...

    left semi join 和 left join 联系和区别

    1、都是左表连接,但是semi join右表关联不左表也不会出来,left join不一样
    2、semi join只能查询左表信息,left join可以查询所有
    3、semi join是left join的一种优化
    4、semi join一般使用查询存在的情况

    例子:

    数据准备:
    1,a
    2,b
    3,c
    4,d
    7,y
    8,u
    
    2,bb
    3,cc
    7,yy
    9,pp
    ----------------------------------------
    执行:
    set hive.exec.mode.local.auto=true;
    select
    u1.*
    from u1 u1
    left join u2 u2
    on u1.id = u2.id
    where u2.id is null
    ;
    
    ----结果
    Total MapReduce CPU Time Spent: 0 msec
    OK
    1       a
    4       d
    8       u
    Time taken: 9.829 seconds, Fetched: 3 row(s)
    
    
    

    分析:

    联系:
    他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join),而 left semi join 则属于 map join(broadcast join)的一种变体,从名字可以看出他们的实现原理有差异
    
    区别:
    1、Semi Join,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会参加join操作的数据,则可以大大节省网络IO,提升执行效率。
    实现方法很简单:选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到内存中。在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File1中不在File3中的key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。
    由于 hive 中没有 in/exist 这样的子句(新版将支持),所以需要将这种类型的子句转成 left semi join。left semi join 是只传递表的 join key 给 map 阶段 , 如果 key 足够小还是执行 map join, 如果不是则还是 common join。
    
    2、left semi join 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。
    
    3、对待右表中重复key的处理方式差异:因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join on 则会一直遍历。
    
    4、left semi join 中最后 select 的结果只许出现左表,因为右表只有 join key 参与关联计算了,而 join on(内链接) 默认是整个关系模型都参与计算了。
    

    两种join 的"坑"

    由于HIVE中都是等值连接,在JOIN使用的时候,有两种写法在理论上是可以达到相同的效果的,但是由于实际情况的不一样,子表中数据的差异导致结果也不太一样。

    写法一:left semi jion
    
    select
            a.bucket_id,
            a.search_type,
            a.level1,
            a.name1,
            a.level2,
            a.name2,
            cast((a.alipay_fee) as double) as zhuliu_alipay,
            cast(0 as double) as total_alipay
            from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a
         left semi join
         tmall_data_fdi_dim_main_auc b
         on (a.level2 = b.cat_id2
             and a.brand_id = b.brand_id
             and b.cat_id2 > 0
             and b.brand_id > 0
             and b.max_price = 0
         )
    

    结果是 3121 条

    写法二 :join on
    select
            a.bucket_id,
            a.search_type,
            a.level1,
            a.name1,
            a.level2,
            a.name2,
            cast((a.alipay_fee) as double) as zhuliu_alipay,
            cast(0 as double) as total_alipay
            from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a
         join   tmall_data_fdi_dim_main_auc b
         on (a.level2 = b.cat_id2
             and a.brand_id = b.brand_id)
      where  b.cat_id2 > 0
             and b.brand_id > 0
             and b.max_price = 0
    

    结果:3142

    结果分析:

    这两种写法带来的值居然不是相等的,我一直以为理解这两种方式的写法是一样的, 但是统计的结果却是不一样的。
    经过一层一层的查找,发现是由于子表(tmall_data_fdi_dim_main_auc)中存在重复的数据,当使用JOIN ON的时候,A,B表会关联出两条记录,应为ON上的条件符合;
    而是用LEFT SEMI JOIN 当A表中的记录,在B表上产生符合条件之后就返回,不会再继续查找B表记录了,所以如果B表有重复,也不会产生重复的多条记录。

    大多数情况下 JOIN ON 和 left semi on 是对等的,但是在上述情况下会出现重复记录,导致结果差异,所以大家在使用的时候最好能了解这两种方。式的原理,避免掉“坑”

    展开全文
  • SQL left join

    2014-08-18 14:19:12
    SQL left join用法,初学者应用
  • 一、left join on on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 二、left join on and (1)如果and语句是对左表进行过滤的,那么不管真假都不起任何作用。 (2...
  • left joinleft outer join的区别

    万次阅读 多人点赞 2018-10-27 02:05:03
    left joinleft outer join的缩写,所以作用是一样的。 另外在SQL里没有区分大小写,也就是left joinLEFT JOIN都是可以的。 left join: 包含左表的所有行,对应的右表行可能为空。 right join: 包含右表的所有...
  • SQL 外链接操作小结 inner join left join right join
  • left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 INNER JOIN 语法: INNER JOIN 连接两个数据表的用法: ...
  • mysql的left join和inner join的效率对比,以及如何优化

    万次阅读 多人点赞 2019-03-18 11:31:15
    select * from a left join b on a.x = b.x left join c on c.y = b.y left join d on d.z=c.z       这样的多个left join组合,一方面是心里有点不舒服,...
  • 连续 两个 LEFT JOIN LEFT JOIN

    千次阅读 2014-11-07 10:36:32
    With appropriate indexes, this should be quite efficient enough: SELECT tb3.employee_name, (salary+bonus) remuneration FROM tb3 LEFT JOIN tb1 ON tb1.employee_name = tb3.employee_name LEFT JOIN tb2
  • 最近在看别人写的代码时,看到了left join on and 的写法,刚开始以为他写错了,是不是少东西了,后来研究了一下,人家是对的,而且这种写法将作表的数据全部保留,有点孤陋寡闻,头一次遇到这种写法,记录下来吧。...
  • MySQL join left join right join 区别

    千次阅读 2017-10-19 16:58:39
    MySQL join left join right join 区别
  • LEFT JOIN 语法用法与实例 MySQL LEFT JOIN 语法 SQL(MySQL) LEFT JOIN 会取得左表(table1)全部记录,即使右表(table2)并无对应匹配记录。LEFT JOIN 基本语法如下: ... FROM table1 LEFT JOIN table2 ON ...
  • left join出现重复数据解决方法

    万次阅读 2018-06-05 17:06:00
    三表链接查询发现返回的结果成倍的返回,感到异常的郁闷,用的是left join,之前有大佬告诉我,left join的效率会比其他的连接方法效率要高些,所以也一直用这个。捡重点说,总之引发查询出重复数据就是因为,表之间...
  • left join和right join

    万次阅读 2019-03-13 13:52:31
    SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_...
  • left join on and与left join on where的区别

    千次阅读 2016-10-27 19:16:36
    问题描述在使用left join时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件...
  • mysql的inner join, left join, right join.pdf
  • left join 基本用法

    万次阅读 多人点赞 2019-02-13 17:32:40
    若是三张表,通过两个left join来连接,则把前面两张表先left join之后当作一张表,然后再与第三张表left join,同理,多张表的left join 以此类推 select * from temp1 t1 left join temp2 t2 on t1.aid=t2.bid ...
  • Left join , Right Join, Inner Join 的相关内容,非常实用
  • oracle中left join和right join的区别浅谈,需要的朋友可以参考一下
  • 主要介绍了SQL之left join、right join、inner join的区别浅析,本文讲解了它们的区别并给出了实例,需要的朋友可以参考下
  • mysql + left join

    千次阅读 2018-11-15 11:30:50
    一、mysql left join 的原则上有两点  1、左表为小表  2、右表的关联字段是索引   (无视以上两点,一般不要用left join~~! ) 遇到的问题:右表(c)是大表,分别 有两个小表(a和b) 当 a left join c 的...
  • left joinleft outer join 的区别

    千次阅读 2018-05-15 12:59:00
    通俗的讲: A left join B 的连接的记录数与A表的记录数同 A right join B 的连接的记录数与B表的记录数同 A left join B 等价B right join A table A: Field_K, Field_A 1 a ...
  • 主要介绍了mysql多个left join连接查询用法,结合实例形式对比分析了mysql使用left join进行连接查询相关操作技巧与注意事项,需要的朋友可以参考下
  • 一分钟让你搞明白 left join、right joinjoin的区别

    万次阅读 多人点赞 2020-04-27 22:32:23
    left joinjoin、right join和inner join等等各种join的区别。网上搜,最常见的就是一张图解图,如下: 一张图道清所有join的区别 首先,我们先来建两张表,第一张表命名为kemu,第二张表命名为score: 一、left...
  • inner joinleft join 、right join、 outer join之间的区别
  • 在数据库的应用中,我们经常需要对数据库进行多表查询,然而当数据量非常大时多表查询会对执行效率产生非常大的影响,因此我们在使用JOINLEFT JOIN 和 RIGHT JOIN语句时要特别注意

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 289,808
精华内容 115,923
关键字:

leftjoin