在上面介绍的学员内部测试成绩查询中,每次显示的都是学员的编号信息,因为该表中只存储了学员的编号。实际上最好显示学员的姓名,而姓名却存储在学员信息表中,像这种需要从多个表中选择或者比较数据项的情况,就需要使用到多表联接查询。
 
1.多表查询分类:
内联接(INNER JOIN)
内连接是最典型、最常用的连接查询,它根据表中共同的列来进行匹配,只有满足匹配条件的数据才能够被查询出来。通常,两个表存在主外键关系时会使用到内连接查询。内联接查询通常会使用像“=”比较运算符来判断两列数据项是否相等,例如,根据学生成绩表里的学员编号信息来关联出学员基本信息表里学生姓名,并显示在查询结果里。
内连接查询使用Inner Join关键字或者直接在Where条件里通过表达式来进行表之间的关联。例如,
Select  S.SName,C.CourseID,C.Score
From  Score as C
INNER JOIN  Students as S
On  (C.StudentID = S.Scode)
T-SQL根据查询详解--多表连接查询_查询
T-SQL根据查询详解--多表连接查询_详解_02
T-SQL根据查询详解--多表连接查询_查询_03
内联接查询通常不仅仅联接两个表,有时候还会牵涉到三个表或者更多的表。例如除了学员信息表、学员成绩表之外,还存在课程名称表,上面的查询不仅仅要显示学员姓名、分数,而且要通过课程编号来显示课程名称表中对应课程的名称,可以使用以下的三表联接查询的SQL语句来实现
 
案例需求:数据库中存在学员信息、学员成绩,课程名称三张表,要求查询结果不仅要显示学员姓名、分数,而且要通过课程编号来显示课程名称表中对应课程的名称
 
Select  S.SName as 学员姓名, CS.CourseName as 课程名称, C.Score as 考试成绩
From Students as S ,Score as C,Course as CS
Where S.Scode = C.StudentID and
CS.CourseID = C.CourseID
 
Select  S.SName as 学员姓名, CS.CourseName as 课程名称, C.Score as 考试成绩
From Students as S
INNER JOIN Score as C On (S.SCode = C.StudentID)
INNER JOIN Course as CS On (CS.CourseID = C.CourseID)
 
外联接
外联接的作用:在外部联接中参与联接的表有主从之分,以主表的每行数据去匹配从表的数据列,符合联接条件的数据将直接返回到结果集中;对那些不符合联接条件的列,将被填上Null值(空值)后再返回到结果集中。
外联接的分类:左外联接、右外联接、完整外联接
案例需求:要统计所有学员的考试情况,要求显示所有参加考试学员的每次考试分数,没有参加考试的学员也要显示出来。这时候,以学员信息表为主表、学员成绩表为从表的左外联接查询:
实现的语句如下:
Select  S.SName, C.CourseID,C.Score
From Students as S
Left Outer Join Score as C On S.SCode = C.StudentID
T-SQL根据查询详解--多表连接查询_休闲_04T-SQL根据查询详解--多表连接查询_数据库_05
T-SQL根据查询详解--多表连接查询_查询_06
 
右外联接查询
案例需求:在出版社数据库中,在书名表Titles和出版社Publishers表之间的右外联接查询,列出所有的出版商和对应的书名.如果出版商没有对应书名,则对应书名为NULL.表结构如下所示:
实现的语句如下:
Select Titles.Title_id, Titles.Title, Publishers.Pub_name
From titles
Right Outer Join Publishers On Titles.Pub_id = Publishers.Pub_id
T-SQL根据查询详解--多表连接查询_职场_07
T-SQL根据查询详解--多表连接查询_查询_08
交叉联接(CROSS JOIN)
交叉联接就是表之间没有如何关联条件,查询将返回左表和右表挨个连接的所有行,就是左表中的每一行右表中的所有行再一一组合,相当于两个表“相乘”。