暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 连接的使用


以下是 MySQL 中连接操作的详细说明:

一、基本语法和参数说明

  1. INNER JOIN
    (内连接)

    • 语法:SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name [INNER JOIN table3 ON...]

    • 参数说明:通过 ON
       子句指定连接条件,返回多个表中连接字段匹配的行。

  2. LEFT JOIN
    (左连接)

    • 语法:SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name [LEFT JOIN table3 ON...]

    • 参数说明:返回左表的所有行,以及右表中与左表连接字段匹配的行。右表中无匹配的行对应列为 NULL

  3. RIGHT JOIN
    (右连接)

    • 语法:SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name [RIGHT JOIN table3 ON...]

    • 参数说明:返回右表的所有行,以及左表中与右表连接字段匹配的行。左表中无匹配的行对应列为 NULL


二、多表连接实例(假设有三个表:students、courses、enrolls)

  1. 创建 students
     表及数据

CREATE TABLE students (
        student_id INT PRIMARY KEY,
        student_name VARCHAR(50)
    );

    INSERT INTO students (student_id, student_name)
    VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');

2.  创建 courses
 表及数据

CREATE TABLE courses (
        course_id INT PRIMARY KEY,
        course_name VARCHAR(50)
    );

    INSERT INTO courses (course_id, course_name)
    VALUES (1, 'Math'), (2, 'Science'), (3, 'History');

  1. 创建 enrolls
     表及数据

CREATE TABLE enrolls (
        enroll_id INT PRIMARY KEY,
        student_id INT,
        course_id INT,
        grade DECIMAL(5, 2)
    );

    INSERT INTO enrolls (enroll_id, student_id, course_id, grade)
    VALUES (1, 1, 1, 90.50), (2, 1, 2, 85.00), (3, 2, 1, 75.50), (4, 3, 3, 92.00);


  1. 多表连接示例

    • INNER JOIN
       示例


    SELECT s.student_name, c.course_name, e.grade
        FROM students s
        INNER JOIN enrolls e ON s.student_id = e.student_id
        INNER JOIN courses c ON e.course_id = c.course_id;


输出结果:

    +-------------+-------------+-------+
| student_name| course_name | grade |
+-------------+-------------+-------+
| Alice | Math | 90.5 |
| Alice | Science | 85.0 |
| Bob | Math | 75.5 |
| Charlie | History | 92.0 |

+-------------+-------------+-------+



  • LEFT JOIN
     示例

SELECT s.student_name, c.course_name, e.grade
    FROM students s
    LEFT JOIN enrolls e ON s.student_id = e.student_id
    LEFT JOIN courses c ON e.course_id = c.course_id;

输出结果:

    +-------------+-------------+-------+
| student_name| course_name | grade |
+-------------+-------------+-------+
| Alice | Math | 90.5 |
| Alice | Science | 85.0 |
| Bob | Math | 75.5 |
| Charlie | NULL | NULL |
+-------------+-------------+-------+


  • RIGHT JOIN
     示例

SELECT s.student_name, c.course_name, e.grade
    FROM students s
    RIGHT JOIN enrolls e ON s.student_id = e.student_id
    RIGHT JOIN courses c ON e.course_id = c.course_id;

输出结果:

    +-------------+-------------+-------+
| student_name| course_name | grade |
+-------------+-------------+-------+
| Alice | Math | 90.5 |
| Alice | Science | 85.0 |
| Bob | Math | 75.5 |

| NULL | History | 92.0 |



+-------------+-------------+-------+

三、带 WHERE
 子句的实例

  • INNER JOIN
     带 WHERE
     子句

SELECT s.student_name, c.course_name, e.grade
    FROM students s
    INNER JOIN enrolls e ON s.student_id = e.student_id
    INNER JOIN courses c ON e.course_id = c.course_id
    WHERE e.grade > 80;


输出结果:

    +-------------+-------------+-------+
| student_name| course_name | grade |
+-------------+-------------+-------+
| Alice | Math | 90.5 |
| Alice | Science | 85.0 |
| Charlie | History | 92.0 |
+-------------+-------------+-------+


  • LEFT JOIN
     带 WHERE
     子句

SELECT s.student_name, c.course_name, e.grade
    FROM students s
    LEFT JOIN enrolls e ON s.student_id = e.student_id
    LEFT JOIN courses c ON e.course_id = c.course_id
    WHERE c.course_name = 'Math';

输出结果:

    +-------------+-------------+-------+
| student_name| course_name | grade |
+-------------+-------------+-------+
| Alice | Math | 90.5 |
| Bob | Math | 75.5 |
| Charlie | NULL | NULL |
+-------------+-------------+-------+



+-------------+-------------+-------+

四、注意事项:

  1. 连接条件的准确性至关重要,错误的连接条件可能导致意外的结果或丢失数据。

  2. 在处理多表连接时,要注意表的连接顺序,可能会影响查询的性能。

  3. 对于包含 NULL
     值的列,在使用条件判断时要特别小心,例如 IS NULL
     和 IS NOT NULL
     的使用。

  4. WHERE
     子句是在连接操作完成后对结果进行筛选,其条件要基于连接后的结果进行设置。

  5. 对于大型数据集,合理使用索引可以提高连接和查询的性能。




点 击 下 方  关注+星标  公众号



文章转载自SQL 数据库入门学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论