SQL左右连接详解

在SQL中,"左右链接"通常指的是LEFT JOIN(左连接)和RIGHT JOIN(右连接)。这里用一个简单的方式解释这两种连接方式。

LEFT JOIN (左连接)

想象一下,你有一个班级的学生名单,这是你的"左表"。然后你有另一个表,记录了哪些学生交了作业,这是你的"右表"。现在,你想知道每个学生是否交了作业。

  • LEFT JOIN 就像是你在检查学生的作业情况时,会从你的学生名单开始。对于名单上的每一个学生,你会查找他们是否在交作业的记录中出现过。如果找到了,就把这两个信息连在一起;如果没有找到,那么对于那些没有交作业记录的学生,就会显示为NULL。

简单来说,LEFT JOIN会保留所有左表中的记录,并且只保留右表中匹配的记录。如果不匹配,则显示为NULL。

RIGHT JOIN (右连接)

还是用上面的例子,但是这次你想从作业记录表开始,这个表是你现在关注的"右表"。

  • RIGHT JOIN 就是你会检查每一份交上来的作业,并且查看是哪个学生交的。对于每一份作业,你都会去找这个学生的名字出现在你的学生名单上。如果找到了,就把两个信息连起来;如果没有找到,那么就会出现NULL。

换句话说,RIGHT JOIN会保留所有右表中的记录,并且只保留左表中匹配的记录。如果不匹配,则显示为NULL。

总结

  • LEFT JOIN: 以左表为主,保留左表的所有行,对于右表未匹配到的行,用NULL填充。
  • RIGHT JOIN: 以右表为主,保留右表的所有行,对于左表未匹配到的行,用NULL填充。

如果你想要的是两边都包含的数据,可以考虑使用INNER JOIN来只获取两个表中都有数据的部分,或者使用FULL OUTER JOIN来获取两个表中所有的数据,不论是匹配与否。不过需要注意的是,FULL OUTER JOIN并不是所有数据库系统都支持的。

假设我们有两个表:一个是Students表,一个是Grades表。Students表包含了学生的信息,而Grades表包含了学生的成绩记录。

表结构示例
复制代码
CREATE TABLE Students (
    StudentID int,
    Name varchar(255),
    Age int
);

CREATE TABLE Grades (
    StudentID int,
    Subject varchar(255),
    Grade int
);
插入数据
复制代码
INSERT INTO Students (StudentID, Name, Age)
VALUES (1, 'Alice', 15),
       (2, 'Bob', 16),
       (3, 'Charlie', 17),
       (4, 'David', 18);

INSERT INTO Grades (StudentID, Subject, Grade)
VALUES (1, 'Math', 90),
       (2, 'Science', 85),
       (2, 'History', 80),
       (3, 'English', 75),
       (4, 'Physics', 88);
LEFT JOIN 示例

如果我们想找出所有学生以及他们的成绩记录,我们可以使用LEFT JOIN:

复制代码
SELECT Students.Name, Grades.Subject, Grades.Grade
FROM Students
LEFT JOIN Grades ON Students.StudentID = Grades.StudentID;

这条语句将返回所有学生的姓名,以及他们在不同科目中的成绩。如果有学生没有成绩记录,那么对应的Subject和Grade字段将会是NULL。

输出结果可能如下:

复制代码
Name   | Subject | Grade
-----------------------------
Alice  | Math    | 90
Bob    | Science | 85
Bob    | History | 80
Charlie| English | 75
David  | Physics | 88

注意:由于Bob有两门课的成绩,所以Bob的名字会出现在输出结果中两次。

RIGHT JOIN 示例

如果我们对成绩表更感兴趣,想找出所有科目的成绩记录以及对应的学生名字,我们可以使用RIGHT JOIN:

复制代码
SELECT Students.Name, Grades.Subject, Grades.Grade
FROM Students
RIGHT JOIN Grades ON Students.StudentID = Grades.StudentID;

这条语句将返回所有成绩记录及其对应的学生名字。如果某个成绩记录对应的学生不存在于Students表中,那么Name字段将会是NULL。

假设我们删除了一个学生记录,但该学生的成绩记录还存在于Grades表中,那么使用RIGHT JOIN将会显示出这名学生的信息为NULL。

相关推荐
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
-SGlow-5 小时前
MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
linux·运维·服务器·数据库·mysql
明月5666 小时前
Oracle 误删数据恢复
数据库·oracle
YuTaoShao6 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨7 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4047 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
♡喜欢做梦8 小时前
【MySQL】深入浅出事务:保证数据一致性的核心武器
数据库·mysql
遇见你的雩风8 小时前
MySQL的认识与基本操作
数据库·mysql