MySQL中的关联查询:方式、区别及示例
MySQL中的关联查询:方式、区别及示例
在数据库操作中,我们常常需要从多个相关的表中获取数据,这就用到了关联查询。MySQL提供了多种关联查询方式,每种方式都有其特点和适用场景。下面我们就来详细探讨这些关联查询的使用方式、它们之间的区别,并结合示例进行讲解。
内连接(INNER JOIN)
内连接是最常见的关联查询方式之一,它会返回两个表中满足连接条件的所有行。也就是说,只有当两个表中的记录在连接条件上匹配时,才会出现在结果集中。
语法
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;
示例
假设有两个表,students
表存储学生信息,包含student_id
、student_name
等字段;scores
表存储学生的成绩信息,包含student_id
、subject
、score
等字段。我们要查询每个学生的姓名及其对应的数学成绩,就可以使用内连接:
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;
示例
继续以上面的students
和scores
表为例,如果我们要查询所有学生的姓名以及他们的数学成绩,包括那些没有数学成绩的学生(在成绩表中没有记录的学生),就可以使用左连接:
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 JOIN
和RIGHT 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;
示例
同样以students
和scores
表为例,模拟全外连接查询:
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条记录,展示了每个学生与每门课程的所有可能组合。
关联查询方式的区别总结
- 内连接:只返回满足连接条件的行,结果集不包含任何一方表中不匹配的行。
- 左连接:以左表为基准,返回左表所有行,右表中匹配的行与之对应,不匹配的右表列为
NULL
。 - 右连接:以右表为基准,返回右表所有行,左表中匹配的行与之对应,不匹配的左表列为
NULL
。 - 全外连接:返回左右表所有行,不匹配的列为
NULL
,通过LEFT JOIN
和RIGHT JOIN
的UNION
模拟。 - 交叉连接:返回左右表所有行的笛卡尔积组合,不考虑任何连接条件。
原文地址:https://blog.csdn.net/2401_86610558/article/details/145219494
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!