SQL - 右连接:初学者的全面指南

欢迎,未来的数据库大师们!今天,我们将深入探索SQL右连接的神奇世界。如果你之前从未编写过一行代码,也不用担心——我会作为你在这个旅程中的友好向导。在本教程结束时,你将能够像专业人士一样进行右连接!

SQL - Right Join

SQL右连接:你新的最佳朋友

什么是右连接?

让我们从基础开始。右连接就像邀请你一组朋友(让我们称之为右表)参加一个派对,然后检查他们是否在另一组(左表)中有共同的朋友。如果有,太好了!如果没有,也不要紧——他们仍然可以来参加派对。

在SQL术语中,右连接返回右表(table2)的所有记录,以及左表(table1)的匹配记录。如果没有匹配,结果在左侧为NULL。

基本语法

下面是一个基本的右连接示例:

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

让我们分解一下:

  • 我们选择我们想看到的列
  • 我们从table1(我们的左表)开始
  • 我们用RIGHT JOIN将它与table2(我们的右表)连接
  • 我们使用ON子句指定它们是如何连接的

一个简单的例子

假设我们有两个表:Employees(员工)和Departments(部门)。并不是所有部门都有员工,但我们希望看到所有部门,即使它们是空的。

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;

这个查询将显示所有部门,即使它们没有员工。对于没有员工的部门,Name列将显示NULL。

使用右连接连接多个表:越多越热闹!

有时候,两个表还不够。假设我们想从一个Salaries(薪水)表中添加薪水信息。

SELECT e.Name, d.DepartmentName, s.Salary
FROM Employees e
RIGHT JOIN Departments d ON e.DepartmentID = d.DepartmentID
RIGHT JOIN Salaries s ON e.EmployeeID = s.EmployeeID;

在这里,我们使用表别名(e, d, s)来使我们的查询更具可读性。这个查询将显示所有部门和所有薪水,即使没有匹配的员工。

专业提示:顺序很重要

当使用右连接连接多个表时,连接的顺序可能会影响结果。总是从你想要确保完全表示的表开始(在这个例子中是Departments)。

右连接与WHERE子句:挑剔一点

有时候,我们想要对我们的数据更挑剔一些。这时,WHERE子句就派上用场了。

SELECT e.Name, d.DepartmentName
FROM Employees e
RIGHT JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE d.Location = 'New York';

这个查询将显示所有位于纽约的部门,以及这些部门的任何员工。

找到孤独的部门

想要找到没有员工的部门吗?下面是如何操作的:

SELECT d.DepartmentName
FROM Employees e
RIGHT JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE e.EmployeeID IS NULL;

这个查询使用右连接来包含所有部门,然后过滤掉那些没有找到员工的部门。

一切结合:现实世界的场景

让我们假设我们正在运行一个学校数据库。我们有Students(学生)、Classes(班级)和Enrollments(报名)表。我们想要查看所有班级,报名的学生数量以及平均成绩。

SELECT
c.ClassName,
COUNT(s.StudentID) AS EnrolledStudents,
AVG(e.Grade) AS AverageGrade
FROM Classes c
LEFT JOIN Enrollments e ON c.ClassID = e.ClassID
LEFT JOIN Students s ON e.StudentID = s.StudentID
GROUP BY c.ClassName;

这个查询将显示所有班级,即使没有学生报名。COUNT和AVG函数将适当地处理NULL值。

常见的右连接方法

下面是一个你可能发现有用的常见右连接方法表:

方法 描述 示例
基本右连接 连接两个表,保留右表的所有记录 SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id
带WHERE的右连接 过滤右连接的结果 SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id WHERE table2.column = 'value'
多重右连接 连接两个以上的表 SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id RIGHT JOIN table3 ON table2.id = table3.id
使用USING的右连接 当列名相同时简化连接条件 SELECT * FROM table1 RIGHT JOIN table2 USING (id)
带GROUP BY的右连接 对右连接的结果进行分组 SELECT table2.column, COUNT(*) FROM table1 RIGHT JOIN table2 ON table1.id = table2.id GROUP BY table2.column

记住,熟能生巧!不要害怕在自建的数据库上尝试这些查询。快乐编码,愿JOIN与你同在!

Credits: Image by storyset