MySQL JOIN
在 MySQL 中,JOIN 语句用于将数据库中的两个表或者多个表组合起来。
比如在一个学校系统中,有一个学生信息表和一个学生成绩表。这两个表通过学生 ID 字段关联起来。当我们要查询学生的成绩的时候,就需要连接两个表以查询学生信息和成绩。
MySQL 连接类型
- 内部联接 (INNER JOIN)
- 左连接 (LEFT JOIN)
- 右连接 (RIGHT JOIN)
- 交叉连接 (CROSS JOIN)
实例表和数据
创建学生成绩表student_score
。(students
表在前面文章已经创建)。
CREATE TABLE `student_score` (`student_id` int NOT NULL,`subject` varchar(45) NOT NULL,`score` int NOT NULL
);
插入数据
INSERT INTO `student_score` (`student_id`, `subject`, `score`)
VALUES ('001','体育',95),('002','职业规划',88),('003','数据库设计',91);
交叉连接
交叉连接返回两个集合的笛卡尔积。也就是两个表中的所有的行的所有可能的组合。这相当于内连接没有连接条件或者连接条件永远为真。
如果一个有 m
行的表和另一个有 n
行的表,它们交叉连接将返回 m * n
行数据。
显式的交叉连接
students
和student_score
表:
SELECTstudents.*,student_score.*
FROMstudents CROSS JOIN student_score;
隐式的交叉连接 student 和 student_score 表:
SELECTstudents.*,student_score.*
FROMstudents, student_score;
这两种方式的输出一样。
内连接
内连接基于连接条件组合两个表中的数据。内连接相当于加了过滤条件的交叉连接。
内连接将第一个表的每一行与第二个表的每一行进行比较,如果满足给定的连接条件,则将两个表的行组合在一起作为结果集中的一行。
SELECTstudents.*,student_score.*
FROMstudentsINNER JOIN student_scoreON students.student_id = student_score.student_id;
左连接
左连接是左外连接的简称,左连接需要连接条件。
两个表左连接时,第一个表称为左表,第二表称为右表
。例如 A LEFT JOIN B,A 是左表,B 是右表。
左连接以左表的数据行为基础,根据连接匹配右表的每一行,如果匹配成功则将左表和右表的行组合成新的数据行返回;如果匹配不成功则将左表的行和 NULL 值组合成新的数据行返回。
SELECTstudents.*,student_score.*
FROMstudentsLEFT JOIN student_scoreON students.student_id = student_score.student_id;
注意
- 结果集中包含了
students
表的所有记录行。
右连接
右连接是右外连接的简称,右连接需要连接条件。
右连接与左连接处理逻辑相反,右连接以右表的数据行为基础,根据条件匹配左表中的数据。如果匹配不到左表中的数据,则左表中的列为 NULL 值。
SELECTstudents.*,student_score.*
FROMstudentsRIGHT JOIN student_scoreON students.student_id = student_score.student_id;
因为右表只有三行数据,所以显示的最终结果也只有三个。
右连接其实是左右表交换位置的左连接,即 A RIGHT JOIN B
就是 B LEFT JOIN A
,因此右连接很少使用。
结论
- 连接用于组合两个表的数据。
- 交叉连接返回两个表中的所有的行的所有可能的组合。
- 内连接基于连接条件组合两个表中的数据。
- 左连接以左表为基础组合两个表中的数据。
- 右连接以右表为基础组合两个表中的数据。
- 互换左表和右表后,左右连接可以互换。