查询MSSQL实现三张表全连接查询的简易方法

什么是全连接查询

全连接查询是SQL查询语言中的一项基本操作,用于查询两个或多个表格中的所有数据,即使其中某些数据没有匹配项。这种类型的查询由一列或多列连接两个或多个表格,使得在结果表格中,每个表格的行都可以对应到另一个表格的行,而且即使没有对应值,查询结果也会返回。

在MSSQL中,实现三张表的全连接查询,通常会结合使用多个关键字和语句,比如SELECT、FROM、LEFT JOIN、RIGHT JOIN等等。

三张表全连接查询实现的步骤

创建数据库及准备数据

在实现三张表全连接查询之前,首先需要创建一个数据库,并准备好三张表格和数据。在这里,我们以一个学校数据库为例,创建一个包含学生、课程和成绩三张表格的数据库。

CREATE DATABASE school;

GO

USE school;

GO

--创建学生表格

CREATE TABLE students (

id INT PRIMARY KEY,

name VARCHAR(50),

gender VARCHAR(10),

age INT,

);

--创建课程表格

CREATE TABLE courses (

id INT PRIMARY KEY,

name VARCHAR(50),

teacher VARCHAR(50),

);

--创建成绩表格

CREATE TABLE scores (

id INT PRIMARY KEY,

student_id INT,

course_id INT,

score INT,

);

接着,我们在每张表格中添加数据。

--向学生表格中插入数据

INSERT INTO students (id, name, gender, age) VALUES (1, '张三', '男', 18);

INSERT INTO students (id, name, gender, age) VALUES (2, '李四', '女', 20);

INSERT INTO students (id, name, gender, age) VALUES (3, '王五', '男', 19);

--向课程表格中插入数据

INSERT INTO courses (id, name, teacher) VALUES (1, '语文', '张老师');

INSERT INTO courses (id, name, teacher) VALUES (2, '英语', '李老师');

INSERT INTO courses (id, name, teacher) VALUES (3, '数学', '王老师');

--向成绩表格中插入数据

INSERT INTO scores (id, student_id, course_id, score) VALUES (1, 1, 1, 80);

INSERT INTO scores (id, student_id, course_id, score) VALUES (2, 1, 2, 90);

INSERT INTO scores (id, student_id, course_id, score) VALUES (3, 1, 3, 85);

INSERT INTO scores (id, student_id, course_id, score) VALUES (4, 2, 1, 70);

INSERT INTO scores (id, student_id, course_id, score) VALUES (5, 2, 2, 80);

INSERT INTO scores (id, student_id, course_id, score) VALUES (6, 2, 3, 75);

INSERT INTO scores (id, student_id, course_id, score) VALUES (7, 3, 1, 90);

INSERT INTO scores (id, student_id, course_id, score) VALUES (8, 3, 2, 85);

INSERT INTO scores (id, student_id, course_id, score) VALUES (9, 3, 3, 90);

使用LEFT JOIN查询

MSSQL中,我们可以使用LEFT JOIN语句实现左连接。

左连接返回所有左表的行,以及右表中与左表的对应值匹配上的行。如果左表中的某个行在右表中没有对应的行,则结果集中该行对应的右表行的所有列都为空。

我们可以根据以上原则,将学生表格、课程表格和成绩表格通过LEFT JOIN语句实现左连接,以便同时查询三张表中的数据。

SELECT s.name, c.name, k.score

FROM students s

LEFT JOIN scores k ON s.id = k.student_id

LEFT JOIN courses c ON c.id = k.course_id;

在以上SQL语句中,我们首先给每个表格定义了一个简称,以便在JOIN语句中使用。

LEFT JOIN语句中,我们首先以学生表格为左表格,以成绩表格为右表格,以学生表格中的学号id和成绩表格中的student_id进行匹配,并通过ON关键字将其连接起来。

为了实现三张表格的左连接,我们接着以课程表格为右表格,以成绩表格为左表格,以课程表格中的id和成绩表格中的course_id进行匹配,并通过ON关键字将其连接起来。

使用RIGHT JOIN查询

除了LEFT JOIN之外,MSSQL还提供RIGHT JOIN语句,用于实现右连接。

与左连接类似,右连接返回所有右表的行,以及左表中与右表的对应值匹配上的行。如果右表中的某个行在左表中没有对应的行,则结果集中该行对应的左表行的所有列都为空。

我们可以根据以上原则,将学生表格、课程表格和成绩表格通过RIGHT JOIN语句实现右连接,以便同时查询三张表格中的数据。

SELECT s.name, c.name, k.score

FROM courses c

RIGHT JOIN scores k ON c.id = k.course_id

RIGHT JOIN students s ON s.id = k.student_id;

在以上SQL语句中,我们采用了与LEFT JOIN语句类似的连接方式,不同之处在于首先以课程表格为右表格,以成绩表格为左表格,以课程表格中的id和成绩表格中的course_id进行匹配,并通过ON关键字将其连接起来。

为了实现三张表的右连接,我们接着以学生表格为右表格,以成绩表格为左表格,以学生表格中的学号id和成绩表格中的student_id进行匹配,并通过ON关键字将其连接起来。

使用INNER JOIN查询

除了左连接和右连接之外,MSSQL还提供INNER JOIN语句,用于实现内连接。

内连接只返回两个表格中共同匹配的结果。即只保留两个表格中都有的行,并去除没有匹配的行。

我们可以根据以上原则,将学生表格、课程表格和成绩表格通过INNER JOIN语句实现内连接,以便同时查询三张表格中的数据。

SELECT s.name, c.name, k.score

FROM students s

INNER JOIN scores k ON s.id = k.student_id

INNER JOIN courses c ON c.id = k.course_id;

在以上SQL语句中,我们依然先以学生表格为左表格,以成绩表格为右表格。在左连接的语句基础上,去掉了LEFT关键字,即实现了内连接。

为了实现三张表格的内连接,我们接着以课程表格为右表格,以成绩表格为左表格,并通过ON关键字将其连接起来。

结果比较

以上三种方法分别实现了三张表格的全连接查询。但是三种方法的查询结果是不同的。

以学生表格、成绩表格和课程表格为例,我们可以发现:

使用LEFT JOIN语句实现的查询结果会包括左连接和右连接中的所有行,两个表格之间匹配不上的行全部被保留下来,并以空值代替。

使用RIGHT JOIN语句实现的查询结果也会包括左连接和右连接中的所有行,两个表格之间匹配不上的行全部被保留下来,并以空值代替。

使用INNER JOIN语句实现的查询结果只会保留左表格和右表格中匹配上的行。

因此,根据具体情况选择合适的方法进行全连接查询,才能得出符合需求的查询结果。

小结

本文介绍了在MSSQL中实现三张表格的全连接查询的三种方法:LEFT JOIN、RIGHT JOIN、INNER JOIN。

通过对三种方法的实现和介绍,我们可以清楚地了解到每种方法的具体原理和适用场景,从而可以根据实际需求选择合适的方法进行操作。

数据库标签