内连接、左连接、右连接

tim-qtp...大约 2 分钟MySQL数据库

INNER JOIN:

  • 只返回两个表中匹配的行。如果没有匹配,则该行不会出现在结果集中。
  • 适用于只关心交集数据的场景。

LEFT JOIN(或 LEFT OUTER JOIN):

  • 返回左表中的所有行,即使右表中没有匹配的行。如果右表没有匹配,则结果中的右侧列会显示为NULL。
  • 适用于需要保留左表所有数据的场景。

RIGHT JOIN(或 RIGHT OUTER JOIN):

  • 返回右表中的所有行,即使左表中没有匹配的行。如果左表没有匹配,则结果中的左侧列会显示为NULL。
  • 适用于需要保留右表所有数据的场景。

例子:

假设我们有两个表:

  • 表1:学生表(Students)

    学号姓名
    001张三
    002李四
    003王五
  • 表2:成绩表(Scores)

    学号课程分数
    001数学90
    002英语85

1. 如果使用内连接查询:

SELECT Students.学号, Students.姓名, Scores.课程, Scores.分数
FROM Students
INNER JOIN Scores ON Students.学号 = Scores.学号;

结果为:

学号姓名课程分数
001张三数学90
002李四英语85

解释:内连接只返回两个表中匹配的记录。学号为003的学生没有成绩记录,因此不会出现在结果中。


2. 左连接(LEFT JOIN)

左连接会返回左表(第一个表)的所有记录,即使右表中没有匹配的记录。如果右表中没有匹配的记录,则结果中右表的字段会显示为NULL

例子:

使用左连接查询:

SELECT Students.学号, Students.姓名, Scores.课程, Scores.分数
FROM Students
LEFT JOIN Scores ON Students.学号 = Scores.学号;

结果为:

学号姓名课程分数
001张三数学90
002李四英语85
003王五NULLNULL

解释:左连接返回了左表(学生表)的所有记录。即使学号为003的学生没有成绩记录,也会出现在结果中,右表的字段显示为NULL


3. 右连接(RIGHT JOIN)

右连接会返回右表(第二个表)的所有记录,即使左表中没有匹配的记录。如果左表中没有匹配的记录,则结果中左表的字段会显示为NULL

例子:

使用右连接查询:

SELECT Students.学号, Students.姓名, Scores.课程, Scores.分数
FROM Students
RIGHT JOIN Scores ON Students.学号 = Scores.学号;

结果为:

学号姓名课程分数
001张三数学90
002李四英语85

解释:右连接返回了右表(成绩表)的所有记录。在这个例子中,因为所有成绩表的记录都能在学生表中找到匹配,所以结果与内连接相同。但如果成绩表中有额外的学号(例如004),而学生表中没有对应的记录(退学了,或者说作弊了,不参与排名),那么左表的字段会显示为NULL