精华内容
下载资源
问答
  • 新建两张1:student 截图如下: 2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个会有自己不同的主键。) 一、外连接 外连接可分为 ...

    来源: 新客网 作者: joeleo博客 发表于: 2012-07-09 09:22  点击:
    本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。) 一、外连接 外连接可分为


    本文主要列举两张和三张表来讲述多表连接查询。

    新建两张表:
    表1:student  截图如下:
    SQL多表连接查询(详细实例)_新客网
    表2:course  截图如下:
    SQL多表连接查询(详细实例)_新客网
    (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。)
    一、外连接
    外连接可分为:左连接、右连接、完全外连接。
    1、左连接  left join 或 left outer join
    SQL语句:select * from student left join course on student.ID=course.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL).
    注:此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
    2、右连接  right join 或 right outer join
    SQL语句:select * from student right join course on student.ID=course.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。
    注:同样此时我们不能说结果的行数等于右表的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
    3、完全外连接  full join 或 full outer join
    SQL语句:select * from student full join course on student.ID=course.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。
    二、内连接  join 或 inner join
    SQL语句:select * from student inner join course on student.ID=course.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    inner join 是比较运算符,只返回符合条件的行。
    此时相当于:select * from student,course where student.ID=course.ID
    三、交叉连接 cross join
    1.概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
    SQL语句:select * from student cross join course
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    如果我们在此时给这条SQL加上WHERE子句的时候比如SQL:select * from student cross join course where student.ID=course.ID
    此时将返回符合条件的结果集,结果和inner join所示执行结果一样。
    四、两表关系为一对多,多对一或多对多时的连接语句
    当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
    其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。
    比如表1的列可以改为:
    Sno Name Cno
    表2的列可以改为:
    Cno CName
    这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。
    下面介绍一下当两表为多对多的时候我们该如何建表以及些SQL语句。
    新建三表:
    表A:  student 截图如下:
    SQL多表连接查询(详细实例)_新客网
    表B:  course 截图如下:
    SQL多表连接查询(详细实例)_新客网
    表C:  student_course 截图如下:
    SQL多表连接查询(详细实例)_新客网
    一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。
    当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。
    SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    此条SQL执行的结果是学生选课的情况。
    展开全文
  • SQL表连接查询

    2015-11-06 17:16:49
    新建两张1:student 截图如下: 2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个会有自己不同的主键。) 一、外连接

    SQL多表连接查询(详细实例)

    来源: 新客网 作者: joeleo博客 发表于: 2012-07-09 09:22  点击: 68349
    本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。) 一、外连接 外连接可分为
    id="cproIframe_u1284777_3" width="336" height="280" src="http://pos.baidu.com/acom?adn=3&at=134&aurl=&cad=0&ccd=24&cec=GBK&cfv=19&ch=0&col=zh-cn&conOP=0&cpa=1&dai=3&dis=0&layout_filter=rank%2Ctabcloud&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D-RDZQTGyc9XVbiQDrjJ0cg1RbM3hjolAkUn-5TSM33DM25Tt5ZUq20a63UcUDIMuS63eH21wlXJQ7fzqHNrur94WFd6pSDGnEyO61mvxk2CHJXTPpOn3P1GHAcbnnDZk%26wd%3D%26eqid%3Dd3f312310000568a00000002563c6b8d&ltu=http%3A%2F%2Fwww.dedecms.com%2Fknowledge%2Fdata-base%2Fsql-server%2F2012%2F0709%2F2872.html&lunum=6&n=81009016_cpr&pcs=1015x633&pis=10000x10000&ps=526x957&psr=1280x800&pss=1015x1615&qn=5819e2225821003b&rad=&rsi0=336&rsi1=280&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000FF&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=%23ffffff&scale=&skin=&td_id=1284777&tn=text_default_336_280&tpr=1446800519937&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1284777&ti=SQL%E5%A4%9A%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A2%EF%BC%88%E8%AF%A6%E7%BB%86%E5%AE%9E%E4%BE%8B%EF%BC%89_%E7%BB%87%E6%A2%A6CMS&tt=1446800519925.52259.52376.52376" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true">
    本文主要列举两张和三张表来讲述多表连接查询。
    新建两张表:
    表1:student  截图如下:
    SQL多表连接查询(详细实例)_新客网
    表2:course  截图如下:
    SQL多表连接查询(详细实例)_新客网
    (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。)
    一、外连接
    外连接可分为:左连接、右连接、完全外连接。
    1、左连接  left join 或 left outer join
    SQL语句:select * from student left join course on student.ID=course.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL).
    注:此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
    2、右连接  right join 或 right outer join
    SQL语句:select * from student right join course on student.ID=course.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。
    注:同样此时我们不能说结果的行数等于右表的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
    3、完全外连接  full join 或 full outer join
    SQL语句:select * from student full join course on student.ID=course.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。
    二、内连接  join 或 inner join
    SQL语句:select * from student inner join course on student.ID=course.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    inner join 是比较运算符,只返回符合条件的行。
    此时相当于:select * from student,course where student.ID=course.ID
    三、交叉连接 cross join
    1.概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
    SQL语句:select * from student cross join course
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    如果我们在此时给这条SQL加上WHERE子句的时候比如SQL:select * from student cross join course where student.ID=course.ID
    此时将返回符合条件的结果集,结果和inner join所示执行结果一样。
    四、两表关系为一对多,多对一或多对多时的连接语句
    当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
    其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。
    比如表1的列可以改为:
    Sno Name Cno
    表2的列可以改为:
    Cno CName
    这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。
    下面介绍一下当两表为多对多的时候我们该如何建表以及些SQL语句。
    新建三表:
    表A:  student 截图如下:
    SQL多表连接查询(详细实例)_新客网
    表B:  course 截图如下:
    SQL多表连接查询(详细实例)_新客网
    表C:  student_course 截图如下:
    SQL多表连接查询(详细实例)_新客网
    一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。
    当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。
    SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    此条SQL执行的结果是学生选课的情况。
    展开全文
  •  连接查询中用来连接连个的条件称为连接条件或连接谓词。其形式为: [].列名1>连接运算符>[].列2>   常见的连接运算符包括  1、比较运算符:=、>、=、  2、逻辑运算符:not、and、or。  3、使用between...

    一、连接查询简介

      连接查询中用来连接连个表的条件称为连接条件或连接谓词。其形式为:

    [<表1>].<列名1><连接运算符>[<表2>].<列2>  

      常见的连接运算符包括

      1、比较运算符:=、>、<、>=、<=、!=、between和and。

      2、逻辑运算符:not、and、or。

      3、使用between和and连接查询形式为[<表1>].<列名1><between>[<表2>].<列名2>and[<表2>].<列名3>。

    二、连接按照结果集分类

      1、内连接:表中的行互相连接。结果集的行数等于每个表满足条件的行数的乘积,参与连接的表示平等的。

      2、外连接:参与连接的表有主次之分,主表的每一行数据去匹配从表的数据列,符合连接条件的数据将直接返回到结果集中,不符合连接条件的数据列将以null填充后返回到结果集中,其中外连接又分左外连接、右外连接和全连接3种。

      (一)、等值连接查询

    select p.*,c.* from country as c,person as p where c.countryid = p.countryid

      等上面的等值连接中,两张表都有countryid字段,因此查出来的结果中就会有两列countryid

      (二)、在等值结果中消除数据就是自然连接

    select p.name,c.countryname from country as c,person as p where c.countryid = p.countryid

      (三)、自身连接

      一个数据表自己与自己建立连接称为自身连接

    、内连接查询

      1、内连接查询的语法结构如下:

          select <属性或表达式列表>
          from <表名> [inner] join <表名>
          on <连接条件>
          [ where <限定条件> ]

      inner可以省略,当只见到join时就是省略了inner。内连接就是传统的连接操作,这里用on子句指定连接条件,用where子句指定其他限定条件:

      select p.name,c.countryname from country as c inner join person p on p.countryid = c.countryid

    、左外连接查询

      1、左外连接查询的语法结构:

        select <属性或表达式列表>
        from <表名> left outer join <表名>
        on <连接条件>
        [ where <限定条件> ]

      如:

      select p.name,c.countryname from country as c left join person p on p.countryid = c.countryid 

      在结果表中包含第一个表中满足条件的所有记录,如果是在连接连接上匹配的记录,则第二个表返回相应值,否则第二个表返回null。也就是说,不管第二个表有没有记录都会第一个表的所有字段都会返回,这就是外连接与内连接的区别。

    五、右外连接查询

      1、右外连接查询的语法结构如下:

        select <属性或表达式列表>
        from <表名> right outer join <表名>
        on <连接条件>
        [ where <限定条件> ]

      如:

    select p.name,c.countryname from country as c right join person p on p.countryid = c.countryid

      在结果表中包含第二个表中满足条件的所有记录。如果是在连接条件上匹配的记录,则第一个表返回相应值,否则第一个表返回null。

    六、全外连接查询

      1、全外连接查询的语法结构如下:

       select <属性或表达式列表>
       from <表名> full outer join <表名>
       on <连接条件>
       where <限定条件>]

      如:

      select p.name,c.countryname from country as c full join person p on p.countryid = c.countryid

      在结果表中包含两个表中满足条件的所有记录。如果是在连接条件上匹配的元组,则另一个表返回相应则,没有则返回null。

    七、交叉连接

      交叉连接Corss join,用于将第一张表的所有记录与第二张表的所有记录组合一次并返回,这个东西在生成测试数据库时很有用,例如,你定义7个姓,7个名,再交叉连接就能够产生49条记录。

       如有如下表:姓氏表

        

        名字表:

        

        执行如下SQL语句:

      select LastName + firstname from name2 cross join name1

           结果如下:

          

    8、联合查询union(union all)

       union是一个特殊的运算符,用于将两个或两个以上的查询产生一个结果集。join将信息水平连接(添加更多列),而union将信息垂直连接(添加更多行)。

       当使用union处理查询时,要注意以下几个关键点。

       (1)、所有union的查询必须在select列表中有相同的列数。即如果第一个查询有3个列数,第二个查询也要只有3个列数。

       (2)、union返回结果的标题集仅从第一个查询中获得,无论第二个查询如何命名或取别名都不会更改。

       (3)、查询中对应的列的数据类型必须隐式一致。注意不要求完全一致,只需要隐式一致。

       (4)、与其他非union不同,union的默认返回选项为distinct,而不是all。union all语句与union的不同点仅仅在于遇到相同的记录,全部保留而已。

       例如还是用第7条的例子,执行如下语句:

    select * from name1 
    union
    select * from name2

       返回结果为:

       

       由于union默认是distinct查询,因此想要获得所有的记录时,可以用union all,这样就算上述例子中两个表都有'王',也会两条记录一起返回。

       现在来看一下综合示例:

       为了展示一下,建了两张表,并添加了几条记录,如下:

        person表

        

        country表

        

       1、查询一个列表,该列表要包含国家名称列表与该国家下的person总数。

    select c.countryname,count(p.id) 
    from country as c 
    inner join person as p on c.countryid = p.countryid 
    group by c.countryname

        输出结果:

        

        现在在来加一个条件,要求人口数按升序排列:

    select c.countryname,count(p.id) as co
    from country as c 
    inner join person as p on c.countryid = p.countryid 
    group by c.countryname
    order by co asc

        输出结果:

        

        再加一个条件,要求只输出person数大于2的记录:

    select c.countryname,count(p.id) as co
    from country as c 
    inner join person as p on c.countryid = p.countryid 
    group by c.countryname
    having count(p.id) > 2
    order by co asc

        输出结果为:

        

    1)内联接:

       内联接使用比较运算符(使用像 =  或 <> 之类的比较运算符)根据每个表共有的列的值匹配两个表中的行,根据这两张表中相同列的条件,得出其      交集。例如:  检索 students和courses表中学生标识号相同的所有行。   

         有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行(链接表就是数据库在做查询形成的中间表)。

          隐式的内连接:

     没有INNER JOIN,形成的中间表为两个表的笛卡尔积。   

    [sql]  view plain  copy
     print ? 在CODE上查看代码片 派生到我的代码片
    1. SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME  
    2. FROM CUSTOMERS C,ORDERS O  
    3. WHERE C.ID=O.CUSTOMER_ID;  
         显示的内连接:

    一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

    [sql]  view plain  copy
     print ? 在CODE上查看代码片 派生到我的代码片
    1. SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME  
    2. FROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;  


      但是,这两个查询的结果是一样的。

    2)左向外联:

          是用的是LEFT  JOIN或LEFT OUTER JOIN     连接语句。

          根据两张表的关系(外键关联),笛卡尔过滤,也就是求出两张表的交集, 如果交集中,左边表的行, 在右边表中没有匹配,则该条记录左边表有数据, 右边表所有的字段都为null。

           左外连接时,写where语句的独立查询条件:  规则, on后面写连接条件, where后写查询条件  

    [sql]  view plain  copy
     print ? 在CODE上查看代码片 派生到我的代码片
    1. SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME  
    2. FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID  
    3. WHERE O.ORDER_NUMBER<>'MIKE_ORDER001';  


    3)右外连接:

          RIGHT  JOIN 或 RIGHT  OUTER  JOIN     连接语句

           和左外连接是相反的,查出的两张表的交集, 如果这条记录,右边表有数据,左边表没有, 则把左边表的字段都设置为null。


     案例:

    [sql]  view plain  copy
     print ? 在CODE上查看代码片 派生到我的代码片
    1. a表     id   name     b表     id   job   parent_id     
    2.             1   张3                   1     23     1     
    3.             2   李四                 2     34     2     
    4.             3   王武                 3     34     4         
    5. a.id同parent_id   存在关系     

      内连接查询:

    [sql]  view plain  copy
     print ? 在CODE上查看代码片 派生到我的代码片
    1. select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id        
    2. 结果是       
    3. 1   张3                   1     23     1     
    4. 2   李四                  2     34     2     

    左连接   :

    [sql]  view plain  copy
     print ? 在CODE上查看代码片 派生到我的代码片
    1. select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id        
    2. 结果是       
    3. 1   张3                   1     23     1     
    4. 2   李四                  2     34     2     
    5. 3   王武                  null     
     右连接    :

    [sql]  view plain  copy
     print ? 在CODE上查看代码片 派生到我的代码片
    1. select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id         
    2. 结果是       
    3. 1   张3                   1     23     1     
    4. 2   李四                  2     34     2     
    5. null                       3     34     4    



    对于SQL查询的基本原理:

    1)单表查询:根据WHERE条件过滤表中的记录,然后根据SELECT的选择列选择相应的列进行返回最终结果。

     2)两表连接查询: 在on后面写连接条件, 在where后面写过滤的查询条件,然后再根据SELECT指定的列返回查询结果。

    3)多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。


    关于on条件和where条件的区别:

    ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。

    WHERE条件:ON只进行连接操作,WHERE只过滤中间表的记录。


    对于连接类型的选择:  在实际运用中如果连接类型选择不当, 不但出现效率低并且可能还会出现逻辑的错误

    1、 查两表关联列相等的数据用内连接

    2、 Col_L是Col_R的子集时用右外连接。(左边表是右边表的子集,用右外)

    3、 Col_R是Col_L的子集时用左外连接。(右边表是左边表的子集, 用左外)

    4、 求差操作的时候用联合查询。

    并且,多个表查询的时候,这些不同的连接类型可以写到一块

    例如:

    [sql]  view plain  copy
     print ? 在CODE上查看代码片 派生到我的代码片
    1. SELECT T1.C1,T2.CX,T3.CY  
    2. FROM TAB1 T1  
    3.        INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)  
    4.        INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)  
    5.        LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);  
    6. WHERE T1.X >T3.Y;  

        通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,是它区别于其它类型 数据库管理系统的一个标志。连接可以在SELECT 语句的FROM子句或WHERE子句中建立,在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。一般来说,连接查询比嵌套查询的效率高一点。所以,在Transact-SQL中推荐使用这种方法。
     
       SQL-92标准所定义的FROM子句的连接语法格式为:
         FROM join_table join_type join_table [ON (join_condition)]
      其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 个表操作的连接又称做自连接。
    join_type 指出连接类型,可分为内连接和外连接。
    练习数据表:
    表一:press(出版社)
    表二:authors(作者)

    一、内连接(INNER JOIN)

    内连接是应用程序中用的普遍的"连接"操作,它一般都是默认连接类型。内连接基于连接谓词将两张表(如 A 和 B)的列组合在一起,产生新的结果表。查询会将 A 表的每一行和 B 表的每一行进行比较,并找出满足连接谓词的组合。当连接谓词被满足,A 和 B 中匹配的行会按列组合(并排组合)成结果集中的一行。连接产生的结果集,可以定义为首先对两张表做笛卡尔积(交叉连接) -- 将 A 中的每一行和 B 中的每一行组合,然后返回满足连接谓词的记录。实际上 SQL 产品会尽可能用其他方式去实现连接,笛卡尔积运算是非常没效率的. 
    内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:

      1、相等连接

    1)等值连接

    表之间的连接是通过相等的字段值连接起来的查询称为等值连接查询。在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。特别注意连接依据的列可能包含 NULL 值,NULL 值不与任何值匹配(甚至和它本身)
    例如:列出authors和press表中位于同一城市的作者和出版社
          SELECT * FROM press AS p INNER JOIN authors AS a ON p.city=a.city 
           等价于:SELECT * FROM press AS p ,authors AS a WHERE p.city=a.city
             查询结果:

    2)非等值连接                      

    在等值查询的连接条件中不使用等号,而使用其它比较运算符就构成了非等值连接查询。可以使用的比较运算符有:> 、>、=、 <、 <=、 !=, 还可以使用BETWEEN…AND 之类的谓词。
          例如:SELECT * FROM press AS p INNER JOIN authors AS a ON p.id > a.press_id   
              查询结果:
                  

    2、自然连接

    自然连接(Natural join)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,两表中的所有名称相同的列都将被比较,并且在结果中把重复的属性列去掉,结果表中两表中名称相同的列只出现一次.。而等值连接并不去掉重复的属性列。(sqlserver 不支持 自然连接)
    例如:SELECT * FROM authors  NATRUAL JOIN press 
    查询结果与等值连接一样,只是去掉了重复的id那一列。

    3、交叉连接

        交叉连接(cross join),又称笛卡尔连接(cartesian join)或叉乘(Product),它是所有类型的内连接的基础。把表视为行记录的集合,交叉连接即返回这两个集合的笛卡尔积返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。这其实等价于内连接的链接条件为"永真",或连接条件不存在.。

        如果 A 和 B 是两个集合,它们的交叉连接就记为: A × B.

        例如: SELECT * FROM press CROSS JOIN authors    

        等价于:SELECT * FROM press,authors 

            查询结果:

                

    二、外连接

    外连接并不要求连接的两表的每一条记录在对方表中都一条匹配的记录. 连接表保留所有记录 -- 甚至这条记录没有匹配的记录也要保留. 外连接可依据连接表保留左表, 右表或全部表的行而进一步分为左外连接, 右外连接和全连接.在标准的 SQL 语言中, 外连接没有隐式的连接符号.

    1、左外连接

    左外连接会返回左表的所有记录和右表中匹配记录的组合(如果右表中无匹配记录, 来自于右表的所有列的值设为 NULL). 如果左表的一行在右表中存在多个匹配行, 那么左表的行会复制和右表匹配行一样的数量, 并进行组合生成连接结果.

        例如:SELECT *  FROM   press LEFT OUTER JOIN authors ON press.id = authors.press_id
        查询结果:
    	
          

    2、右外连接

        右外连接, 亦简称右连接, 它与左外连接完全类似, 只不过是作连接的表的顺序相反而已.右连接操作返回右表的所有行和这些行在左表中匹配的行(没有匹配的, 来源于左表的列值设为 NULL).
    

        例如:SELECT * FROM press RIGHT OUTER JOIN authors ON press.id= authors.press_id
            等价于:SELECT * FROM authors LEFT OUTER JOIN press ON press.id= authors.press_id
    
            查询结果:
    
          		
     		
        实际上显式的右连接很少使用, 因为它总是可以被替换成左连接--换换表的位置就可以了,所以上面两条语句是等价的。

    3、全连接

        全连接是左右外连接的并集. 连接表包含被连接的表的所有记录, 如果缺少匹配的记录, 即以 NULL 填充.。一些数据库系统(如 MySQL)并不直接支持全连接, 但它们可以通过左右外连接的并集(参: union)来模拟实现
    
        例如:SELECT * FROM   press FULL OUTER JOIN authors ON press.id= authors.press_id
    
         查询结果:
          
    	
    
    
    
      

    三、自连接

         自身连接是指同一个表自己与自己进行连接。既可以用内连接,也可以用外连接。
    
         例如:SELECT * FROM   authors a1 LEFT JOIN authors a2 ON a2.press_id = a1.id
           查询结果:
    
            
    
    
    参考链接:http://www.cnblogs.com/worksguo/articles/1030214.html
    	http://zh.wikipedia.org/wiki/连接_(SQL) 
    
    
    
    


    参考:http://blog.csdn.net/nieson2012/article/details/45789461


    http://www.cnblogs.com/kissdodog/archive/2013/06/03/3116233.html





    展开全文
  • 外连接(包括左连接left join、右连接right join、全连接full join) 内连接 inner join 自然连接 natural join                 我们来看一个超级简单的例子(下面的地址...

    SQL的连接分为三类:

    • 外连接(包括左连接left join、右连接right join、全连接full join)
    • 内连接 inner join
    • 自然连接 natural join

           

           

    我们来看一个超级简单的例子(下面的地址单词写错了,每个图都要重改太麻烦了):

            现在有两个表,一个是student_name学生姓名,有id和name(姓名)两个属性,一个是student_adress学生地址,有id和adress(地址)两个属性。两个表都有 id 1,2,3,如图:
    在这里插入图片描述

           

           

    左连接

    select * from 
    student_name left join student_adress 
    on student_name.id=student_adress.id;
    

            以id作为连接条件,左连接表示以左边这个表为基准,去匹配右边这个表,如果右边的表有同样的id,就合成一行。如果没有(比如地址表没有id5,6),缺的字段就会用NULL补齐。
    在这里插入图片描述
           

           

    右连接

    select * from 
    student_name right join student_adress 
    on student_name.id=student_adress.id;
    

            以id作为连接条件,右连接表示以右边这个表为基准,去匹配左边这个表,如果左边的表有同样的id,就合成一行。如果没有(比如姓名表没有id7,8),缺的字段就会用NULL补齐。可以和左连接的图对比着看。
    在这里插入图片描述
           

           

    全连接

    select * from student_name full join student_adress ;
    

            全连接将两个表就主键进行了一个笛卡儿积,比如姓名表id有5个,地址表id有5个,最后就会产生一个5*5行的表。
    在这里插入图片描述
           

           

    内连接

    select * from 
    student_name inner join student_adress 
    on student_name.id=student_adress.id;
    

            内连接可以使用using或on子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。内连接返回的结果是两个表中都有的字段,这里是id1,2,3。

           

           

    自然连接

    select * from student_name natural join student_adress ;
    

            自然连接是通过对表关系中同名的属性对取等来完成的,无须自己添加连接条件(后面不用接on指定以什么字段连接)。自然连接和内连接的结果基本相同,都是返回两表都有的字段,这里是id1,2,3。
            不同的是,看图,内连接返回的是两列id,自然连接返回的是一列id。
    在这里插入图片描述

           

           

           

    内连接和自然连接的区别?

    一、

    • 自然连接只能是同名属性的等值连接。
    • 内连接可以使用using或on子句来指定连接条件,连接条件中指出某两字段相等(可以不同名)。

            什么意思呢,就是说,如果现在地址表的id属性名改为了sid,而姓名表的id属性名仍然是id。如图,那么仍可以对两表进行内连接,只需要指定连接条件为 on student_name.id=student_adress.sid 就可以了。但是下面这两个表不能进行自然连接了,因为他们没有同名属性(id和sid不同名)。
    在这里插入图片描述
    二、

    • 自然连接返回的同名属性列只有一列
    • 内连接返回两列
      在这里插入图片描述

           

            如果此时你要进行select操作,注意!!!
            自然连接 select id from student_name natural join student_adress ;可以,因为自然连接的id只有一列。

            但是内连接 select id from student_name inner join student_adress on student_name.id=student_adress.id;会报错,因为内连接返回的id有两列!!!必须指明要选择的是来自哪个表的id。
            改成 select student_name.id from student_name inner join student_adress on student_name.id=student_adress.id;就可以了。

            可以参考SQL语句错误 Error Code: 1052. Column ‘id‘ in field list is ambiguous

    展开全文
  • (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个会有自己不同的主键。) 一、外连接 外连接可分为:左连接、右连接、完全外连接。 1、左连接 left join 或 lef...
  • SQL表连接

    千次阅读 2018-04-16 10:38:11
    表连接(以Oracle为例):表连接就是一种将所有数据先进行笛卡尔积,然后在进行过滤的一种查询方式。先介绍一下什么是笛卡尔积:笛卡尔积也叫交叉连接,其结果就是所有的列数相加,行数相乘:这里有两张test和...
  • SQL语句多表连接查询语法

    万次阅读 多人点赞 2019-07-28 09:32:13
    总结:内连接就是两个的交集 ,左外连接就是左边加两...1.左连接 left join 或 left outer join SQL语句:select * from student left join score on student.Num=score.Stu_id; 2.右连接 right join 或 r...
  • sql表连接方式

    千次阅读 2018-01-11 10:25:41
    sql表连接分成外连接、内连接和交叉连接。   一.外连接 概述: 外连接包括三种,分别是连接、右外连接、全外连接。 对应的sql关键字:LEFT/RIGHT/FULL OUTER JOIN,通常我们都省略OUTER关键字,写成...
  • 最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想~ 现在在这写写关于它们的作用 假设有如下: 一个为投票主,一个为投票...我们以右边voter为准,则左表(voteMaster
  • sql各种表连接

    千次阅读 2012-02-04 21:31:01
    两张通过NATURAL JOIN连接的时候,相当于有个隐含的WHERE子句,对两张中同名的对应列相比较看是否相等。 SQL> select * from emp natural join dept; 返回14行数据 相当于select * from emp , dept where emp....
  • ,与左连接类似,返回test2中存在的。 select * from test1 a RIGHT join test2 b on a.id=b.id; 结果如图所示: 全连接 : full outer join on ,返回两个的并集。(mysql不支持全连接,...
  • SQL表连接总结

    万次阅读 多人点赞 2017-11-29 21:58:40
    了解多表连接查询,就需要先了解多表连接查询的原理,通过实例加深认识。 多查询原理:将多个通过笛卡尔积形成一个虚,再根据查询条件筛选符合条件的数据。 oracle复杂查询参考文档:...
  • 现在在这写写关于它们的作用 假设有如下: 一个为投票主,一个为投票者信息~...我们以右边voter为准,则左表(voteMaster)中的记录只有当其ID在右边(voter)中存在时才会显示出来,如上图,左边中ID为3.
  • (四)sql表连接查询join on的用法

    万次阅读 2019-08-04 18:45:53
    (四)sql表连接查询join on的用法
  • 查询: SQL&gt; --外连接 SQL&gt; --按部门统计员工人数:部门号 部门名称 人数 SQL&gt; select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数 2 from emp e,dept d 3 where e.deptno=d...
  • Statement: reprint from ...If the author of the article is not allowed to reprint, this article will be deleted 介绍表连接,更确切的说是inner joins內连接. 內连接仅选出两张中互相匹...
  • SQl Server 数据库多表连接

    千次阅读 热门讨论 2015-09-13 10:00:42
     为了防止数据的冗余,我们会将数据库中进行拆分,这样就产生了多张表,之间通过主外键关联,但这样又造成了我们查找和修改的困难,如何进行多之间的查找呢?  我们将一个查询同时设计两个或两个以上的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,090
精华内容 36,836
关键字:

左连接sql产生的表