MSSQL实现多表之间的关联关系

多表关联简介

关系型数据库中,不同数据表之间通过某种关联方式连接起来,形成一个整体,这样就可以更充分的利用数据。多表关联是指将多个表中的数据进行连接,以便于查询和分析,常使用的关联方式有内连接、左外连接和右外连接等几种。在MSSQL中,我们可以利用JOIN语句来实现这些关联方式。

内连接

定义

内连接是指将两个或多个表中的满足某些条件的行进行连接,只返回能够匹配的数据。

语法

SELECT 列名1,列名2…

FROM 表1

INNER JOIN 表2

ON 表1.列名=表2.列名;

其中,INNER JOIN用来连接两个表,ON后面的条件则用来指定连接的条件。

示例

下面我们以一个实际案例来演示内连接的用法:

假设我们有两个表,一个是学生表(Student),包括学号(StuNo)、姓名(StuName)、班级编号(ClassNo)等字段;另一个是班级表(Class),包括班级编号(ClassNo)、班级名称(ClassName)、年级(Grade)等字段。我们要查询出学生的姓名和所在班级的年级和班级名称:

SELECT s.StuName, c.Grade, c.ClassName

FROM Student s

INNER JOIN Class c

ON s.ClassNo = c.ClassNo;

执行上述SQL语句后,我们会得到如下结果:

StuName Grade ClassName
小明 2020级 一班
小红 2019级 二班
小强 2020级 一班

以上结果中,我们查询出了所有学生的姓名、所在班级的年级和班级名称,注意,我们只查询出了两个表中都有的班级编号相同的记录,这就是内连接的本质。

左外连接

定义

左外连接是指将两个或多个表中的所有行进行连接,同时返回左表中所有的行和右表中与左表中行匹配的行。

语法

SELECT 列名1,列名2…

FROM 表1

LEFT JOIN 表2

ON 表1.列名=表2.列名;

其中,LEFT JOIN用来连接两个表,ON后面的条件则用来指定连接的条件。

示例

我们还是以上述的学生表(Student)和班级表(Class)为例来演示左外连接的用法。这次,我们要将学生表中所有的记录都查询出来,同时如果某个学生所在的班级没有对应的记录,则年级和班级名称列填充NULL。

SELECT s.StuName, c.Grade, c.ClassName

FROM Student s

LEFT JOIN Class c

ON s.ClassNo = c.ClassNo;

执行上述SQL语句后,我们会得到如下结果:

StuName Grade ClassName
小明 2020级 一班
小红 2019级 二班
小强 2020级 一班
小白 NULL NULL

以上结果中,我们查询出了所有学生的姓名,并返回其对应的班级的年级和班级名称,注意,由于学生表中有一个学生的班级编号在班级表中没有对应记录,因此查询结果中会多出一个学生,对应的班级信息列都是NULL。

右外连接

定义

右外连接是指将两个或多个表中的所有行进行连接,同时返回右表中所有的行和左表中与右表中行匹配的行。

语法

SELECT 列名1,列名2…

FROM 表1

RIGHT JOIN 表2

ON 表1.列名=表2.列名;

其中,RIGHT JOIN用来连接两个表,ON后面的条件则用来指定连接的条件。

示例

我们还是以上述的学生表(Student)和班级表(Class)为例来演示右外连接的用法。这次,我们要查询出所有的班级记录,同时如果某个班级没有学生,则学生姓名列填充NULL。

SELECT s.StuName, c.Grade, c.ClassName

FROM Student s

RIGHT JOIN Class c

ON s.ClassNo = c.ClassNo;

执行上述SQL语句后,我们会得到如下结果:

StuName Grade ClassName
小明 2020级 一班
小红 2019级 二班
小强 2020级 一班
NULL 2019级 三班

以上结果中,我们查询出了所有班级的名称,并返回其对应的学生的姓名和所在年级,注意,由于班级表中有一个班级的班级编号在学生表中没有对应记录,因此查询结果中会多出一个班级,对应的学生姓名列都是NULL。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

数据库标签