(以下的例子中操作的数据表均来自下表)
相关概念说明:
连接查询:一个查询需要对多个表进行操作
表之间的连接:连接查询的结构集或结果表
连接字段:数据表之间的联系是通过表的字段值来体现的
连接操作的目的:从多个表中查询数据
表的连接查询的两种方法:
方法一:表之间满足一定条件的行进行连接时,From子句指明进行连接的表名,Where子句指明连接的列名及其连接条件
方法二:利用关键字Join进行连接,当Join关键词放于From子句中时,应有关键词On与之对应,以表明连接的条件。
Join关键字的相关说明:
内部连接:
例1:查询“刘伟”老师所讲授的课程,要求列出教师号、教师姓名、课程号。
方法一:select T.TNo,TN,CNo from T,TCwhere (T.TNo=TC.TNo and T.TN=’刘伟’)
方法二:select T.TNo,TN,CNo from Tinner join TC on T.TNo=TC.TNo where (TN=’刘伟’)
(注1:引用列名TNo时要加上表名前缀,这是因为两个表中的列名相同,必须用表名前缀来确切说明所指列属于哪个表,以避免二义性)
(当需要连接的表比较多时,一般用方法一较容易一些)
例2:(3个表连接查询)查询所有选课学生的学号、姓名、选课名称及成绩
Select S.SNo,SN,CN,Score from S,C,SC whereS.SNo=SC.SNo and SC.CNo=C.CNo
例3:(4个表的连接查询)查询每门课程的课程号、任课教师姓名及其职务、选课人数
Select CN,Prof,Count(SC.SNo) from C,T,TC,SC whereT.TNo=TC.TNo and C.CNo=TC.CNo and SC.CNo=C.CNo group by SC.CNo
(当一个查询需要对同一个表操作两次时需要给这个表取两个不同的别名)
例:查询所有比“刘伟”老师工资高的教师的姓名、工资和刘伟的工资。
方法一:select X.TN,X.Sal as Sal_a,Y.Sal as Sal_b fromT as X, T as Ywhere X.Sal>Y.Sal and Y.TN=’刘伟’
方法二:select X.TN,X.Sal as Sal_a,Y.Sal as Sal_b fromT as X inner join T as Y on X.Sal>Y.Sal and Y.TN=’刘伟’
方法三:select X.TN,X.Sal as Sal_a,Y.Sal as Sal_b from(select TN,Sal from T)as X inner join (select Sal from T wher e TN=’刘伟’)as Y on X.Sal>Y.Sal
外部连接:
在外部连接中,参与连接的表有主从之分,以主表的每行数据去匹配从表的数据列,符合连接条件的数据将直接返回到结果集中,对那些不符合连接条件的列,将被填上NULL值后再返回到结果集中。
例:查询所有学生的学号、姓名、选课名称及成绩(没有选课的同学的选课信息显示为空)
Select S.SNo,SN,CN,Score from Sleft outer join SC on S.SNo=SC.SNoleft outer join C on C.CNo=SC.CNo
(注:自己最好在Sql Server中新建查询,一个个实验)