内容正文:
第六单元 高级查询
任务6.1多表连接查询
任务6.2使用子查询
6.1.1 情景描述
6.1.2问题分析
6.1.3 解决方案
6.1.4 知识总结
6.1.5 应用实践
任务6.1 多表连接查询
在学生信息管理系统里,需要每学期为每位老师安排教学任务。针对学校的具体情况,需要在排课时间段显示还没有排课的老师的信息,保证每个老师都有教学任务。
6.1.1 情景描述
为了解决上述问题,需要完成以下任务:
1.查询显示所有老师的排课信息,不管有没有教学任务,都要显示老师的信息,如果有排课任务,就在授课表中有对应的课程编号信息;如果没有排课任务,就在对应的课程编号字段显示为NULL。
2.再用条件“课程编号 IS NULL”过滤没有教学任务的教师信息。
3.执行查询语句。
6.1.2问题分析
1.打开SQL Server Management Studio,单击“对象资源管理器”中的“数据库”文件夹下的数据库“学生管理”;
2.单击工具栏上的“新建查询”命令,打开“查询编辑器”;
3.在“查询编辑器”上输入以下代码:
6.1.3 解决方案
4.单击工具栏上的【执行】按钮,如图所示。
SELECT js.教师编号,教师姓名,职称,sk.班级代码,sk.课程编号
FROM 教师 AS js LEFT JOIN 授课 AS sk
ON js.教师编号=sk.教师编号
WHERE sk.课程编号 IS NULL
内连接
外连接
交叉连接
6.1.4 知识总结
内连接(INNER JOIN)将两个表中满足连接条件的记录组合在一起,通过比较数据源表间公共列的值,从多个源表检索符合条件的行的操作。
内连接查询可以通过两种方式实现
一种在WHERE子句中指出连接条件
SELECT 字段列表 FROM 表名列表
WHERE 连接条件
另外一种使用INNER JOIN关键字查询。
SELECT 字段列表 FROM 表名1 INNER JOIN
表名2 ON 表名1.字段名=表名2.字段名
内连接
SELECT 学号,姓名,性别,班级名称
FROM 学生,班级
WHERE 学生.班级编号=班级.班级代码
【例6-1】在学生管理数据库里查询显示学生的学号、姓名、性别、班级名称。
①打开SQL Server Management Studio,在工具栏上单击“新建查询”按钮,打开SQL编辑器,编写如下代码:
②单击工具栏上的【执行】按钮,运行结果如图所示。
说明:
FROM子句中的表名是要查询的字段所在的表。
可以通过“表名.列名”来引用表中的列,防止两个表中都有同样的字段,引起歧义。
可以在表名的后面使用AS关键字来为表定制表别名,那么就可以用“表别名.列名”来引用表中的列。
SELECT 班级代码,班级名称,b.专业代码,专业名称
FROM 班级 AS b ,专业 AS z
WHERE b.专业代码=z.专业代码
【例6-2】在学生管理数据库里查询显示班级代码、班级名称、专业代码、专业名称。
①打开SQL Server Management Studio,在工具栏上单击“新建查询”按钮,打开SQL编辑器,编写如下代码:
②单击工具栏上的【执行】按钮,运行结果如图所示。
说明:
表名后面用AS关键字对表重命名,用b代替班级表,用z代替专业表。
使用“表别名.列名”来区分班级表和专业表共有的“专业代码”列。
SELECT xs.学号,姓名,kc.课程编号,课程名称,成绩
FROM 选课 AS xk , 学生 AS xs ,课程 AS kc
WHERE xk.学号=xs.学号 AND xk.课程编号 =kc.课程编号
【例6-3】在学生管理数据库里查询显示学号、姓名、课程编号、课程名、成绩。
①打开SQL Server Management Studio,在工具栏上单击“新建查询”按钮,打开SQL编辑器,编写如下代码:
②单击工具栏上的【执行】按钮,运行结果如图所示。
说明:
查询显示的结果在选课表、学生表和课程表三张表中。
表名后面用AS关键字对表重命名,用xk代替选课表,用xs代替学生表,用kc代替课程表。
选课表和学生表都有“学号”字段,在查询语句中使用到“学号”字段,就用“表别名.列名”来区是哪个表中的列;同理,也要区分选课表和课程表的公共字段“课程编号”。
在WHERE的连接条件中是三个表的连接,区分表之间关联的列,选课表和学生表之间的关联,选课表与课程表之间有关联,使用AND运算符将两个关联条件组合在一起。
SELECT 学