zoukankan      html  css  js  c++  java
  • SQl Server 数据库多表连接

    【缘由】

         为了防止数据的冗余,我们会将数据库中表进行拆分,这样就产生了多张表,表与表之间通过主外键关联,但这样又造成了我们查找和修改的困难,如何进行多表之间的查找呢?

         我们将一个查询同时设计两个或两个以上的表,称之为连接查询。连接查询是关系数据库中最主要的查询,主要包括内连接、左外连接、右外连接、全外连接等。接下来我们分别来论述每一种连接方式。

          首先我有两张表,一张为学生表T_Student,一张为选课信息表T_ChooseCorse表,这两张表中的字段分别如下表:

                  

              

          (为了方便说明问题,表中字段比较少)

    【内连接】

           使用内连接时,如果两个表的相关字段满足连接条件,则将信息从两个表中提取数据并组合成新的记录。

               语句:

                     SELECT * FROM  T_Student 

                     INNER JOIN T_ChooseCourse

                     ON  T_Student.Sno = T_ChooseCourse.Sno

                     Where T_Student.Dept = '计算机系'

            INNER JOIN 将两张表连接起来,ON是连接两个表的条件,只有当学生表的学号和课程选择表的学号相等时将两张表连接起来组合成新的记录,Where后连接查询的条件,该示例查询条件为专业是'计算机系'。 当需要连接多张表时,只需要在ON后面再连接新的表和连接条件就可以,这里不再举例。

    【自连接】

          自连接:是一种特殊的内连接,它是指相互连接的表在物理上是一张表,但在逻辑上将其看成是两张表。用通俗的话来讲就是:在数据库中是一张表比如T_Student,但是我们在使用时可以将其认为是两张表。

           下面举一个例子:要查询与李晨在同一个系学习的学生的姓名

              语句:

                    SELECT  S2.Sname FROM T_Student S1 JOIN T_Student S2

                    ON S1.Dept = S2.Dept

                    Where S1.SName = '李晨'

                    AND S2.Name != '李晨'

               解释:自连接使用的是同一个表,必须有别名,此例中别名分别为S1、S2,这个语句首先从表中找到李晨在哪个系,然后找到此系的其他学生(李晨除外)。

    【外链接】

            1、左外链接         

               语句:

                   SELECT  S.SNo,SName,Cno,Grade

                      FROM  T_Student S LEFT OUTER JOIN T_ChooseCourse

                      ON S.SNo = T_ChooseCourse.SNo

             解释:LEFT OUTER JOIN 只指定了左表的所有行,左表的某行在右表中可以有匹配的行,也可以没有匹配的行,如果没有匹配的行,则在相关联的结果集行中右表的所有选择列均为空值。

           2、右外连接

            右外连接时左外连接的反向连接,将右表中所有行返回。左表中可以有匹配的行,也可以没有。如果左表没有匹配的行,则将返回空值。

           3、全外连接

            当需要保留两个表中都不满足连接条件的的数据行,则可使用完全外连接。用FULL [OUTER] JOIN,该结果将包含两个表中的所有行,不论另一个表中是否有匹配的值,只要没有匹配的行,就用空值来填充。

    【总结】

            通过对数据库多表直接操作的总结,对数据库表操作有了更深一步的了解,在原来的基础之上的一个更深层次的学习,联系之前自考学习数据库的知识,方便现在的理解。总结一句话:数据库多表查询,关键在于掌握表之间连接的条件,这样不管是几个表,我们都没有问题。

           

  • 相关阅读:
    Java线程基础(二)
    Java线程基础(一)
    泛型集合List的详细用法
    Java中日期格式(String、Date、Calendar)的相互转换
    重写Java中包装类的方法
    Java的集合框架(第一次小结)
    node.js 调用mysql 数据库
    win10 系统解决mysql中文乱码问题
    vue-echarts图表
    文件上传的几个例子
  • 原文地址:https://www.cnblogs.com/zsswpb/p/5771637.html
Copyright © 2011-2022 走看看