zoukankan      html  css  js  c++  java
  • SQL连接方式(内连接,外连接,交叉连接)

    1.内连接、左连接、右连接、全连接介绍

       內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。内部连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来。
       左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行并不是象内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少。
     左连接是只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来
     右连接是只要右边表中有记录,数据就能检索出来 ;
     全连接则会回返回两个表中的所有记录。
     
    2.示例
     有两个表
     table1
     user_id      user_name      user_pss
           1             aaa            a
           2             bbb            b
           3             ccc            c
     
     table2
     user_id      user_power
           1             111000
           2             000111

     使用sql語句查询
     正常状态:
     select table1.user_id,
                table1.user_name,
                table2.user_power
     from table1,table2
     where table1.user_id = table2.user_id
     但是这样检索到的数据只有两条:
     user_id      user_name       user_power
           1            aaa             000111
           2            bbb             111000
     因为第三条数据在table2中沒有关联.

     这时使用左连接查询﹕
     selecttable1.user_id,table1.user_name,table2.user_power
     from table1,table2
     where table1.user_id (+)= table2.user_id
     就可以得到如下的结果
     user_id      user_name       user_power
           1            aaa             000111
           2            bbb             111000
           3            ccc             (null)
           
     说明﹐左或右连接查询实际上是指定以哪个表的数据为准﹐而默认(不指定左或右连接)是以两个表中都存在关键列的数据为准。
     左连接就是以左边的表记录为主,右连接就是以右边的表记录为主,完全连接返回两个表中的所有记录

    3. sql写法
     内连接inner join:
       SELECT msp.name,party.name
     FROM msp JOIN party ON party=code
      或
        SELECT msp.name,party.name
       FROM msp inner JOIN party ONparty=code
     join就是inner join.
      左连接left join :


      SELECT msp.name,party.name
     FROM msp LEFT JOIN party ON party=code
     
      右连接right join :
       SELECT msp.name,party.name
     FROM msp RIGHT JOIN party ONmsp.party=party.code

    全连接(full join):
     SELECT msp.name, party.name
     FROM msp FULL JOIN party ONmsp.party=party.code

     参考wikipedia就可以明白,说的非常好:

    http://zh.wikipedia.org/wiki/%E8%BF%9E%E6%8E%A5_(SQL)#.E5.85.A8.E8.BF.9E.E6.8E.A5

    SQL 的连接(JOIN)语句将数据库中的两个或多个表组合起来.[1] 由"连接"生成的集合, 可以被保存为表, 或者当成表来使用. JOIN 语句的含义是把两张表的属性通过它们的值组合在一起. 基于 ANSI 标准的 SQL 列出了五种 JOIN 方式: 内连接(INNER), 全外连接(FULL OUTER), 左外连接(LEFT OUTER), 右外连接(RIGHT OUTER)和交叉连接(CROSS). 在特定的情况下, 一张表(基本表, 视图, 或连接表)可以和自身进行连接, 成为自连接(self-join).

    程序员用 JOIN 谓词表示要得到"连接"后的集合. 如果evaluated predicate为真, 组合后的记录就会按照预期的方式生成, 如一个记录集, 或者一张临时表.

    内连接"可以进一步被分为: 相等连接,自然连接,和交叉连接(见下).

    外连接:left join right join ,full join 全连接

    转:深入浅出SQL之左连接、右连接和全连接

    为了从两个或多个表中选出数据,我们一般使用表连接来实现这个功能。 

    本节介绍join(连接)的概念. 为此我们准备了两个试验用表: album(专辑表) 和 track(曲目表). 

    专辑表:包含200首来自Amazon的音乐CD的概要信息。

      album(asin, title, artist, price, release, label, rank)

      曲目表:每张专辑中的曲目(因为是音乐CD,所以也可叫歌曲)的详细信息。

      track(album, dsk, posn, song) 

      SQL短语 FROM album JOIN track ON album.asin=track.album 表示连接album和track表。

      其中,album.asin表示专辑的惟一标识号,track.album表示曲目表中和专辑关联的专辑号。

      连接后,得到一个临时表,该临时表中每条记录包含的字段由两部分组成,

      除了专辑表中的对应字段album(title, artist ...),还包含曲目表的所有字段track(album, disk, posn and song)。

      有了这张临时表,很多查询就容易实现了。

      看看一些具体的实例,

      一、列出歌名为'Alison'的专辑名称和作者

    SELECT title, artist
    FROM album JOIN track
    ON (album.asin=track.album)
    WHERE song = 'Alison'



      显然,歌名、专辑名称和作者分别在两个表中,必需使用表连接来完成这个查询。

      二、哪个artist录制了歌曲'Exodus'

    SELECT artist
    FROM album JOIN track ON (asin=album)
    WHERE song = 'Exodus'


      用作连接的两个字段asin,album因为在两个表中都是惟一的,所以不一定要加表名作为前缀。

      但为了方便理解,建议使用前缀,形如:album.asin=track.album

      三、列出曲目表中所有属于'Blur'专辑的歌曲 

    SELECT song
    FROM album JOIN track ON (asin=album)
    WHERE title = 'Blur'


      如果我们把 album JOIN track ON (asin=album) 看成一个临时表的话,join的概念就很好理解了。

    內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。

      为更好的理解这个概念,我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表(msp)。 

    party(Code,Name,Leader)
    Code: 政党代码
    Name: 政党名称
    Leader: 政党领袖

    msp(Name,Party,Constituency)
    Name: 议员名
    Party: 议员所在政党代码
    Constituency: 选区

      在介绍左连接、右连接和全连接前,有一个数据库中重要的概念要介绍一下,即空值(NULL)。

      有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。

      空值不等同于字符串中的空格,也不是数字类型的0。因此,判断某个字段值是否为空值时不能使用=,<>这些判断符。必需有专用的短语:IS NULL 来选出有空值字段的记录,同理,可用 IS NOT NULL 选出不包含空值的记录。

      例如:下面的语句选出了没有领导者的政党。(不要奇怪,苏格兰议会中确实存在这样的政党)

    SELECT code, name FROM party
    WHERE leader IS NULL

      又如:一个议员被开除出党,看看他是谁。(即该议员的政党为空值)

    SELECT name FROM msp 
    WHERE party IS NULL

      好了,让我们言归正传,看看什么叫左连接、右连接和全连接。

      A left join(左连接)包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。

      同理,也存在着相同道理的 right join(右连接),即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。 
    而full join(全连接)顾名思义,左右表中所有记录都会选出来。

      讲到这里,有人可能要问,到底什么叫:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。

      我们来看一个实例:

    SELECT msp.name, party.name
    FROM msp JOIN party ON party=code

      这个是我们上一节所学的Join(注意:也叫inner join),这个语句的本意是列出所有议员的名字和他所属政党。

      很遗憾,我们发现该查询的结果少了两个议员:Canavan MSP, Dennis。为什么,因为这两个议员不属于任何政党,即他们的政党字段(Party)为空值。那么为什么不属于任何政党就查不出来了?这是因为空值在作怪。因为议员表中政党字段(Party)的空值在政党表中找不到对应的记录作匹配,即FROM msp JOIN party ON party=code 没有把该记录连接起来,而是过滤出去了。

      在该短语中,msp在Join的左边,所有称为左表。party在Join的右边,所有称为右表。

      现在再看看这句话,“包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录”,意思应该很明白了吧。执行下面这个语句,那两个没有政党的议员就漏不了了。

    SELECT msp.name, party.name
    FROM msp LEFT JOIN party ON party=code

      关于右连接,看看这个查询就明白了:

    SELECT msp.name, party.name
    FROM msp RIGHT JOIN party ON msp.party=party.code

      这个查询的结果列出所有的议员和政党,包含没有议员的政党,但不包含没有政党的议员。 那么既要包含没有议员的政党,又要包含没有政党的议员该怎么办呢,对了,全连接(full join)。

    SELECT msp.name, party.name
    FROM msp FULL JOIN party ON msp.party=party.code

    更多:http://www.cnblogs.com/eflylab/archive/2007/06/25/794278.html

     http://www.oschina.net/question/89964_65912

  • 相关阅读:
    Oracle SQL语句大全—查看表空间
    Class to disable copy and assign constructor
    在moss上自己总结了点小经验。。高手可以飘过 转贴
    在MOSS中直接嵌入ASP.NET Page zt
    Project Web Access 2007自定义FORM验证登录实现 zt
    SharePoint Portal Server 2003 中的单一登录 zt
    vs2008 开发 MOSS 顺序工作流
    VS2008开发MOSS工作流几个需要注意的地方
    向MOSS页面中添加服务器端代码的另外一种方式 zt
    状态机工作流的 SpecialPermissions
  • 原文地址:https://www.cnblogs.com/youxin/p/3404085.html
Copyright © 2011-2022 走看看