多表连接查询(内,外,交叉连接)

来源:互联网 发布:知乎怎样发表文章 编辑:程序博客网 时间:2024/05/16 07:43

欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频U3D教程我们致力于打造业内unity3d培训学习第一品牌

 

今天有复习了一下多表连接

 

        学员内部测试成绩查询的每次显示的都是学员的编号信息,因为该表中只存储了学员的编号;实际上最好显示学员的姓名,而姓名存储在学员信息表;如何同时从这两个表中取得数据? 

 

      --于是,有了多表连接。

 

多表连接

 

          连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征.
          select 1.字段名1,表2.字段名2... 
          from 1,表2
                where 连接条件

 

连接查询分类:


         1.内连接查询,<又分为:自然连接、等值连接、不等值连接三种>
         2.外连接查询,<又分为:左外连接、右外连接、全外连接三种>
         3.交叉连接查询,也作无条件查询。

 

内连接查询

 

        内链接就是对表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on 语句后边的限制条件的条目。

 

外连接查询 (左外连接、右外连接、完整外连接)

 

         左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

 

        右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

 

        A left join B 的连接的记录数与A表的记录数同
        A right join B 的连接的记录数与B表的记录数同  这种说法是错误的,只有当表A与表B是一对一时才成立。

 

        首先我们做两张表:员工信息表和部门信息表,在此,表的建立只为讲述连接的概念,所以字段非常的简单 

        EmployeeTB(员工信息表): 

        employeeid employeename deptid 
        0001  张三  01 
        0002  李四  01 
        0003  王五  02 
        0004  赵六  02 
        0005  郑七  NULL 

        DeptTB(部门信息表) 
        deptid  deptname 
        01  技术部 
        02  市场部 
        03  工程部 

 

       1左外联结

 

       但是有些情况下,我们需要知道所有员工的信息,即使他不属于任何部门。这样我们就可以采用外连接,在这里为左外连接,也就是连接中的左表的表中的记录,无论能不能在右表中找到匹配的项,都要检索,如果没有匹配的项目,那么右表中的字段值为NULL(空),在这里就代表,此员工不属于任何部门。

 

       检索语句为: 

        SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON e.deptid

=d.deptid

 
        检索的结果都是: 

        employeeid employeename deptname 
        0001  张三 技术部 
        0002  李四 技术部 
        0003  王五 市场部 
        0004  赵六 市场部 
        0005  郑七  NULL 

        但是在这里,工程部同样不会被检索,因为,deptname是在连接的右边的表中,工程部在左表中不存在任何的记录,所以不会被检索。这里关注的是连接中的左边的表” 


      2、右外连接 

        有时,我们需要知道,全部部门的信息,即使它没有任何的员工。在我们的查询中部门表在连接的右边,如果我们想知道右边表中的所有记录信息,那么就可以采用右外连接,如果此记录在左边的表中找不到匹配项,则相应字段(employeeid,employeename)NULL 

        检索语句为: 
        SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON e.dept id=d.deptid 

        检索的结果都是: 

        employeeid employeename deptname 
        0001  张三 技术部 
        0002  李四 技术部 
        0003  王五 市场部 
        0004  赵六 市场部 
        NULL  NULL  工程部 

        但在这里,郑七是不会被检索了,因为它在右表中找不到匹配项,这里关注的是连接中的右边的表” 

       3、完整外连接 

       如果我们想知道所有的记录呢?无论员工有没有部门,部门有没有员工,我们都需要检索。这里就可以使用完全外连接。关注连接中的两部分。如果没有部门,部门为空,没有员工,员工信息为空。 

       检索语句为: 
     

       SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e FULL OUTER JOIN DeptTB AS d ON e.deptid=

d.deptid

 
        检索的结果都是: 

        employeeid employeename deptname 
        0001  张三 技术部 
        0002  李四 技术部 
        0003  王五 市场部 
        0004  赵六 市场部 
        0005  郑七  NULL 
        NULL  NULL  工程部 

 

交叉连接

        交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

       例

       titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等6*8=48行。

0 0
原创粉丝点击