Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543770
  • 博文数量: 166
  • 博客积分: 4038
  • 博客等级: 上校
  • 技术积分: 1115
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:29
文章分类

全部博文(166)

文章存档

2010年(12)

2009年(126)

2008年(28)

分类: Mysql/postgreSQL

2009-04-26 15:56:26

不管执行OUTER JOIN还是INNER JOIN,DBMS总是一次执行两个表的联合,因此为了在单一查询中连接3个或者3个以上的表,就需要进行多次JOIN连接。

实例24  多表连接的综合运用(一)

从TEACHER表、STUDENT表和COURSE表中查询所有教师的姓名、所在系、开设的课程名称以及选修这门课程的学生姓名及成绩。并要求显示的教师信息必须是他开设的课程在STUDENT表中有同学选修。

分析:教师姓名、所在系信息是在TEACHER表中存储的,而教师开设的课程名称是在COURSE表中存储的,这里没有要求开设的课程名不能为 NULL,所以STUDENT表和COURSE表采用左外连接的方式,而学生姓名和课程成绩信息是在COURSE表中存储的,这里要求教师所开设的课程在 STUDENT表中有同学选修,也就是说,学生姓名和课程成绩信息不能为NULL,所以与STUDENT表的连接需要采用内连接。

实例代码:

SELECT      TNAME, T.DNAME,CNAME,SNAME,MARK
FROM      TEACHER  AS  T
lEFT OUTER  JOIN COURSE AS C
ON     T.CNO = C.CNO
INNER JOIN STUDENT  AS  S
ON    T. CNO = S. CNO
ORDER BY    TNAME

运行结果如图9.40所示。

 
图9.40  多表连接的综合运用

下面再给出一个UNION集合并运算与多表连接联合使用的实例。

实例25  多表连接的综合运用(二)

从STUDENT表中查询至少修过“计算机入门”或者“生物工程概论”两门课程中的一门的学生的学号、姓名及所修课程名和课程成绩。

分析:课程名及课程成绩信息在USE表中存储,而学生的学号、姓名信息在STUDENT表中存储,显然需要对二表通过课程号CNO字段进行等值内连接,分别查询满足两门课程之一的信息,而后进行集合并运算即可得到查询结果。
实例代码:

SELECT      SNO, SNAME, CNAME,MARK
FROM      STUDENT AS  S
INNER    JOIN COURSE AS C
ON   S.CNO=C.CNO
WHERE     CNAME = '计算机入门'
UNION
SELECT      SNO, SNAME, CNAME,MARK
FROM      STUDENT AS  S
INNER  JOIN COURSE AS C
ON   S.CNO=C.CNO
WHERE     CNAME = '生物工程概论'
ORDER BY  SNO

运行结果如图9.41所示。

 
图9.41  UNION集合并在多表连接联合中应用


阅读(891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~