自学内容网 自学内容网

MySQL中的关联查询:方式、区别及示例

MySQL中的关联查询:方式、区别及示例

在数据库操作中,我们常常需要从多个相关的表中获取数据,这就用到了关联查询。MySQL提供了多种关联查询方式,每种方式都有其特点和适用场景。下面我们就来详细探讨这些关联查询的使用方式、它们之间的区别,并结合示例进行讲解。

在这里插入图片描述

内连接(INNER JOIN)

内连接是最常见的关联查询方式之一,它会返回两个表中满足连接条件的所有行。也就是说,只有当两个表中的记录在连接条件上匹配时,才会出现在结果集中。

语法

SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;

示例

假设有两个表,students表存储学生信息,包含student_idstudent_name等字段;scores表存储学生的成绩信息,包含student_idsubjectscore等字段。我们要查询每个学生的姓名及其对应的数学成绩,就可以使用内连接:

SELECT students.student_name, scores.score
FROM students
INNER JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学';

在这个例子中,只有在students表和scores表中student_id相同且scores表中subject为“数学”的记录才会出现在结果集中。

左连接(LEFT JOIN)

左连接会返回左表(table1)中的所有行,以及右表(table2)中满足连接条件的行。如果右表中没有匹配的行,结果集中对应右表的列值将为NULL

语法

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;

示例

继续以上面的studentsscores表为例,如果我们要查询所有学生的姓名以及他们的数学成绩,包括那些没有数学成绩的学生(在成绩表中没有记录的学生),就可以使用左连接:

SELECT students.student_name, scores.score
FROM students
LEFT JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学';

这样,即使某个学生没有数学成绩记录,在结果集中也会出现该学生的姓名,而对应的成绩列为NULL

右连接(RIGHT JOIN)

右连接与左连接相反,它会返回右表(table2)中的所有行,以及左表(table1)中满足连接条件的行。如果左表中没有匹配的行,结果集中对应左表的列值将为NULL

语法

SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例

还是以这两个表为例,如果我们以scores表为基准,要查询所有数学成绩记录以及对应的学生姓名(即使该成绩记录可能对应一个不存在于students表中的虚拟学生,这种情况在实际中可能表示数据异常),就可以使用右连接:

SELECT students.student_name, scores.score
FROM students
RIGHT JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学';

此时,即使成绩记录对应的学生在students表中不存在,在结果集中也会出现该成绩记录,而对应的学生姓名列为NULL

全外连接(FULL OUTER JOIN)

全外连接会返回左表和右表中的所有行。当某一行在另一表中没有匹配行时,结果集中对应另一表的列值将为NULL。不过,MySQL本身并不直接支持FULL OUTER JOIN关键字,但可以通过LEFT JOINRIGHT JOIN的结果集UNION来模拟。

模拟语法

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例

同样以studentsscores表为例,模拟全外连接查询:

SELECT students.student_name, scores.score
FROM students
LEFT JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学'
UNION
SELECT students.student_name, scores.score
FROM students
RIGHT JOIN scores ON students.student_id = scores.student_id AND scores.subject = '数学';

这样,结果集将包含所有学生(无论是否有数学成绩记录)以及所有数学成绩记录(无论是否有对应的学生记录),对于不匹配的部分,相应列值为NULL

交叉连接(CROSS JOIN)

交叉连接也称为笛卡尔积连接,它会返回左表中每一行与右表中每一行的组合,结果集的行数是左表行数乘以右表行数。

语法

SELECT columns
FROM table1
CROSS JOIN table2;

示例

假设students表有3条记录,courses表有2条记录,执行交叉连接:

SELECT students.student_name, courses.course_name
FROM students
CROSS JOIN courses;

结果集将有3 * 2 = 6条记录,展示了每个学生与每门课程的所有可能组合。

关联查询方式的区别总结

  1. 内连接:只返回满足连接条件的行,结果集不包含任何一方表中不匹配的行。
  2. 左连接:以左表为基准,返回左表所有行,右表中匹配的行与之对应,不匹配的右表列为NULL
  3. 右连接:以右表为基准,返回右表所有行,左表中匹配的行与之对应,不匹配的左表列为NULL
  4. 全外连接:返回左右表所有行,不匹配的列为NULL,通过LEFT JOINRIGHT JOINUNION模拟。
  5. 交叉连接:返回左右表所有行的笛卡尔积组合,不考虑任何连接条件。

原文地址:https://blog.csdn.net/2401_86610558/article/details/145219494

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!