什么是全连接查询
全连接查询是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。
通过对三种方法的实现和介绍,我们可以清楚地了解到每种方法的具体原理和适用场景,从而可以根据实际需求选择合适的方法进行操作。