none
请大家能够用通俗的语言和例子帮我说明一下。谢谢。 RRS feed

  • 问题

  • 小弟也学习SQL也有一段时间了。当然目前我只会一些最简单的查询与删除还有更新的语句。我在论坛经常看见比较一些什么事务日志。什么左连接。什么右连接。这些真的不懂呀。我现在最想明白左连接与右连接到底是如何回事?

    我也谷歌搜索了。但是他们说的我还是不懂。(人比较笨)我就想知道哪一些情况要用左连接。哪一些情况又用右连接呢?
    最有一点例子能够通俗的解释一下。谢谢

    就比如下面这样二个表。我看到人家的语句。真是不明白到底是什么意思。到底何时用左连接,何时用右连接。看了好多文章还是不明白如何用。

    表TA
    a d
    1 22
    2 22
    3 22
    4 22


    表TB
    a b
    1 m
    2 c
    2 c
    3 c
    3 m
    3 m
    4 c
    4 m


    select *
    from ta join tb on ta.a=tb.a   

    首先请大家解释一下这个查询语句的意思。再详细说一下左连接与右连接。真的十分感谢。








    2010年1月19日 1:49

答案

  • select *
    from ta join tb on ta.a=tb.a  

    --這是內連接,兩個表同時滿足條件時,才出結果集
    join=inner join

    也可這樣寫
    select *
    from ta , tb
    where  ta.a=tb.a  

    參照MSDN語法和例子
    http://msdn.microsoft.com/zh-cn/library/ms191472%28SQL.90%29.aspx
    ROY WU(吳熹)
    2010年1月19日 3:26
    版主
  • select *
    from ta join tb on ta.a=tb.a

    --(左表)ta join tb(右表)
    --left join 从左表找符合条件,不符合补null,左表的行数据为null,//null,null,?,?//结果行数等于左边
    --right join 从右表找符合条件,不符合补null,右表的行数据为null,//?,?,null,null//结果行数等于右边
    --full join 是综合两者


    select * from ta left join tb on ta.a=tb.a where tb.a is null
    select * from ta right join tb on ta.a=tb.a where ta.a is null

    表TA
    a d
    1 22
    2 12

    表TB
    a b
    1 23
    3 44

    ta left join tb on ta.a=tb.a--左连接
    循环TA表去匹配TB表ta.a=tb.a条件=>
    1 22  1    m
    2 12  null null      --表TB没找到
    等同于
    bool found;
    foreach(ta表)
    {
          found=false;
          foreach(tb表)
          {
              if(ta表.a=tb表.a)
              {
                     datatable.rows.add(ta.a,ta.d,tb.a,tb.b);//找到
                     found=true;
                     break;
              }
          }
          if(!found)//未找到
               datatable.rows.add(ta.a,ta.d,null,null);
    }
    2010年1月19日 4:42
  • 不知道你小时候上学有没有做过这样的作业:
    有2竖物品,要你用连线连接起来,比如:

    猴子  汽车
    司机 香蕉
    兔子 胡萝卜

    你会把猴子和香蕉,司机和汽车,兔子和胡萝卜连接一起,这个就是连接(也叫内连接)

    那么什么是左或者右连接呢?
    改一下上面的问题,这样好说明。
    猴子  汽车
    司机 香蕉
    兔子
    这个时候你只能连接 猴子和香蕉,司机和汽车 兔子是空着的,这个结果就叫 左连接

    如果你连接的结果是以右边为准得出 汽车和司机,香蕉和猴子,其他没了,这个叫右连接

    上面如果改成表,通过某个字段连接就是你要得到的东西了。说的明白么?


    family as water
    2010年1月19日 4:54

全部回复

  • Read about join in books online.
    2010年1月19日 2:49
  • select *
    from ta join tb on ta.a=tb.a  

    --這是內連接,兩個表同時滿足條件時,才出結果集
    join=inner join

    也可這樣寫
    select *
    from ta , tb
    where  ta.a=tb.a  

    參照MSDN語法和例子
    http://msdn.microsoft.com/zh-cn/library/ms191472%28SQL.90%29.aspx
    ROY WU(吳熹)
    2010年1月19日 3:26
    版主
  • select *
    from ta join tb on ta.a=tb.a

    --(左表)ta join tb(右表)
    --left join 从左表找符合条件,不符合补null,左表的行数据为null,//null,null,?,?//结果行数等于左边
    --right join 从右表找符合条件,不符合补null,右表的行数据为null,//?,?,null,null//结果行数等于右边
    --full join 是综合两者


    select * from ta left join tb on ta.a=tb.a where tb.a is null
    select * from ta right join tb on ta.a=tb.a where ta.a is null

    表TA
    a d
    1 22
    2 12

    表TB
    a b
    1 23
    3 44

    ta left join tb on ta.a=tb.a--左连接
    循环TA表去匹配TB表ta.a=tb.a条件=>
    1 22  1    m
    2 12  null null      --表TB没找到
    等同于
    bool found;
    foreach(ta表)
    {
          found=false;
          foreach(tb表)
          {
              if(ta表.a=tb表.a)
              {
                     datatable.rows.add(ta.a,ta.d,tb.a,tb.b);//找到
                     found=true;
                     break;
              }
          }
          if(!found)//未找到
               datatable.rows.add(ta.a,ta.d,null,null);
    }
    2010年1月19日 4:42
  • 不知道你小时候上学有没有做过这样的作业:
    有2竖物品,要你用连线连接起来,比如:

    猴子  汽车
    司机 香蕉
    兔子 胡萝卜

    你会把猴子和香蕉,司机和汽车,兔子和胡萝卜连接一起,这个就是连接(也叫内连接)

    那么什么是左或者右连接呢?
    改一下上面的问题,这样好说明。
    猴子  汽车
    司机 香蕉
    兔子
    这个时候你只能连接 猴子和香蕉,司机和汽车 兔子是空着的,这个结果就叫 左连接

    如果你连接的结果是以右边为准得出 汽车和司机,香蕉和猴子,其他没了,这个叫右连接

    上面如果改成表,通过某个字段连接就是你要得到的东西了。说的明白么?


    family as water
    2010年1月19日 4:54