Mysql基础教程(12):JOIN

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 行数据。

显式的交叉连接 studentsstudent_score 表:

SELECT
  students.*,
  student_score.*
FROM
  students CROSS JOIN student_score;

隐式的交叉连接 student 和 student_score 表:

SELECT
  students.*,
  student_score.*
FROM
  students, student_score;

这两种方式的输出一样。

在这里插入图片描述

内连接

内连接基于连接条件组合两个表中的数据。内连接相当于加了过滤条件的交叉连接。

内连接将第一个表的每一行与第二个表的每一行进行比较,如果满足给定的连接条件,则将两个表的行组合在一起作为结果集中的一行。

SELECT
  students.*,
  student_score.*
FROM
  students
  INNER JOIN student_score
  ON students.student_id = student_score.student_id;

在这里插入图片描述

左连接

左连接是左外连接的简称,左连接需要连接条件。

两个表左连接时,第一个表称为左表,第二表称为右表例如 A LEFT JOIN B,A 是左表,B 是右表。

左连接以左表的数据行为基础,根据连接匹配右表的每一行,如果匹配成功则将左表和右表的行组合成新的数据行返回如果匹配不成功则将左表的行和 NULL 值组合成新的数据行返回

SELECT
  students.*,
  student_score.*
FROM
  students
  LEFT JOIN student_score
  ON students.student_id = student_score.student_id;

在这里插入图片描述

注意

  1. 结果集中包含了 students 表的所有记录行。

右连接

右连接是右外连接的简称,右连接需要连接条件。

右连接与左连接处理逻辑相反,右连接以右表的数据行为基础,根据条件匹配左表中的数据。如果匹配不到左表中的数据,则左表中的列为 NULL 值

SELECT
  students.*,
  student_score.*
FROM
  students
  RIGHT JOIN student_score
  ON students.student_id = student_score.student_id;

在这里插入图片描述
因为右表只有三行数据,所以显示的最终结果也只有三个。

右连接其实是左右表交换位置的左连接,即 A RIGHT JOIN B 就是 B LEFT JOIN A,因此右连接很少使用。

结论

  • 连接用于组合两个表的数据。
  • 交叉连接返回两个表中的所有的行的所有可能的组合。
  • 内连接基于连接条件组合两个表中的数据。
  • 左连接以左表为基础组合两个表中的数据。
  • 右连接以右表为基础组合两个表中的数据。
  • 互换左表和右表后,左右连接可以互换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叁拾舞

你的鼓励将是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值