select查询中深入学习多表间的联合查询

2014-12-20 20:59 阅读(?)评论(0)

   在数据库应用程序中,几乎所以的查询语句中都需要使用多表之间的联合查询。
   为更好地理解各种联合查询的执行,这里以以下2个表为例加以说明:

   1、学生表Student

   2、课程成绩表StuCourseScore

图2

    从StuCourseScore表中可以看到,表中的StudentID是一个外键,对应Student表的主键StudentID。下面说明各种联合的使用方法和技巧。
    按数据库理论,表间联接一般分为3种:内联接(等联接、不等联接)、外联接(左向外联接、右向外联接、完整外部联接)和交叉联接。

    1、内联接
    内联接返回在联接中且有相等值(等联接)的行,联接条件使用=
SELECT Student.StudentID, Student.StudentName, Student.Sex, Student.ClassID, StuCourseScore.CourseID, StuCourseScore.Score
FROM Student INNER JOIN
     StuCourseScore ON Student.StudentID = StuCourseScore.StudentID

    说明:INNER关键字表示联接类型是内联接,JOIN表示建立联接,ON用来设置联接关系条件。

    上述语名返回两个表中字段‘StudentID’相同的列的两个表的相关字段。结果如下图所示:

图3

   不等联接较少使用,这里不作讨论。
   2、外联接。外联接有左外联接和右外联接之分。

   (1)左外联接。结果集返回左表中所有符合where或having查询条件的行

SELECT StuCourseScore.StudentID, StuCourseScore.CourseID, Student.StudentName, Student.Sex, Student.ClassID, StuCourseScore.Score
FROM Student LEFT OUTER JOIN
     StuCourseScore ON Student.StudentID = StuCourseScore.StudentID
  说明:LEFT OUTER JOIN表示左外联接,OUTER可省略。该语句会返回‘学生表’中所有的学生信息,而不是返回与‘课程成绩表StuCourseScore’中有相同学号的学生信息。即返回左表中所有行,包括不符合查询条件的行。

图4

    对比图3,从图4中可以看出,使用左外联接后,所有学生表的学生信息都查询出来了,但一些学生在右表中没有成绩,故其课程号和成绩都显示为NULL(不存在)。
    (2)右外联接和左向外联接的用法是一样的,只是会返回右表的所有行,而不是只返回符合条件的信息。

SELECT Student.StudentID, Student.StudentName, Student.Sex, Student.ClassID, StuCourseScore.CourseID, StuCourseScore.Score
FROM Student RIGHT OUTER JOIN
     StuCourseScore ON Student.StudentID = StuCourseScore.StudentID
  说明:RIGHT OUTER JOIN表示右外联接,OUTER可省略。该语句会返回‘课程成绩表’中所有的学生成绩信息。查询结果为:

 

图5

    从图4与图5可以看出:左右外联接的返回结果区别是:左外联接是左侧表的字段没有null值,如果右侧表的字段没有符合该列的,则右侧字段用null值填充,如果左侧有多个字段和右侧相关联,则重复左侧的列填充;右联接是和左联接相反。
    3、交叉联接

    没有where子句的交叉联接返回两表的笛卡尔积,即行数等于表1和表2的行数的乘积。

SELECT Student.StudentID, Student.StudentName, Student.Sex, Student.ClassID, StuCourseScore.CourseID, StuCourseScore.Score
FROM Student, StuCourseScore

    返回结果集如下:

    从上图可以看出,前n行(n为学生表的行数)的CourseID, Score都是相同的1052105、86,即为图2中第一行学生的课程代号和成绩,下一n行为图2中第2行学生的课程代号和成绩,依次类推。

 

 
表  情:
加载中...
 

请各位遵纪守法并注意语言文明