数据库表的连接方式(超详细讲解)

左连接

在SQL中,LEFT JOIN 是一种用于合并两个表的连接方式。它会返回左表(第一个表)中的所有记录,以及右表(第二个表)中与左表匹配的记录。如果右表中没有匹配的记录,则结果集中将包含NULL值。

左连接的基本语法

SELECT 表1.列, 表2.列, ...
FROM 表1
LEFT JOIN 表2
ON 表1.匹配列 = 表2.匹配列;

左连接的特征

  1. 包含左表所有记录:无论右表是否有匹配的记录,左表中的每一行都会出现在结果集中。

  2. 右表匹配行:如果右表中有与左表匹配的记录,则显示这些记录。如果没有匹配的记录,则结果中包含NULL值。

示例

假设有两个表:学生 和 成绩

学生表

学生ID学生姓名
1张三
2李四
3王五

成绩表

成绩ID学生ID成绩
1185
2392

如果我们想要获取所有学生及其对应的成绩,使用 LEFT JOIN

SELECT 学生.学生ID, 学生.学生姓名, 成绩.成绩
FROM 学生
LEFT JOIN 成绩
ON 学生.学生ID = 成绩.学生ID;

结果

学生ID学生姓名成绩
1张三85
2李四NULL
3王五92

在这个例子中,李四没有成绩记录,因此成绩列显示为NULL。

总结

LEFT JOIN 是非常有用的工具,特别是在需要保留左表所有数据的情况下。它可以帮助你避免丢失数据,同时从多个表中提取信息。

其他连接方式

在SQL中,除了LEFT JOIN,还有其他几种类型的连接(JOIN),它们可以帮助你在不同情况下合并表。以下是常见的连接类型及其说明:

1. INNER JOIN

  • 定义:只返回两个表中匹配的记录。
  • 特点:如果某条记录在任一表中没有匹配项,则不会出现在结果集中。
  • 示例
SELECT 表1.列, 表2.列, ...
FROM 表1
INNER JOIN 表2
ON 表1.匹配列 = 表2.匹配列;

2. RIGHT JOIN

  • 定义:返回右表中的所有记录,以及左表中与右表匹配的记录。
  • 特点:如果左表中没有匹配的记录,则结果集中将包含NULL值。
  • 示例
SELECT 表1.列, 表2.列, ...
FROM 表1
RIGHT JOIN 表2
ON 表1.匹配列 = 表2.匹配列;

3. FULL OUTER JOIN

  • 定义:返回左表和右表中所有的记录。
  • 特点:如果某张表中没有匹配的记录,则结果集中将包含NULL值。
  • 示例
SELECT 表1.列, 表2.列, ...
FROM 表1
FULL OUTER JOIN 表2
ON 表1.匹配列 = 表2.匹配列;

4. CROSS JOIN

  • 定义:返回左表和右表的笛卡尔积,即不考虑任何匹配条件,将左表的每一行与右表的每一行组合。
  • 特点:结果集的行数等于左表行数乘以右表行数。
  • 示例
SELECT 表1.列, 表2.列, ...
FROM 表1
CROSS JOIN 表2;

5. SELF JOIN

  • 定义:将表与其自身进行连接。
  • 特点:通常用于表中数据的比较。
  • 示例
SELECT a.列, b.列, ...
FROM 表 a, 表 b
WHERE a.匹配列 = b.匹配列;

总结

连接类型特点及用途
INNER JOIN只返回匹配的记录
LEFT JOIN返回左表所有记录,右表匹配的记录或NULL
RIGHT JOIN返回右表所有记录,左表匹配的记录或NULL
FULL JOIN返回左右表所有记录,未匹配的列填充NULL
CROSS JOIN返回左右表的笛卡尔积,不考虑匹配条件
SELF JOIN将表与其自身连接,用于表内数据比较

这些连接方式提供了灵活的工具,帮助你在不同场景下有效地查询和合并数据。

详细举例说明

下面为每种连接类型提供一个实际的例子,假设我们有两个表:学生 和 课程

学生表

学生ID学生姓名
1张三
2李四
3王五
4赵六

课程表

课程ID学生ID课程名称
11数学
21英语
33物理
44化学

1. INNER JOIN

  • 目的:找出学生及其所选课程,仅包含已选课的学生。
  • 查询
SELECT 学生.学生姓名, 课程.课程名称
FROM 学生
INNER JOIN 课程
ON 学生.学生ID = 课程.学生ID;
  • 结果
    学生姓名课程名称
    张三数学
    张三英语
    王五物理
    赵六化学

2. LEFT JOIN

  • 目的:列出所有学生及其所选课程,包括未选课的学生。
  • 查询
SELECT 学生.学生姓名, 课程.课程名称
FROM 学生
LEFT JOIN 课程
ON 学生.学生ID = 课程.学生ID;
  • 结果
    学生姓名课程名称
    张三数学
    张三英语
    李四NULL
    王五物理
    赵六化学

3. RIGHT JOIN

  • 目的:列出所有课程及其选课学生,包括没有学生选的课程。
  • 查询
SELECT 学生.学生姓名, 课程.课程名称
FROM 学生
RIGHT JOIN 课程
ON 学生.学生ID = 课程.学生ID;
  • 结果
    学生姓名课程名称
    张三数学
    张三英语
    王五物理
    赵六化学

(注:在这个例子中,所有学生都选了课,因此结果与INNER JOIN相同。)

4. FULL OUTER JOIN

  • 目的:列出所有学生和所有课程,包括未选课的学生和未被选的课程。
  • 查询
SELECT 学生.学生姓名, 课程.课程名称
FROM 学生
FULL OUTER JOIN 课程
ON 学生.学生ID = 课程.学生ID;
  • 结果
    学生姓名课程名称
    张三数学
    张三英语
    李四NULL
    王五物理
    赵六化学

(注:在这个例子中,所有学生都选了课,因此结果与LEFT JOIN相同。)

5. CROSS JOIN

  • 目的:列出所有学生与所有课程的组合,不考虑是否选课。
  • 查询
SELECT 学生.学生姓名, 课程.课程名称
FROM 学生
CROSS JOIN 课程;
  • 结果
    学生姓名课程名称
    张三数学
    张三英语
    张三物理
    张三化学
    李四数学
    李四英语
    李四物理
    李四化学
    王五数学
    王五英语
    王五物理
    王五化学
    赵六数学
    赵六英语
    赵六物理
    赵六化学

6. SELF JOIN

  • 目的:找出选同一课程的学生。
  • 查询
SELECT a.学生姓名, b.学生姓名, 课程.课程名称
FROM 课程 a
JOIN 课程 b
ON a.课程名称 = b.课程名称
AND a.学生ID != b.学生ID;
  • 结果
    学生姓名学生姓名课程名称
    张三张三数学
    张三张三英语

(注:在这个例子中,张三选了两门课,因此结果中显示了他与自己的组合。)

这些例子展示了不同连接类型在实际数据中的应用,帮助你更好地理解它们的功能和用途。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值