MySQL三个表联合查询

MySQL是一种常用的关系型数据库管理系统,用于存储和管理大量数据。在实际应用中,经常会遇到需要从多个表中联合查询数据的情况。本文将介绍如何在MySQL中进行三个表的联合查询,并提供相应的代码示例。

背景知识

在开始之前,我们先了解一些必要的背景知识。

什么是联合查询?

联合查询是指从多个表中获取数据的操作。通过联合查询,我们可以将多个表中的数据按照一定的条件进行组合,得到我们想要的结果。

什么是关系型数据库?

关系型数据库是指使用关系模型来组织数据的数据库系统。在关系模型中,数据以表的形式存储,每个表都有一个或多个列,每一列对应一个数据类型。表与表之间可以建立关系,通过关系可以实现数据的查询、修改和删除等操作。

什么是MySQL?

MySQL是一种开源的关系型数据库管理系统,广泛应用于Web应用程序的开发中。它具有速度快、可靠性高、易于使用等特点,被广泛用于各种规模的应用中。

示例场景

假设我们有三个表,分别是studentscoursesscores,它们之间的关系如下图所示:

st=>start: 学生表(students)
co=>operation: 课程表(courses)
sc=>operation: 成绩表(scores)
e=>end: 结果表
st->co
co->sc
sc->e

我们的目标是从这三个表中联合查询出学生、课程和成绩的相关信息。

数据表结构

首先,我们需要创建三个数据表,并定义它们的结构。

创建学生表

CREATE TABLE students (
  id INT PRIMARY KEY,
  name VARCHAR(255),
  age INT,
  gender VARCHAR(10)
);

创建课程表

CREATE TABLE courses (
  id INT PRIMARY KEY,
  name VARCHAR(255),
  teacher VARCHAR(255)
);

创建成绩表

CREATE TABLE scores (
  student_id INT,
  course_id INT,
  score INT,
  PRIMARY KEY (student_id, course_id),
  FOREIGN KEY (student_id) REFERENCES students(id),
  FOREIGN KEY (course_id) REFERENCES courses(id)
);

联合查询方法

在 MySQL 中,我们可以使用 JOIN 关键字进行多个表的联合查询。常用的联合查询方法有以下几种:

内连接(INNER JOIN)

内连接是指从两个或多个表中获取满足条件的记录,它只返回符合条件的交集部分。

SELECT students.name, courses.name, scores.score
FROM students
JOIN scores ON students.id = scores.student_id
JOIN courses ON scores.course_id = courses.id;

左连接(LEFT JOIN)

左连接是指从左表中获取所有记录,再根据条件获取右表中的匹配记录,如果右表中没有匹配记录,则以 NULL 值填充。

SELECT students.name, courses.name, scores.score
FROM students
LEFT JOIN scores ON students.id = scores.student_id
LEFT JOIN courses ON scores.course_id = courses.id;

右连接(RIGHT JOIN)

右连接是指从右表中获取所有记录,再根据条件获取左表中的匹配记录,如果左表中没有匹配记录,则以 NULL 值填充。

SELECT students.name, courses.name, scores.score
FROM students
RIGHT JOIN scores ON students.id = scores.student_id
RIGHT JOIN courses ON scores.course_id = courses.id;

全连接(FULL JOIN)

全连接是指从两个表中获取所有记录,如果没有匹配的记录,则以 NULL 值填充。

SELECT students.name, courses.name, scores.score
FROM students
FULL JOIN scores ON students.id = scores.student_id
FULL JOIN courses ON scores.course_id = courses.id;