MySQL JOIN 详解
                           
天天向上
发布: 2025-02-18 22:36:51

原创
37 人浏览过

在 MySQL 中,JOIN 用于将多个表中的数据结合起来,通常是根据某些列进行匹配。常见的 JOIN 类型包括:INNER JOINLEFT JOINRIGHT JOIN 和 FULL JOIN(MySQL 不支持 FULL JOIN,通常可以通过 UNION 实现)。接下来,我将简要介绍这些 JOIN 类型,并提供一些实例。涵盖了如何在命令提示符中使用 JOIN,以及在 PHP 脚本中使用 JOIN 的方式。

MySQL JOIN 详解

在 MySQL 中,JOIN 操作允许我们在两个或多个表之间进行查询,结合不同表的数据。常见的 JOIN 类型有:

  • INNER JOIN
  • LEFT JOIN(或 LEFT OUTER JOIN
  • RIGHT JOIN(或 RIGHT OUTER JOIN
  • CROSS JOIN
  • FULL OUTER JOIN(需要通过 UNION 实现)

1. INNER JOIN

INNER JOIN 返回两个表中符合匹配条件的所有行。如果某个表中的行在另一个表中找不到匹配,它将被排除在结果之外。

参数说明:

  • ON 后面跟的是连接条件,通常是两个表中相同字段的比较。

命令行使用:

假设我们有两个表:employeesdepartments,查询所有有部门的员工:

SELECT employees.emp_name, departments.dept_name
FROM employees
INNER JOIN departments ON employees.dept_id = departments.dept_id;

参数说明:

  • employees.emp_name:我们要查询的字段,emp_name 是员工的名字。
  • departments.dept_name:我们要查询的字段,dept_name 是部门的名称。
  • employees.dept_iddepartments.dept_id:这两个字段是用于匹配员工和部门的字段。

PHP 脚本使用:

在 PHP 中,你可以通过 mysqliPDO 扩展来连接数据库并执行查询。以下是使用 mysqli 连接 MySQL 并执行 INNER JOIN 查询的例子:

<?php
// 创建数据库连接
$mysqli = new mysqli("localhost", "username", "password", "database_name");

// 检查连接是否成功
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

// 执行查询
$sql = "SELECT employees.emp_name, departments.dept_name
        FROM employees
        INNER JOIN departments ON employees.dept_id = departments.dept_id";
$result = $mysqli->query($sql);

// 输出查询结果
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Employee: " . $row["emp_name"]. " - Department: " . $row["dept_name"]. "<br>";
    }
} else {
    echo "0 results";
}

// 关闭连接
$mysqli->close();
?>

参数说明:

  • $mysqli->query($sql):执行查询 SQL。
  • $result->fetch_assoc():返回当前行作为关联数组,可以通过字段名称访问数据。

2. LEFT JOIN(或 LEFT OUTER JOIN)

LEFT JOIN 返回左表(employees)中的所有行,即使右表(departments)中没有匹配的行。如果没有匹配,则右表的字段为 NULL

命令行使用:

SELECT employees.emp_name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.dept_id;

参数说明:

  • LEFT JOIN:确保返回左表(employees)的所有行。

PHP 脚本使用:

<?php
// 创建数据库连接
$mysqli = new mysqli("localhost", "username", "password", "database_name");

// 检查连接是否成功
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

// 执行查询
$sql = "SELECT employees.emp_name, departments.dept_name
        FROM employees
        LEFT JOIN departments ON employees.dept_id = departments.dept_id";
$result = $mysqli->query($sql);

// 输出查询结果
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Employee: " . $row["emp_name"]. " - Department: " . $row["dept_name"]. "<br>";
    }
} else {
    echo "0 results";
}

// 关闭连接
$mysqli->close();
?>

3. RIGHT JOIN(或 RIGHT OUTER JOIN)

RIGHT JOIN 返回右表(departments)中的所有行。如果左表(employees)中没有匹配的行,则左表的字段为 NULL

命令行使用:

SELECT employees.emp_name, departments.dept_name
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.dept_id;

PHP 脚本使用:

<?php
// 创建数据库连接
$mysqli = new mysqli("localhost", "username", "password", "database_name");

// 检查连接是否成功
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

// 执行查询
$sql = "SELECT employees.emp_name, departments.dept_name
        FROM employees
        RIGHT JOIN departments ON employees.dept_id = departments.dept_id";
$result = $mysqli->query($sql);

// 输出查询结果
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Employee: " . $row["emp_name"]. " - Department: " . $row["dept_name"]. "<br>";
    }
} else {
    echo "0 results";
}

// 关闭连接
$mysqli->close();
?>

4. CROSS JOIN

CROSS JOIN 返回两个表的笛卡尔积,即每个左表的行都与每个右表的行组合。

命令行使用:

SELECT employees.emp_name, departments.dept_name
FROM employees
CROSS JOIN departments;

PHP 脚本使用:

<?php
// 创建数据库连接
$mysqli = new mysqli("localhost", "username", "password", "database_name");

// 检查连接是否成功
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

// 执行查询
$sql = "SELECT employees.emp_name, departments.dept_name
        FROM employees
        CROSS JOIN departments";
$result = $mysqli->query($sql);

// 输出查询结果
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Employee: " . $row["emp_name"]. " - Department: " . $row["dept_name"]. "<br>";
    }
} else {
    echo "0 results";
}

// 关闭连接
$mysqli->close();
?>

5. FULL OUTER JOIN(通过 UNION 实现)

MySQL 不直接支持 FULL OUTER JOIN,但可以通过结合 LEFT JOINRIGHT JOIN 来实现类似的效果。

命令行使用:

SELECT employees.emp_name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.dept_id
UNION
SELECT employees.emp_name, departments.dept_name
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.dept_id;

PHP 脚本使用:

<?php
// 创建数据库连接
$mysqli = new mysqli("localhost", "username", "password", "database_name");

// 检查连接是否成功
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

// 执行查询
$sql = "SELECT employees.emp_name, departments.dept_name
        FROM employees
        LEFT JOIN departments ON employees.dept_id = departments.dept_id
        UNION
        SELECT employees.emp_name, departments.dept_name
        FROM employees
        RIGHT JOIN departments ON employees.dept_id = departments.dept_id";
$result = $mysqli->query($sql);

// 输出查询结果
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Employee: " . $row["emp_name"]. " - Department: " . $row["dept_name"]. "<br>";
    }
} else {
    echo "0 results";
}

// 关闭连接
$mysqli->close();
?>

总结

  • INNER JOIN:返回两个表中匹配的记录。
  • LEFT JOIN:返回左表的所有记录,即使右表中没有匹配的记录。
  • RIGHT JOIN:返回右表的所有记录,即使左表中没有匹配的记录。
  • CROSS JOIN:返回两个表的笛卡尔积,每个左表的行与每个右表的行组合。
  • FULL OUTER JOIN:MySQL 不直接支持,使用 UNION 来实现。

这些 JOIN 操作在命令行和 PHP 中的用法基本一致,只是在 PHP 中通过数据库连接和查询执行来获取结果。

发表回复 0

Your email address will not be published. Required fields are marked *