查询:使用多表连接查询数据
        【摘要】 
                    
 /**********************************
   查询:使用多表连接查询数据
 ***********************************/
 
 /*
    SQL Server提供了使用连接从多个表查询数据的方法。
...
    
    
    
     /********************************** 
   查询:使用多表连接查询数据 
 ***********************************/ 
 /* 
    SQL Server提供了使用连接从多个表查询数据的方法。 
    连接类型有交叉连接、内连接、外连接。 
 */ 
 /************************************************************* 
  1、交叉连接查询 
        使用CROSS JOIN字句将一个以上的表连接起来的查询 
   称为交叉查询。这种连接的输出结果为笛卡尔积,含有 
   很多没有具体意义的数据,因此是一种很少使用的连接。 
 ***************************************************************/ 
 --任务:对Class表与Student表使用交叉连接查询 
 SELECT   *   FROM   Class   CROSS   JOIN   Student 
 /* 
 说明: 
 Class表中有18行,3列,Student表中有180行,4列,交叉连接 
 结果集行数为3240,列数为7,前3列为Class表的列,后4行为 
 Student表的列。其中有些行的数据没有意义,比如11行数据 
 是没有意义的,因为Class.ClassNo<>Student.ClassNo。 
 */ 
 /************************************************************************ 
    2、内连接查询 
        使用连接条件消除交叉连接查询结果中没有具体意义的数据, 
 只保留满足连接条件的数据行的连接称为内连接,使用JOIN字句 
 进行连接。表与表之间的连接条件写在ON字句中。在内连接查询 
 中,使用公共键建立表与表之间的连接。主表.主键=从表.外键。 
        内连接查询包括相等连接查询、自然连接查询、比较连接查询 
 和自连接查询。 
 **************************************************************************/ 
 /* 
  (1)相等连接查询 
 相等连接是将两个表的公共列进行相等比较的连接。相等连接首先 
 将要连接的表进行笛卡尔积计算,然后消除不满足相等条件的那些 
 数据行。相等连接查询的结果中存在完全相同的两个列(连接两个 
 表的公共列)。 
 */ 
 /* 
  (2)自然连接查询 
 在相等连接中只保留一个连接列的连接,称为自然连接。 
 */ 
 --任务1:查看学生基本信息和所在班级的信息 
 SELECT   * 
 FROM   Class   JOIN   Student 
 ON   Class . ClassNo = Student . ClassNo 
 --任务2:查看学生基本信息和学生所在班级名称 
 SELECT   Student .*,   ClassName 
 FROM   Class   JOIN   Student 
 ON   Class . ClassNo = Student . ClassNo 
 --任务3:查询学生选课信息,要求显示学号、姓名、课程编号、课程名称、 
 --         志愿号,并且按照学号升序排列,当学号相同时就按志愿号升学排列。 
 SELECT   Student . StuNo  学号 ,   StuName  姓名 ,   Course . CouNo  课程编号 ,   
                 CouName  课程名称 ,   WillOrder  志愿号 
 FROM   Student   JOIN   StuCou   ON   Student . StuNo = StuCou . StuNo 
                            JOIN   Course   ON   StuCou . CouNo = Course . CouNo 
 ORDER   BY   Student . StuNo ,   WillOrder ; 
 --任务4:查询学生报名“计算机应用工程系”开设的选修课情况,显示信息包括 
 --            学生姓名、课程名称和教师。 
 SELECT   StuName  学生姓名 ,   CouName  课程名称 ,   Teacher  教师 
 FROM   Student   JOIN   StuCou   ON   Student . StuNo = StuCou . StuNo 
                            JOIN   Course   ON   StuCou . CouNo = Course . CouNo 
                            JOIN   Department   ON   Course . DepartNo = Department . DepartNo 
 WHERE   DepartName = '计算机应用工程系' ; 
 /* 
 (3)比较连接查询 
 对于比较连接查询,表与表之间的连接不是使用等号(=)进行连接,而是 
 是使用比较运算符进行连接。 
 */ 
 --任务:查询每个班级可以选修的、不是自己系部开设的选修课程的信息, 
 --              显示信息包括班级、课程名、课程类别、学分、老师、上课时间 
 --              和报名人数。 
 SELECT   ClassName  班级 ,   CouName  课程名 ,   Kind  课程类别 ,   Credit  学分 ,   
                 Teacher  教师 ,   SchoolTime  上课时间 ,   WillNum  报名人数 
 FROM   Class   JOIN   Course   ON   Course . DepartNo <> Class . DepartNo 
 /* 
  (4)自连接查询 
 自连接就是一个表和它自身进行连接,是多表连接的特殊情况。 
 在自连接查询中,要先在FROM字句中为表分别定义两个不同的别名, 
 然后使用这两个别名写出一个连接条件。 
 */ 
 --任务1:查询课程类别相同但是开课系部不同的课程信息 
 --                 要求显示课程编号、课程名称、课程类别与系部 
 --                 编号,并按照课程编号升序排列查询结果。 
 SELECT   DISTINCT   c1 . CouNo  课程编号 ,   c1 . CouName  课程名称 ,   
                                     c1 . Kind  课程类别 ,   c1 . DepartNo  系部编号 
 FROM   Course   c1   JOIN   Course   c2   ON   c1 . Kind = c2 . Kind    AND   c1 . DepartNo != c2 . DepartNo 
 ORDER   BY   c1 . CouNo ; 
 /************************************************************************ 
    3、外连接查询 
        使用外连接查询可以解决使用内连接查询所产生的信息不完整 
 的问题。外连接分为左外连接、右外连接和全外连接。 
 (1)左外连接 
          左外连接查询的FROM字句写为: 
          FROM 左表名 LEFT JOIN 右表名 
         左外连接查询是在两个表进行内部连接查询结果的基础上增加不 
 满足连接条件的那些行,这些行的右表的列值显示为空值(NULL)。 
 (2)右外连接 
          右外连接查询的FROM字句写为: 
          FROM 左表名 RIGHT JOIN 右表名 
         右外连接查询是在两个表进行内部连接查询结果的基础上增加不 
 满足连接条件的那些行,这些行的左表的列值显示为空值(NULL)。 
 (3)全外连接 
          全外连接查询的FROM字句写为: 
          FROM 左表名 FULL JOIN 右表名 
          全外连接查询完成左外连接查询和右外连接查询的操作,查询 
 结果包括了左外连接查询和右外连接查询都不满足连接条件的那些 
 数据行。 
       为了有助于理解外连接,特在StuCou表中增加课程编号为020的 
 一行数据: 
       StuNo               CouNo         WillOrder             State 
       02000060        020                    5                      报名 
 **************************************************************************/ 
 ALTER   TABLE   StuCou 
 DROP   CONSTRAINT   CouNo_FK 
 INSERT   INTO   StuCou   ( StuNo ,   CouNo ,   WillOrder ,   State ) 
                 VALUES ( '02000060' ,   '020' ,   5 ,   '报名' ); 
 --任务1、使用左外连接查询所有学生报名选修课程的详细情况,要求 
 --既包括已报名选修课程的学生,也包括未报名选修课程的学生情况, 
 --显示内容有课程编号、课程名称和学号。 
 SELECT   Course . CouNo  课程编号 ,   CouName  课程名称 ,   StuNo  学号 
 FROM   Course   LEFT   JOIN   StuCou   ON   Course . CouNo = StuCou . CouNo ; 
 --任务2、使用右外连接查询学生的已报名和未报名的课程信息,显示 
 --内容包括课程编号、课程名称、学号。 
 SELECT   Course . CouNo  课程编号 ,   CouName  课程名称 ,   StuNo  学号 
 FROM   Course   RIGHT   JOIN   StuCou   ON   Course . CouNo = StuCou . CouNo ; 
 --任务3、使用全外连接查询学生报名信息(课程编号、课程名称、学号)。 
 SELECT   Course . CouNo  课程编号 ,   CouName  课程名称 ,   StuNo  学号 
 FROM   Course   FULL   JOIN   StuCou   ON   Course . CouNo = StuCou . CouNo ; 
文章来源: howard2005.blog.csdn.net,作者:howard2005,版权归原作者所有,如需转载,请联系作者。
原文链接:howard2005.blog.csdn.net/article/details/79451465
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)