Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MYSQL内、左、右连接

MYSQL基础知识之内、左、右连接实例代码

作者:禹凕

这篇文章主要介绍了MYSQL基础知识之内、左、右连接的相关资料,一文彻底讲透INNER JOIN、LEFT JOIN和RIGHT JOIN三大连接类型,文中还有命令行与PHP实战示例,教你高效实现多表查询,需要的朋友可以参考下

前言

在实际数据库应用中,数据通常被规范化存储在多个相互关联的表中。例如,用户信息存于 users 表,订单信息存于 orders 表,二者通过 user_id 关联。若想同时获取“用户名 + 订单详情”,就必须使用 MySQL 的 JOIN 操作。

本文将系统讲解 MySQL 中三种核心连接类型——INNER JOIN(内连接)、LEFT JOIN(左连接) 和 RIGHT JOIN(右连接),并通过命令行与 PHP 脚本示例,助你掌握多表查询的精髓。

一、JOIN 的用途

关系型数据库的设计原则是 “避免数据冗余”,因此相关数据被拆分到不同表中。要还原完整业务视图,必须将这些表“拼接”起来。

JOIN 的本质:
根据关联字段(如外键),将多个表的行按逻辑关系组合成新的结果集。

二、三大 JOIN 类型详解

1. INNER JOIN(内连接 / 等值连接)

只返回两个表中 匹配成功的记录。

语法

SELECT columns
FROM table1
INNER JOIN table2 ON table1.key = table2.key;

INNER 可省略,直接写 JOIN 效果相同。

获取有文章的作者及其阅读量

SELECT a.runoob_id, a.yuming_author, b.yuming_count
FROM yuming_tbl a
INNER JOIN tcount_tbl b ON a.yuming_author = b.yuming_author;

结果:

yuming_idyuming_authoryuming_count
1禹凕10
2禹凕10
3YUMING.COM20
4YUMING.COM20

注意:yuming_author = 'FK' 的文章因在 tcount_tbl 中无对应记录,被排除。

特点

2. LEFT JOIN(左连接)

返回左表所有记录,右表无匹配时填充 NULL。

语法

SELECT columns
FROM left_table
LEFT JOIN right_table ON left_table.key = right_table.key;

示例:列出所有文章,无论是否有阅读量统计

SELECT a.yuming_id, a.yuming_author, b.yuming_count
FROM yuming_tbl a
LEFT JOIN tcount_tbl b ON a.yuming_author = b.yuming_author;

结果:

yuming_idyuming_authoryuming_count
1禹凕10
2禹凕10
3YUMING.COM20
4YUMING.COM20
5FKNULL

特点

3. RIGHT JOIN(右连接)

返回右表所有记录,左表无匹配时填充 NULL。

语法

SELECT columns
FROM left_table
RIGHT JOIN right_table ON left_table.key = right_table.key;

示例:列出所有有阅读量统计的作者(含未发文作者)

SELECT a.yuming_id, a.yuming_author, b.yuming_count
FROM yuming_tbl a
RIGHT JOIN tcount_tbl b ON a.yuming_author = b.yuming_author;

结果:

表格

yuming_idyuming_authoryuming_count
1禹凕10
2禹凕10
3YUMING.COM20
4YUMING.COM20
NULLGoogle22

特点

三、高级用法与技巧

1. 多表连接(链式 JOIN)

-- 查询:客户名 + 订单号 + 产品名
SELECT c.name, o.order_id, p.product_name
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id;

2. 使用表别名(Alias)

3. 结合 WHERE、ORDER BY 等子句

-- 获取 2023 年后有订单的客户(含无订单客户)
SELECT c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.order_date >= '2023-01-01' OR o.id IS NULL
ORDER BY c.name;

4. 性能优化建议

四、PHP 脚本实战:执行 JOIN 查询

<?php
// 数据库连接
$conn = mysqli_connect('localhost', 'root', '123456');
mysqli_query($conn, "SET NAMES utf8mb4");
mysqli_select_db($conn, 'YUMING');

// INNER JOIN 查询
$sql = "
    SELECT a.yuming_id, a.yuming_author, b.yuming_count
    FROM runoob_tbl a
    INNER JOIN tcount_tbl b ON a.yuming_author = b.yuming_author
";

$result = mysqli_query($conn, $sql);
if (!$result) {
    die('查询失败: ' . mysqli_error($conn));
}

// 输出结果
echo '<h2>文章作者阅读量统计</h2>';
echo '<table border="1">
        <tr><th>ID</th><th>作者</th><th>阅读量</th></tr>';

while ($row = mysqli_fetch_assoc($result)) {
    echo "<tr>
            <td>{$row['yuming_id']}</td>
            <td>{$row['yuming_author']}</td>
            <td>{$row['yuming_count']}</td>
          </tr>";
}
echo '</table>';

mysqli_free_result($result);
mysqli_close($conn);
?>

注意:生产环境务必使用 预处理语句(Prepared Statements) 防止 SQL 注入。

小结

场景推荐 JOIN
只需要两表都存在的数据INNER JOIN
需要主表全部数据(如所有用户)LEFT JOIN
需要副表全部数据(罕见)RIGHT JOIN(或改写为 LEFT JOIN)

“以业务主表为 LEFT,用 LEFT JOIN 保全主数据;若只需交集,用 INNER JOIN 提升性能。”

掌握 JOIN,你就掌握了关系型数据库的灵魂。合理运用它,让分散的数据为你讲述完整的故事!

到此这篇关于MYSQL基础知识之内、左、右连接的文章就介绍到这了,更多相关MYSQL内、左、右连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文