JOIN
子句来关联两个表并查询数据。,,“sql,SELECT a.column1, b.column2,FROM table1 a,JOIN table2 b ON a.common_column = b.common_column;,
`,,这个查询将返回
table1 和
table2 中通过
common_column` 关联的数据。MySQL 关联两个表查询
一、
在数据库管理中,关联表查询是一种非常常见的操作,通过关联不同的表,我们可以获取更全面、更有价值的数据信息,在 MySQL 中,有多种方式可以实现表的关联查询,INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)和 FULL JOIN(全连接)等,每种连接方式都有其特定的应用场景和特点,下面将详细介绍这些连接方式以及它们的示例。
二、INNER JOIN(内连接)
概念
INNER JOIN 只返回两个表中满足连接条件的记录,也就是说,结果集中的记录是在两个表中都存在的匹配记录,它是数据库默认的连接方式,如果没有指定连接类型,默认就是 INNER JOIN。
语法
SELECT 列1, 列2, ... FROM 表1 INNER JOIN 表2 ON 表1.关联字段 = 表2.关联字段;
示例
假设我们有两个表:students
(学生表)和scores
(成绩表),结构如下:
students | 属性 | 描述 |
student_id | INT | 学生编号 |
name | VARCHAR | 学生姓名 |
scores | 属性 | 描述 |
student_id | INT | 学生编号 |
course | VARCHAR | 课程名称 |
grade | INT | 成绩 |
现在我们想要查询每个学生的姓名以及他们在数学课程中的成绩,可以使用 INNER JOIN:
SELECT students.name, scores.grade FROM students INNER JOIN scores ON students.student_id = scores.student_id WHERE scores.course = '数学';
这个查询语句会返回所有学生在数学课程中的成绩以及对应的学生姓名,只有那些在students
表和scores
表中都有对应记录的学生才会被显示出来。
三、LEFT JOIN(左连接)
概念
LEFT JOIN 返回左表中的所有记录,以及右表中满足连接条件的记录,如果右表中没有满足连接条件的记录,则结果集中右表的列值将为 NULL。
语法
SELECT 列1, 列2, ... FROM 表1 LEFT JOIN 表2 ON 表1.关联字段 = 表2.关联字段;
示例
仍然使用上面的students
和scores
表,如果我们想要查询所有学生的姓名以及他们在物理课程中的成绩,即使有些学生可能没有物理成绩,可以使用 LEFT JOIN:
SELECT students.name, scores.grade FROM students LEFT JOIN scores ON students.student_id = scores.student_id AND scores.course = '物理';
这样,结果集中会包含所有学生的姓名,如果有物理成绩则显示成绩,否则成绩列为 NULL。
四、RIGHT JOIN(右连接)
概念
RIGHT JOIN 与 LEFT JOIN 类似,但返回的是右表中的所有记录,以及左表中满足连接条件的记录,如果左表中没有满足连接条件的记录,则结果集中左表的列值将为 NULL。
语法
SELECT 列1, 列2, ... FROM 表1 RIGHT JOIN 表2 ON 表1.关联字段 = 表2.关联字段;
示例
假设我们有一个teachers
(教师表)和一个courses
(课程表),结构如下:
teachers | 属性 | 描述 |
teacher_id | INT | 教师编号 |
name | VARCHAR | 教师姓名 |
courses | 属性 | 描述 |
course_id | INT | 课程编号 |
course | VARCHAR | 课程名称 |
teacher_id | INT | 教师编号 |
我们想要查询所有课程的信息以及授课教师的姓名,即使有些课程可能暂时没有安排教师,可以使用 RIGHT JOIN:
SELECT courses.course, teachers.name FROM courses RIGHT JOIN teachers ON courses.teacher_id = teachers.teacher_id;
结果集中会包含所有课程的信息,如果有授课教师则显示教师姓名,否则教师姓名列为 NULL。
五、FULL JOIN(全连接)
概念
FULL JOIN 返回两个表中的所有记录,当某一行在其中一个表中有匹配而在另一个表中没有匹配时,另一个表的列值将为 NULL,MySQL 本身并不直接支持 FULL JOIN,但可以通过 UNION 操作来模拟实现。
语法(模拟实现)
SELECT 列1, 列2, ... FROM 表1 LEFT JOIN 表2 ON 表1.关联字段 = 表2.关联字段 UNION SELECT 列1, 列2, ... FROM 表2 LEFT JOIN 表1 ON 表2.关联字段 = 表1.关联字段;
示例(模拟实现)
对于上述的students
和scores
表,如果我们想要查询所有学生以及他们所有课程的成绩情况,包括那些可能没有成绩的学生和课程,可以这样模拟 FULL JOIN:
SELECT students.name, scores.course, scores.grade FROM students LEFT JOIN scores ON students.student_id = scores.student_id UNION SELECT students.name, scores.course, scores.grade FROM scores LEFT JOIN students ON scores.student_id = students.student_id;
这样就可以得到一个包含所有学生和课程组合的结果集,其中没有成绩的记录中成绩列会显示为 NULL。
六、相关问题与解答
问题 1:INNER JOIN 和 LEFT JOIN 的结果集有什么区别?
解答:INNER JOIN 只返回两个表中满足连接条件的记录,即只有当两个表中都有匹配的关联字段值时,对应的记录才会出现在结果集中,而 LEFT JOIN 返回左表中的所有记录,以及右表中满足连接条件的记录,如果右表中没有满足连接条件的记录,则结果集中右表的列值为 NULL,在一个学生和成绩的关联查询中,INNER JOIN 只会返回有成绩的学生信息,而 LEFT JOIN 会返回所有学生信息,即使某些学生没有成绩,他们的信息也会被显示出来,只是成绩那一列会是 NULL。
问题 2:如何使用 FULL JOIN 查询出两个表中不匹配的记录?
解答:如前文所述,MySQL 本身不直接支持 FULL JOIN,但可以通过模拟实现,在模拟 FULL JOIN 的查询结果集中,不匹配的记录会出现在其中一列(左表或右表对应的列)为 NULL 的情况,通过检查这些 NULL 值所在的行,就可以找出两个表中不匹配的记录,例如在学生和成绩的模拟 FULL JOIN 查询结果中,如果某一行的students.name
为 NULL,而scores.course
和scores.grade
不为 NULL,就表示该课程没有对应的学生;反之,如果scores.course
和scores.grade
为 NULL,而students.name
不为 NULL,就表示该学生没有这门课程的成绩。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/141675.html