mysql 三表连接

2024年04月14日 mysql 三表连接 极客笔记

mysql 三表连接

在MySQL数据库中,三表连接是指同时连接三个表进行数据查询操作。在实际应用中,经常会涉及到多个表之间的关联关系,这时就需要使用三表连接来获取所需的数据。本文将详细介绍MySQL中的三种三表连接方式:内连接、外连接和交叉连接。

内连接(INNER JOIN)

内连接是最常用的连接方式之一,在连接时只返回两个表中满足连接条件的数据。语法如下:

SELECT 列名
FROM 表1
INNER JOIN 表2 ON 表1.列名 = 表2.列名
INNER JOIN 表3 ON 表2.列名 = 表3.列名

其中,ON关键字用于指定连接条件。

假设有三个表:studentscorecourse,表结构如下:

  • student表:
student_id student_name
1 Alice
2 Bob
3 Carol
  • score表:
student_id subject_id score
1 101 90
2 102 85
3 101 88
  • course表:
subject_id subject_name
101 Math
102 English

我们可以使用内连接来查询学生的姓名、课程名称和成绩:

SELECT s.student_name, c.subject_name, sc.score
FROM student s
INNER JOIN score sc ON s.student_id = sc.student_id
INNER JOIN course c ON sc.subject_id = c.subject_id

运行以上SQL语句可以得到结果:

student_name subject_name score
Alice Math 90
Bob English 85
Carol Math 88

外连接(OUTER JOIN)

外连接包括左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL JOIN)。外连接会返回左表和右表的所有记录,当连接条件不满足时,会用NULL填充。

左外连接(LEFT JOIN)

左外连接会返回左表中的所有记录,以及右表中满足连接条件的记录。语法如下:

SELECT 列名
FROM 表1
LEFT JOIN 表2 ON 表1.列名 = 表2.列名
LEFT JOIN 表3 ON 表2.列名 = 表3.列名

接着上面的示例,我们可以使用左外连接来查询所有学生的姓名、课程名称和成绩,如果某个学生没有成绩,则显示为NULL:

SELECT s.student_name, c.subject_name, sc.score
FROM student s
LEFT JOIN score sc ON s.student_id = sc.student_id
LEFT JOIN course c ON sc.subject_id = c.subject_id

运行以上SQL语句可以得到结果:

student_name subject_name score
Alice Math 90
Bob English 85
Carol Math 88
Alice English NULL
Bob Math NULL
Carol English NULL

右外连接(RIGHT JOIN)

右外连接与左外连接相反,会返回右表中的所有记录,以及左表中满足连接条件的记录。语法如下:

SELECT 列名
FROM 表1
RIGHT JOIN 表2 ON 表1.列名 = 表2.列名
RIGHT JOIN 表3 ON 表2.列名 = 表3.列名

继续以上示例,我们可以使用右外连接来查询所有课程的名称、学生姓名和成绩,如果某门课程没有学生成绩,则显示为NULL:

SELECT c.subject_name, s.student_name, sc.score
FROM course c
RIGHT JOIN score sc ON c.subject_id = sc.subject_id
RIGHT JOIN student s ON sc.student_id = s.student_id

运行以上SQL语句可以得到结果:

subject_name student_name score
Math Alice 90
Math Carol 88
English Bob 85
English Alice NULL

全外连接(FULL JOIN)

全外连接会返回左表和右表中的所有记录,如果某条记录在另一张表中没有匹配记录,也会显示为NULL。语法如下:

SELECT 列名
FROM 表1
FULL JOIN 表2 ON 表1.列名 = 表2.列名
FULL JOIN 表3 ON 表2.列名 = 表3.列名

在上面的示例中,我们可以使用全外连接来查询所有学生和课程的关联关系,包括有成绩和没有成绩的情况:

SELECT s.student_name, c.subject_name, sc.score
FROM student s
FULL JOIN score sc ON s.student_id = sc.student_id
FULL JOIN course c ON sc.subject_id = c.subject_id

运行以上SQL语句可以得到结果:

student_name subject_name score
Alice Math 90
Bob English 85
Carol Math 88
Alice English NULL
Bob Math NULL
Carol English NULL

交叉连接(CROSS JOIN)

交叉连接会返回两个表的笛卡尔积,即两个表的每一行都和另一个表的每一行进行组合。在实际应用中,交叉连接很少使用,因为会导致结果集非常大。语法如下:

SELECT 列名
FROM 表1
CROSS JOIN 表2
CROSS JOIN 表3

如果我们想要获取所有学生和所有课程的组合,可以使用交叉连接:

SELECT s.student_name, c.subject_name
FROM student s
CROSS JOIN course c

运行以上SQL语句可以得到结果:

student_name subject_name
Alice Math
Alice English
Bob Math
Bob English
Carol Math
Carol English

总结

在MySQL中,通过内连接、外连接和交叉连接可以实现多表之间的数据查询操作。不同类型的连接方式适用于不同的场景,根据实际需求选择合适的连接方式可以更高效地获取所需的数据。

本文链接:http://so.lmcjl.com/news/2045/

展开阅读全文