MySQL修炼手册5:多表查询:掌握JOIN操作

写在开头

MySQL作为一种强大的关系型数据库管理系统,提供了多种表关联方式,使得在数据库查询中能够更加灵活和高效地获取所需的数据。本文将通过创建两张关于水果的表(“fruits"和"fruit_prices”),并演示不同类型的表关联场景,以便读者更深入地了解MySQL(8.0及以上版本)表关联的使用方法。

创建水果表

首先,我们创建了两张表,"fruits"表和"fruit_prices"表。"fruits"表存储水果的基本信息,而"fruit_prices"表存储各水果的价格信息。

-- 创建水果表
CREATE TABLE fruits (
    fruit_id INT PRIMARY KEY,
    fruit_name VARCHAR(50)
);

-- 插入一些示例数据
INSERT INTO fruits (fruit_id, fruit_name) VALUES
(1, '苹果'),
(2, '香蕉'),
(3, '橙子'),
(4, '葡萄');

-- 创建水果价格表
CREATE TABLE fruit_prices (
    fruit_id INT PRIMARY KEY,
    price DECIMAL(5, 2)
);

-- 插入一些示例数据
INSERT INTO fruit_prices (fruit_id, price) VALUES
(1, 2.50),
(2, 1.20),
(3, 1.80),
(5, 3.00);  -- 注意:此处插入一个不存在于"fruits"表的水果ID

1. 内连接(INNER JOIN)

内连接是最常用的表关联方式,它只返回两个表中满足连接条件的行。以下是一个内连接的示例:

SELECT *
FROM fruits
INNER JOIN fruit_prices ON fruits.fruit_id = fruit_prices.fruit_id;

2. 左连接(LEFT JOIN)

左连接返回左表中所有的行,以及右表中满足连接条件的行。如果右表中没有匹配的行,那么结果集中将包含NULL值。

SELECT *
FROM fruits
LEFT JOIN fruit_prices ON fruits.fruit_id = fruit_prices.fruit_id;

3. 右连接(RIGHT JOIN)

右连接返回右表中所有的行,以及左表中满足连接条件的行。如果左表中没有匹配的行,那么结果集中将包含NULL值。

SELECT *
FROM fruits
RIGHT JOIN fruit_prices ON fruits.fruit_id = fruit_prices.fruit_id;

4. 全连接(FULL JOIN)

全连接返回两个表中所有的行,如果某个表中没有匹配的行,那么结果集中将包含NULL值。

SELECT *
FROM fruits
FULL JOIN fruit_prices ON fruits.fruit_id = fruit_prices.fruit_id;

5. 交叉连接(CROSS JOIN)

交叉连接返回两个表中的所有可能的组合,它不基于任何连接条件。

SELECT *
FROM fruits
CROSS JOIN fruit_prices;

6.表关联方式的区别

  • 返回结果集的不同:

    • 内连接只返回两个表中满足连接条件的行。
    • 左连接返回左表的所有行,右表中没有匹配的行会填充NULL值。
    • 右连接返回右表的所有行,左表中没有匹配的行会填充NULL值。
    • 全连接返回两个表的所有行,不匹配的部分填充NULL值。
    • 交叉连接返回两个表的所有可能组合。
  • 应用场景的不同:

    • 内连接适用于获取交集数据的场景。
    • 左连接和右连接用于保留某一边表的所有行,获取另一边表中满足条件的行。
    • 全连接用于显示两个表的所有信息。
    • 交叉连接用于生成所有可能的组合。

7. 嵌套查询

嵌套查询是在一个查询中嵌套另一个查询,用于在内部查询中使用外部查询的结果。例如,我们可以使用嵌套查询获取价格高于平均价格的水果。

SELECT *
FROM fruits
WHERE fruit_id IN (SELECT fruit_id FROM fruit_prices WHERE price > (SELECT AVG(price) FROM fruit_prices));

8. 联合查询(UNION和UNION ALL)

联合查询用于将两个或多个查询的结果集合并成一个结果集。区别在于UNION会去除重复的行,而UNION ALL会保留所有行。

-- UNION查询
SELECT fruit_id, fruit_name FROM fruits
UNION
SELECT fruit_id, NULL FROM fruit_prices;

-- UNION ALL查询
SELECT fruit_id, fruit_name FROM fruits
UNION ALL
SELECT fruit_id, NULL FROM fruit_prices;

写在最后

通过以上演示,我们深入了解了MySQL中不同类型的表关联方式。在实际应用中,根据查询需求选择合适的关联方式是提高查询性能和获取准确数据的关键。通过灵活使用这些表关联方式,我们能够更好地利用MySQL的强大功能,提升数据库查询的效率和精确性。希望本文对读者加深对MySQL表关联的理解有所帮助。

你可能感兴趣的:(数据库,mysql,数据库,sql)