左连接
在SQL中,LEFT JOIN
是一种用于合并两个表的连接方式。它会返回左表(第一个表)中的所有记录,以及右表(第二个表)中与左表匹配的记录。如果右表中没有匹配的记录,则结果集中将包含NULL值。
左连接的基本语法
SELECT 表1.列, 表2.列, ...
FROM 表1
LEFT JOIN 表2
ON 表1.匹配列 = 表2.匹配列;
左连接的特征
-
包含左表所有记录:无论右表是否有匹配的记录,左表中的每一行都会出现在结果集中。
-
右表匹配行:如果右表中有与左表匹配的记录,则显示这些记录。如果没有匹配的记录,则结果中包含NULL值。
示例
假设有两个表:学生
和 成绩
。
学生表
学生ID | 学生姓名 |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
成绩表
成绩ID | 学生ID | 成绩 |
---|---|---|
1 | 1 | 85 |
2 | 3 | 92 |
如果我们想要获取所有学生及其对应的成绩,使用 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 | 课程名称 |
---|---|---|
1 | 1 | 数学 |
2 | 1 | 英语 |
3 | 3 | 物理 |
4 | 4 | 化学 |
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;
- 结果:
学生姓名 学生姓名 课程名称 张三 张三 数学 张三 张三 英语
(注:在这个例子中,张三选了两门课,因此结果中显示了他与自己的组合。)
这些例子展示了不同连接类型在实际数据中的应用,帮助你更好地理解它们的功能和用途。