mysql四张表怎么关联
时间 : 2023-03-21 10:17:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

MySQL 是一种关系型数据库管理系统,其中最基本的操作之一就是通过关联多张表来完成复杂的查询。在 MySQL 中,关联多张表的方式有很多种,包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 等,下面我们将详细介绍这些方式。

假设我们有四张表,分别为 users、orders、products 和 order_items,它们之间的关系如下:

- users 表存储了用户信息,每个用户有一个唯一的 user_id;

- orders 表存储了订单信息,每个订单有一个唯一的 order_id,同时需要记录下买家的信息(即 users 表中对应的 user_id);

- products 表存储了产品信息,每个产品有一个唯一的 product_id;

- order_items 表存储了订单中的物品信息,需要记录下每个物品所对应的订单信息(即 orders 表中对应的 order_id)和产品信息(即 products 表中对应的 product_id)。

以下是不同类型的表关联方式:

1. INNER JOIN

INNER JOIN 返回的是两个表中匹配的行,即它们在某个或某些列中有相同的值。INNER JOIN 的语法格式如下:

SELECT column_name(s)

FROM table1

INNER JOIN table2 ON table1.column_name = table2.column_name;

在我们的例子中,如果要查询所有订单中每个物品的名称和价格,可以使用以下 SQL 语句:

SELECT order_items.item_name, order_items.item_price

FROM order_items

INNER JOIN products ON order_items.product_id = products.product_id;

在这个例子中,INNER JOIN 连接了 order_items 表和 products 表,然后通过 product_id 列将它们关联起来。这条语句将返回 order_items 表中的所有行,其中包括 item_name 和 item_price 列,以及与之匹配的 products 表中的 product_id 列。

2. LEFT JOIN

LEFT JOIN 返回左侧表中的所有行,以及右侧表中与之匹配的行。如果右侧表中没有匹配的行,将返回 NULL 值。LEFT JOIN 的语法格式如下:

SELECT column_name(s)

FROM table1

LEFT JOIN table2 ON table1.column_name = table2.column_name;

在我们的例子中,如果要查询所有用户以及他们购买的物品的名称和价格,可以使用以下 SQL 语句:

SELECT users.username, order_items.item_name, order_items.item_price

FROM users

LEFT JOIN orders ON users.user_id = orders.user_id

LEFT JOIN order_items ON orders.order_id = order_items.order_id;

在这个例子中,LEFT JOIN 连接了 users 表和 orders 表,然后通过 user_id 列将它们关联起来。接着,LEFT JOIN 连接了 orders 表和 order_items 表,通过 order_id 列将它们关联起来。这条语句将返回所有 users 表中的行,以及与之匹配的 orders 表和 order_items 表中的行。如果 orders 表或 order_items 表中没有匹配的行,将返回 NULL 值。

3. RIGHT JOIN

RIGHT JOIN 返回右侧表中的所有行,以及左侧表中与之匹配的行。如果左侧表中没有匹配的行,将返回 NULL 值。RIGHT JOIN 的语法格式如下:

SELECT column_name(s)

FROM table1

RIGHT JOIN table2 ON table1.column_name = table2.column_name;

在我们的例子中,如果要查询所有购买物品的订单以及它们的买家信息,可以使用以下 SQL 语句:

SELECT orders.order_id, users.username

FROM orders

RIGHT JOIN users ON orders.user_id = users.user_id;

在这个例子中,RIGHT JOIN 连接了 orders 表和 users 表,然后通过 user_id 列将它们关联起来。这条语句将返回所有 orders 表中的行,以及与之匹配的 users 表中的行。如果 users 表中没有匹配的行,将返回 NULL 值。

4. FULL OUTER JOIN

FULL OUTER JOIN(也称为 FULL JOIN)返回所有左侧表和右侧表中的行,如果没有匹配的行,将返回 NULL 值。然而,MySQL 不支持这种类型的 JOIN,因此我们需要使用 UNION 和 LEFT JOIN 和 RIGHT JOIN 的结合来模拟它。下面是一个例子:

SELECT users.username, order_items.item_name, order_items.item_price

FROM users

LEFT JOIN orders ON users.user_id = orders.user_id

LEFT JOIN order_items ON orders.order_id = order_items.order_id

UNION

SELECT users.username, order_items.item_name, order_items.item_price

FROM users

RIGHT JOIN orders ON users.user_id = orders.user_id

RIGHT JOIN order_items ON orders.order_id = order_items.order_id;

这个例子使用 UNION 和 LEFT JOIN 和 RIGHT JOIN 的结合来模拟 FULL OUTER JOIN。它首先使用 LEFT JOIN 和 UNION 来返回左侧表中的所有行和右侧表中匹配的行,然后使用 RIGHT JOIN 和 UNION 来返回右侧表中的所有行和左侧表中匹配的行。这条语句将返回 users 表和 order_items 表中的所有行,以及与之匹配的 orders 表中的行。如果 orders 表、users 表或 order_items 表中没有匹配的行,将返回 NULL 值。

这就是 MySQL 中关联多张表的几种方式,使用不同类型的 JOIN 很容易地将多个表中的数据联接起来,以便执行更复杂的查询。

在MySQL中,将几张表关联起来是非常常见的操作,下面通过一个例子来演示如何关联四张表。

假设我们有四张表:

- 学生表(students)

- 课程表(courses)

- 成绩表(scores)

- 教师表(teachers)

其中,学生表和课程表是多对多关系,成绩表和学生表、课程表是一对多关系,教师表和课程表是一对多关系。

首先,我们来看一下四张表的结构。

```mysql

CREATE TABLE students (

id INT PRIMARY KEY,

name VARCHAR(50) NOT NULL,

age INT NOT NULL,

gender CHAR(1) NOT NULL

);

CREATE TABLE courses (

id INT PRIMARY KEY,

name VARCHAR(50) NOT NULL,

teacher_id INT NOT NULL

);

CREATE TABLE scores (

id INT PRIMARY KEY,

student_id INT NOT NULL,

course_id INT NOT NULL,

score INT NOT NULL,

FOREIGN KEY (student_id) REFERENCES students(id),

FOREIGN KEY (course_id) REFERENCES courses(id)

);

CREATE TABLE teachers (

id INT PRIMARY KEY,

name VARCHAR(50) NOT NULL,

age INT NOT NULL,

gender CHAR(1) NOT NULL

);

接下来,我们来看一下如何关联这四张表。

1. 学生表和课程表的多对多关系

学生表和课程表之间的多对多关系可以通过第三张表来实现。我们创建一张新表,叫做course_students,用于存储学生和课程之间的关系。

```mysql

CREATE TABLE course_students (

id INT PRIMARY KEY,

student_id INT NOT NULL,

course_id INT NOT NULL,

FOREIGN KEY (student_id) REFERENCES students(id),

FOREIGN KEY (course_id) REFERENCES courses(id)

);

然后,我们将students表和courses表和course_students表进行JOIN操作连接起来,以便查询某个学生所选修的所有课程。

```mysql

SELECT students.name, courses.name

FROM students

JOIN course_students ON students.id = course_students.student_id

JOIN courses ON courses.id = course_students.course_id;

2. 成绩表和学生表的一对多关系

成绩表和学生表之间的一对多关系可以通过将学生表的id作为外键,从而在成绩表中关联到学生表。

```mysql

CREATE TABLE scores (

id INT PRIMARY KEY,

student_id INT NOT NULL,

course_id INT NOT NULL,

score INT NOT NULL,

FOREIGN KEY (student_id) REFERENCES students(id),

FOREIGN KEY (course_id) REFERENCES courses(id)

);

在查询成绩时,我们可以通过JOIN连接students表和scores表来获得学生的姓名和成绩。

```mysql

SELECT students.name, scores.score

FROM students

JOIN scores ON students.id = scores.student_id;

3. 成绩表和课程表的一对多关系

成绩表和课程表之间的一对多关系可以通过将课程表的id作为外键,从而在成绩表中关联到课程表。

```mysql

CREATE TABLE scores (

id INT PRIMARY KEY,

student_id INT NOT NULL,

course_id INT NOT NULL,

score INT NOT NULL,

FOREIGN KEY (student_id) REFERENCES students(id),

FOREIGN KEY (course_id) REFERENCES courses(id)

);

在查询成绩信息时,我们需要JOIN连接courses表和scores表。

```mysql

SELECT courses.name, scores.score

FROM courses

JOIN scores ON courses.id = scores.course_id;

4. 教师表和课程表的一对多关系

教师表和课程表之间的一对多关系可以通过将教师表的id作为外键,从而在课程表中关联到教师表。

```mysql

CREATE TABLE courses (

id INT PRIMARY KEY,

name VARCHAR(50) NOT NULL,

teacher_id INT NOT NULL,

FOREIGN KEY (teacher_id) REFERENCES teachers(id)

);

在查询课程信息时,我们需要JOIN连接teachers表和courses表。

```mysql

SELECT courses.name, teachers.name

FROM courses

JOIN teachers ON courses.teacher_id = teachers.id;

这样,我们就完成了四张表的关联。通过JOIN操作,我们可以轻松地获得更加复杂的数据查询结果。