日期:2014-05-16  浏览次数:20431 次

实验六 多表查询(V2.0)

                                    实验六  多表查询
【实验目的】

1. 掌握等值连接和非等值连接

2. 掌握自身连接(同一个表之间连接)

3. 掌握外连接

4. 掌握复合条件连接

 

【实验内容】

1. 基本命令:

select <目标列>

from <表1,表2>[,<表3>[,<...>]]

where <条件>

功能:从表1和表2中查询满足条件的目标列。

 

2. 实验内容

【例1】查询选修了3号课程的学生学号和姓名

 

select student.sno,sname
from student,sc
where student.sno = sc.sno
  and cno = '3'


 备注:表1和表2笛卡尔积,是连接的第一步,是第一个表的每一行与第二个表的每一行组成一次连接(元组相连)。表1和表2的笛卡尔积,有M(M=表1行数*表2行数)行,N(N=表1列数+表2列数)列。

笛卡尔积的每一行不一定有意义。例如学生表student和选课表sc的笛卡尔积20行中只有5行有意义。需要我们做筛选条件,就是表1的某一列=表二的某一列。例如student.sno = sc.sno

 

【例2】查询所有课程的先修课课程号,课程名和学分

解释:题目需要查询课程信息,附加先修课信息。

--查询每个课程的先修课学分(课程号,课程名,课程学分,先修课名和先修课学分)

select 课程.cno,课程.cname,课程.ccredit,课程.cpno,先修课程.Cname,先修课程.ccredit
from Course 课程,Course 先修课程
where 课程.Cpno = 先修课程.Cno


【例3】查询全体学生的选修课程情况

解释:外连接能够实现表1与表2具有联系的元组显示的同时,可以显示某个表全部元组(左连接全部显示左边表,右连接全部显示右边表)。

比较:select student.*,cno,grade

           from student,sc

          where student.sno = sc.sno

本命令只能够查询具有选修课程的学生,没有显示全部学生。(即没有选修课的学生,在结果中没有显示出来)

 

比较命令:

-- 比较如下查询,查询学生选修情况(只列出具有选课的学生)
select student.*,cno,grade
from student,sc
where student.sno = sc.sno

--查询全部学生的选修课程情况,没有选修课程的也要显示出来。
select student.*,cno,grade
from student left join sc 
  on student.sno = sc.sno


查询效果:

 

 【例4】(复合条件查询)

 

【实验总结】

多表查询,实现过个表的查询。