内部联接:为了处理好同时涉及到多个表中数据的检索和操作,关系数据库管理系统都支持多表联接查询。access中允许一个查询**现的联接个数最多为16。
例1. 查询所有教师数据,显示他们的教师编号、姓名和所在学院名称,结果按教师编号排序。
select 教师编号,姓名,学院名称。
from 教师 inner join 学院
on 教师。学院编号=学院。学院编号。
order by 教师编号。
在select后的字段列表**现了来自不同表中的字段,表示结果集中的数据列将从多个表中获取。在列举这些字段时,需注意它们应该是from子句列举的作为查询数据**的那些表中存在的字段。
如果在联接查询中,所引用的字段名不同时存在于所涉及的多个表中,可以不加前缀而直接引用;如果引用的字段名同时存在于所涉及的多个表中,在字段名前就应该加表名和点号作为前缀,以指示查询从那个表中取相应字段数据。
from子句出现了两个表名,即:“教师”和“学院”,并且在两个表名间使用了用来确定两个表之间联接方式的关键词:inner join。
在联接关键词左面的称为左表,在右面的称为右表。
使用inner join联接相关的两个表时,使查询按这样的方式进行:如果其中一个联接表中的行与另一个表中的行相对应,则由这两个行中的数据联接形成逻辑上的数据行。
这里所谓的相对应,通常是指这两个联接表中存在由联接条件所指出的公共值。联接条件在on后给出。本例中为:教师。学院编号=学院。学院编号。
在内部联接中描述联接条件时,通常使用等号来构成联接表达式,并且引用左、右表中具有相同意义和类型的字段。
在处理具有一对多联系的表间的联接查询时,通常是通过两个表的主键和外键进行联接。查询结果与左右表的顺序无关。
内部联接要求联接双方具有完全对应的行。否则,一个表中存在的某行而在另一个表中找不到具有相同值的行时,这一行就不可能被查询到。
为了实现三个表的内部联接,使用二个内部联接。第一个内部联接被用括号括起来,表示以括号内的联接结果作为联接对象,再通过inner join与后面的表进行内部联接。
依此类推,如果需要与第四个表联接的话,应该把当前三个表的联接再用一对括号括起来作为联接对象,与后面的表相联接。
例2. 查询所有来自四川地区的男同学的学号、姓名、班级名称和学院名称,结果按学号排序。
select 学生。学号, 学生。姓名, 班级。班级名称, 学院。学院名称。
from (学生 inner join 班级
on 学生。班级编号=班级。班级编号)
inner join 学院
on 班级。学院编号=学院。学院编号。
where 学生。地区="四川" and 学生。性别="男"
order by 学生。学号。
或。select 学生。学号, 学生。姓名, 班级。班级名称, 学院。学院名称。
from (学院 inner join 班级
on 学院。学院编号=班级。学院编号)
inner join 学生
on 班级。班级编号=学生。班级编号。
where 学生。地区="四川" and 学生。性别="男"
order by 学生。学号。
例3. 查询“商务学院”所有学生的各项数据及班级名称,结果按学号排序:
select 学生。*,班级名称。
from (学院 inner join 班级
on 学院。学院编号=班级。学院编号)
inner join 学生
on 班级。班级编号=学生。班级编号。
where 学院名称="商务学院"
order by 学号。
或select班级。班级名称, 学生。*
from 学生, 班级, 学院。
where
(学生。班级编号=班级。班级编号) and
(班级。学院编号=学院。学院编号) and
(学院。学院名称="商务学院")
order by 学生。学号。
在from子句中列举了本次查询所用到的表,但没有在这里说明如何联接,那么就应该在where子句中说明。
外部联接。内部联接要求联接双方具有完全对应的行。否则,一个表中存在的某行而在另一个表中找不到具有相同值的行时,这一行就不可能被查询到。
但现实中存在着这样一种可能:
一个学院刚创建时,尚未包含班级,在查询各学院班级目录时,该学院即使没有班级但学院名称也应该出现在目录之中;当列举某班学生参加的考试课程清单时,如果一个学生因病缓考本次考试表中没有相应数据,但作为该班的学生,他(她)的学号和姓名还是应该出现在清单之中的。此时,使用内部联接就无法完成相应的查询任务了。
在进行联接查询时,如果希望某个表中的记录在另一个表中找不到完全对应记录的情况下仍出现在结果集中,可以采用外部联接。
sql语言支持用来完成不完全对应的联接,此类联接称为外部联接。
外部联接有左外部联接和右外部联接两种。
如果希望联接中一个表的所有行都包括在结果中,并且希望查询只返回另一个表中与第一个表中的联接字段匹配的那些行,可以使用外部联接。
左外联接。在左外部联接中,对于 sql 语句 from 子句中的第一个(左)表,查询包括所有行;对于另一个(右)表,则只包括两个表的联接字段值能匹配的行。
右外联接。在右外部联接中,对于 sql 语句 from 子句中的第二个(右)表,查询包括所有行;对于另一个(左)表,则只包括两个表的联接字段值能匹配的行。
例4. 查询编号大于“13”的学院的班级目录。
select 学院。学院名称, 班级。班级名称, 学院。学院编号。
from 学院 left outer join 班级
on 学院。学院编号 = 班级。学院编号。
where 学院。学院编号》="13"
不能写成。select 学院。学院名称, 班级。班级名称, 学院。学院编号。
from 学院 left outer join 班级
on 学院。学院编号 = 班级。学院编号。
where 班级。学院编号》="13"
例5. 查询教师名单,显示教师编号、姓名和所在学院名称,结果按学院名称和教师编号排序。
select 学院。学院名称,教师。教师编号,教师。姓名。
from 学院 right outer join 教师
on 学院。学院编号 = 教师。学院编号。
order by 学院。学院名称,教师。教师编号。
习题1. 查询各学院所有人数超过50人的班级。
习题2.查询学号为***的同学所参加的考试场次、教室和课程名称。
习题3. 查询来自湖南的学生所在的学院名称、班级名称、学号和姓名。
习题4. 查询编号大于“13”的学院的班级目录。
习题5. 查询教师名单,显示教师编号、姓名和所在学院名称,结果按学院名称和教师编号排序。
练习 特殊选择查询 交叉表查询 操作查询
练习特殊选择查询 交叉表查询 操作查询。实验目的 特殊选择查询 交叉表查询 操作查询的建立方法。把教学管理系统。mdb改名为教学管理系统 是你的名字 1.特殊选择查询。重复项查询 海量记录中查找少量重复记录 在 教学管理系统 数据库中查找学生表中同名同姓的学生情况。要求显示相同姓名的所有字段,并保存...
2019查询练习
查询练习1 班级 学号 姓名 通过查询的 设计视图 完成以下操作 1.显示 学生基本情况表 表中所有字段和记录。2.显示 1995年10月 出生或 1997年3月2日 出生的学生信息。3.查询会计学院的非党员学生。4.显示学生的姓名和年龄清单。5.查询姓名中最后一个字是 海 的学生信息。6.查询选修...
SQL查询练习
下面以学生 课程数据库 xs kc 为例介绍。该数据库中有学生情况表 xsqk 课程表 xskc 学生成绩表 xscj xsqk 学号 姓名 出生年月 系别 专业 班级。xskc 课程号课程名学分。xscj 学号课程号成绩。1 查询学生情况表中全体学生的信息。select from xsqk 2 查...