如何巧用SQL的外连接

时间:2016-03-31 编辑:肖兰‍ 手机版

  连接查询是关系数据库的重要组成部分和主要特点,在实际应用中,连接查询广泛应用在数据库使用的方方面面。下面是YJBYS小编为大家搜索整理了关于巧用SQL的外连接的方法,欢迎参考阅读,希望对大家有所帮助。想了解更多相关信息请持续关注我们应届毕业生培训网!

  SQL连接查询可以实现对多个表进行查询,生成的结果包含满足连接条件的记录。

  一、连接查询

  连接是两元运算,是关系的模向结合。连接运算是将两个关系模式拼接成一个更宽的关系模式,生成的新关系中包含满足连接条件的记录。

  在实际的应用中,当检索数据时,常通过连接操作查询出存放在多个表中的不同实体的信息。例如,在教师信息管理数据库中查询某教师的姓名、职称、工资、任课科目等,所需要的列有来自于教师表的姓名和职称数据列;有来自于工资表中的工资数据列;有来自于课程表中的任课科目数据列。这种涉及到多个表之间的查询就是我们所说的连接查询。

  在T-SQL中,连接查询分为两种表示形式,一是符合SQL标准的连接谓词的表示形式,二是T-SQL扩展的使用关键词JOIN的表示形式。

  1.连接谓词

  连接谓词表示形式的连接查询是在WHERE子句中使用的连接语句,在数据库语言中,也被称为隐性连接。然而,随着数据库语言的规范和发展,隐性连接已逐渐不被使用,当前的数据库语言基本上已经全部采用显性连接。

  2.使用JOIN关键词指定的连接

  T-SQL扩展了以JOIN关键词指定连接的表示方式,我们将这种以JOIN……ON子句产生的连接称为显性连接。显性连接大大增强了多表的连接运算能力。FROM子句的表示将多个表连接起来,连接语法格式如下:

  FROM join_table join_type join_table

  [ON (join_condition)]

  指出连接类型,可分为三种:内连接、外连接和交叉连接。

  1) 内连接(join 或 inner join):两个存在关联关系的表A和B,表A与表B内连接的查询结果为C,结果集C中只能包括表A与表B中满足连接条件的记录。

  2) 外连接可分为:左连接、右连接、完全外连接。

  ① 左连接(left join 或 left outer join):两个存在关联关系的表A和B,表A与表B左连接的查询结果为C。C的记录中包括A的全部记录以及B中与A满足连接条件的记录,C中A与B不满足连接条件的列值为空值。

  ② 右连接(right join 或 right outer join):右连接的含义是:两个存在关联关系的表A和B,表A与表B右连接的查询结果为C。C的记录中包括B的全部记录以及表A中与B满足连接条件的记录,C中B与A不能够满足连接条件部分为空值。

  ③ 完全外连接(full join 或 full outer join):两个存在关联关系的表A和B,表A与表B完全外连接的查询结果为C。C的记录中包括A和B的全部记录,C中B与A以及A与B不满足连接条件的部分为空值。

  3) 交叉连接(cross join):交叉连接查询返回被连接的两个表所有数据行的笛卡尔积,查询结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

  二、巧用SQL的外连接示例

  内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还可以包括左表、右表或两个连接表中的所有数据行。因此,外连接更具灵活性,查询运算功能也更强大,合理应用好外连接查询有时将起到意想不到的效果,并大大提高我们的工作效率。

  1.案例问题

  学历证书是学生在学校学习的重要凭证,对学生的就业具有重大影响。因此,学历证书的及时办理和准时发放是每一所学校都非常重视的工作。而对于技工院校,学历证书办理过程中毕业生资料的收集和整理,特别是毕业生学习成绩(含五门文化基础课成绩和五门专业课成绩)的录入又是这项工作的重中之重。需完成上报的“毕业生学习成绩表”,见图6。

  随着学校规模的不断扩大,毕业学生人数的逐年增多,学生毕业资料的整理更是越来越繁重。毕业生学习成绩的录入困难主要表现在如下几方面:

  1) “毕业生学习成绩表”要求需严格按照规定的学生学号次序和规定的十门课程的排序进行录入。

  2) 各毕业生的各科目成绩需从每个学期期末各班主任上交教学管理部门的“学生成绩总表”中查询获取。

  3) 各班主任上交的“学生成绩总表”中学生的排序通常是按学生的座位号进行排列的,而且各科目的排序也是随机的。

  因此,要完成一个班级的毕业生学习成绩表,基本上需要分别到四个学期的“学生成绩总表”中去逐一将十门课程的成绩找出来,并填入“毕业生学习成绩表”对应的位置。这是何等繁重的一项工作,传统的方式完成一个班级的成绩录入至少也得花上三个多小时。而对于整个学校几十个毕业班而言,一个部门要完成这么一项巨大的工程,这简直就是一项不可能的任务。

  为此,如何高效、快速的完成如此庞大的数据录入,减少相关学生管理部门的工作量,就是摆在我们面前的一个重要的课题。

  2.创建示例数据库

  1) 创建案例数据库和数据表

  为了进行实验分析,该文利用“毕业生花名册”(见图7)和各学期每个班主任交上来的“学生成绩总表”EXCEL表格(见图8),建立了案例数据库“DB09”,对应XM和T1两张数据表,如表1、2所示。

  2) 给数据表填充数据

  示例数据库和数据表创建完成后,我们把要查询的班级学生名单从全校的“毕业生花名册”中复制下来,并粘贴到XM数据表中。并将需查询的某一学期的该班级的学生成绩总表数据,复制粘贴到T1数据表中。至此,数据库、数据表和需查询的数据都已准备完成。

  3.编写SQL语句

  现在我们需要做的就是利用SQL语句,按照XM表的名字顺序,从T1 表中查询出需要的科目成绩。比方说,如果希望按照0915班的学生名字排序,查询同学们在2009—2010学年第一学期FLASH科目的对应成绩,则可以编写如下所示的SELECT语句:

  USE DB09

  select XM.姓名,T1.科目二 as 'FLASH'

  from XM left join T1

  on XM.姓名=T1.姓名

  order by XM.id asc

  以上语句执行的结果如图9所示。

  通过上述的SQL左外连接示例,我们轻轻松松实现了对0915班FLASH科目的成绩查询,这跟手工逐一筛选相比,无疑前进了一大步。然而,我们仅仅实现了对一个学期一门科目的成绩查询,那么,我们能不能够使用同样的方法,实现同时对多个学期多门科目的成绩查询呢?答案显然是肯定的。

  下面,我们以0915班为例,以每学期的“学生成绩总表”建立相对应的数据表,分别为:T1、T2、T3、T4。再按照学生名字的排序,查询出同学们第一学期的FLASH,第二学期的英语和语文,第三学期的政治和计算机网络管理,第四学期的数学、体育、中文VF、网页制作和ASP程序设计科目的对应成绩。实现的SELECT语句如下:

  USE DB09

  select xm.姓名,T3.科目五 as '政治',T2.科目七 as '语文',T4.科目六 as '数学',T2.科目六 as '英语',T4.科目七 as '体育',T1.科目二 as 'FLASH',T4.科目一 as '中文VF',T4.科目四 as 'ASP程序设计',T3.科目二 as '计算机网络管理',T4.科目三 as '网页制作'

  from xm left join T1 on T1.姓名=xm.姓名

  left join T2 on T2.姓名=xm.姓名

  left join T3 on T3.姓名=xm.姓名

  left join T4 on T4.姓名=xm.姓名

  order by XM.id asc

  上述语句执行的结果如图10所示。

  通过对SELECT语句进一步的优化和扩展,我们一步到位,一次执行即可完成一个班级的毕业生学习成绩表,将这项原本“不可能的任务”变得轻而易举,大大减少了相关学生管理部门的工作量,为学校每年学历证书的及时办理提供了强有力的保障和支持。

  SQL是一门 ANSI 的标准计算机语言,集数据操纵、数据定义和数据控制等功能于一体,用于存取数据以及查询、更新和管理关系数据库系统。数据库的查询正是SQL语言的核心内容,也是我们最常用的操作。而连接查询又是关系数据库中最主要的查询,在实际中被广泛应用。如何在各行各业中灵活、科学地使用数据库技术,提高工作效率具有很现实的意义。

如何巧用SQL的外连接相关推荐
最新推荐
热门推荐