MySQL:表联结

414 阅读2分钟

前言

在日常的数据库表设计中,表与表之间是不可能完全独立,外键(Foreign Key)或者中间表的方式,我们可以建立两表数据间的关联关系。

两表数据间的关联关系建立起来了,我们又要如何通过SELECT语句将具有关联关系的两表数据检索输出为一行行的数据呢?当然,我们可以使用嵌套子句检索出所要的数据。但是,MySQL还提供了另外一种强大的功能:表联结。

本篇文章的内容是自己在学习这部分知识的时候的一些总结。

内容

表联结存在不同的联结方式,这里我们只讨论常用的三种表联结类型:内联结(INNER JOIN)、左联结(LEFT JOIN)、右联结(RIGHT JOIN);

表联结在使用上一般配合ON子句来进行联结的判断,这个判断的值决定两表格之间的行与行之间是否进行联结。

    # 内联结
    SELECT *
    FROM [table_name_1] INNER JOIN [table_name_2]
    ON [table_name_1].[column_1] = [table_name_2].[column_2];
    
    # 左联结
    SELECT *
    FROM [table_name_1] LEFT JOIN [table_name_2]
    ON [table_name_1].[column_1] = [table_name_2].[column_2];
    
    # 右联结
    SELECT *
    FROM [table_name_1] RIGHT JOIN [table_name_2]
    ON [table_name_1].[column_1] = [table_name_2].[column_2];

注意:如果在表联结不使用ON子句进行联结判断,则会直接根据笛卡尔积(Cartesian Product)生成表联结结果。

三种联结方式,主要是在根据联结判断上输出结果集的行为上存在显著的差异:

内联结: 对两表行做笛卡尔积组合,输出符合ON子句中联结判断的组合行;

左联结: 对两表行做笛卡尔积组合,输出符合ON子句中联结判断的组合行,同时输出左侧表中未匹配到组合行数据(组合行数据中右侧表的列设置为NULL);

右联结: 对两表行做笛卡尔积组合,输出符合ON子句中联结判断的组合行,同时输出右侧表中未匹配到组合行数据(组合行数据中左侧表的列设置为NULL);

下面,我们通过图来更加直观的了解三种联结的差异。

tableJoin.png

总结

MySQL的表联结给我们他提供了一种很强大的功能来处理表与表之间的关联关系,并且根据关联关系结合两个表的行数据输出关联后的组合表数据。

表联结虽然方便,但是需要特别注意的是,表联结的性能随着联结的表的数量的增加而下降。所以,确保不要联结不必要的表。

参考资料