查询:使用多表连接查询数据

举报
howard2005 发表于 2021/12/30 01:48:41 2021/12/30
【摘要】 /**********************************   查询:使用多表连接查询数据 ***********************************/ /*    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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。