SQL Server 两表关联

关联(Join)是 SQL 中最常用的操作之一,它允许我们通过共同的列将两个或多个表连接起来。在 SQL Server 中,我们可以使用不同的关联类型来满足不同的查询需求。

表的关联类型

在 SQL Server 中,常用的表关联类型包括:

  • 内连接(Inner Join)
  • 左连接(Left Join)
  • 右连接(Right Join)
  • 全连接(Full Join)

这四种关联类型的用途如下所示:

1. 内连接(Inner Join)

内连接是在两个表中只返回满足连接条件的行。如果两个表中没有满足连接条件的行,则不返回任何结果。

内连接的语法如下:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

这里的 table1table2 是要连接的两个表,column_name 是相同的列名,用于确定两个表之间的连接关系。

2. 左连接(Left Join)

左连接是以左表为基础,返回左表中的所有行和与其关联的右表中的满足连接条件的行。如果右表中没有满足连接条件的行,则返回 NULL 值。

左连接的语法如下:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

3. 右连接(Right Join)

右连接是以右表为基础,返回右表中的所有行和与其关联的左表中的满足连接条件的行。如果左表中没有满足连接条件的行,则返回 NULL 值。

右连接的语法如下:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

4. 全连接(Full Join)

全连接返回左表和右表的所有行,无论满足连接条件与否。如果左表或右表中没有满足连接条件的行,则返回 NULL 值。

全连接的语法如下:

SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;

代码示例

假设我们有两个表:StudentsCourses,它们之间有一个共同的列 student_id,我们可以使用以上提到的关联类型来连接这两个表。

首先,我们创建两个表并插入一些数据:

-- 创建 Students 表
CREATE TABLE Students (
  student_id INT PRIMARY KEY,
  student_name VARCHAR(100)
);

-- 创建 Courses 表
CREATE TABLE Courses (
  course_id INT PRIMARY KEY,
  course_name VARCHAR(100),
  student_id INT
);

-- 在 Students 表中插入数据
INSERT INTO Students (student_id, student_name)
VALUES (1, 'Tom'), (2, 'Jack'), (3, 'Alice');

-- 在 Courses 表中插入数据
INSERT INTO Courses (course_id, course_name, student_id)
VALUES (1, 'Math', 1), (2, 'English', 2), (3, 'Science', 1), (4, 'History', 3);

现在我们可以使用不同的关联类型来查询数据:

1. 内连接(Inner Join)

内连接返回满足连接条件的行。在本例中,我们将返回选修了课程的学生信息。

SELECT Students.student_name, Courses.course_name
FROM Students
INNER JOIN Courses
ON Students.student_id = Courses.student_id;

结果如下:

student_name course_name
Tom Math
Jack English
Tom Science
Alice History

2. 左连接(Left Join)

左连接返回左表中的所有行和与其关联的右表中的满足连接条件的行。在本例中,我们将返回所有学生及他们选修的课程。

SELECT Students.student_name, Courses.course_name
FROM Students
LEFT JOIN Courses
ON Students.student_id = Courses.student_id;

结果如下:

student_name course_name
Tom Math
Jack English
Tom Science
Alice History

3. 右连接(Right Join)