查询:使用多表连接查询数据
【摘要】
/**********************************
查询:使用多表连接查询数据
***********************************/
/*
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)