多表关联简介
关系型数据库中,不同数据表之间通过某种关联方式连接起来,形成一个整体,这样就可以更充分的利用数据。多表关联是指将多个表中的数据进行连接,以便于查询和分析,常使用的关联方式有内连接、左外连接和右外连接等几种。在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。