美文网首页
【教3妹学编辑-mysql】详解join(内连接、外连接、交叉连

【教3妹学编辑-mysql】详解join(内连接、外连接、交叉连

作者: 程序员小2 | 来源:发表于2023-11-19 09:50 被阅读0次

    内连接、外连接、交叉连接、笛卡尔积

    • 内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
    • 外连接(outer join):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或两张表)中不满足 匹配关系的记录。
    • 交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在 SQL 中的实 现 , 如 果 A 表 有 m 行, B 表 有 n 行, 那 么 A 和 B 交 叉 连 接 的 结 果 就 有 m * n 行。
    • 笛卡尔积:是数学中的一个概念,例如集合 A={a,b},集合 B={0,1,2},那么 A B= {<a,o>,<a,1>,<a,2>, <b,0>,<b,1>,<b,2>,} 。

    外连接常用的有左连接、右连接:

    • left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
    • right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。

    join的实现

    join的实现其实是先从一个表中找出所有行(或者根据where子句查出符号条件的行),然后去下一个表中循环寻找匹配的行,依次下去,直到找到所有匹配的行,使用join不会去创建临时表,使用in的话会创建临时表,销毁临时表

    平时多做练习

    知其然,知其所以然,并且要学以至用。
    不仅仅知道概念,还需要动手写sql,一般都是简单的连接查询,具体关于连接查询的sql练习,参见以下链接:

    小试一下:

    题目:组合两个表

    表: Person

    +-------------+---------+
    | 列名 | 类型 |
    +-------------+---------+
    | PersonId | int |
    | FirstName | varchar |
    | LastName | varchar |
    +-------------+---------+
    personId 是该表的主键(具有唯一值的列)。
    该表包含一些人的 ID 和他们的姓和名的信息。

    表: Address

    +-------------+---------+
    | 列名 | 类型 |
    +-------------+---------+
    | AddressId | int |
    | PersonId | int |
    | City | varchar |
    | State | varchar |
    +-------------+---------+
    addressId 是该表的主键(具有唯一值的列)。
    该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。

    编写解决方案,报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为 null 。

    以 任意顺序 返回结果表。

    结果格式如下所示。

    示例 1:

    输入:
    Person表:
    +----------+----------+-----------+
    | personId | lastName | firstName |
    +----------+----------+-----------+
    | 1 | Wang | Allen |
    | 2 | Alice | Bob |
    +----------+----------+-----------+
    Address表:
    +-----------+----------+---------------+------------+
    | addressId | personId | city | state |
    +-----------+----------+---------------+------------+
    | 1 | 2 | New York City | New York |
    | 2 | 3 | Leetcode | California |
    +-----------+----------+---------------+------------+
    输出:
    +-----------+----------+---------------+----------+
    | firstName | lastName | city | state |
    +-----------+----------+---------------+----------+
    | Allen | Wang | Null | Null |
    | Bob | Alice | New York City | New York |
    +-----------+----------+---------------+----------+
    解释:
    地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。
    addressId = 1 包含了 personId = 2 的地址信息。

    思路:
    因为表 Address 中的 personId 是表 Person 的外关键字,所以我们可以连接这两个表来获取一个人的地址信息。
    考虑到可能不是每个人都有地址信息,我们应该使用 outer join 而不是默认的 inner join。

    sql

    # Write your MySQL query statement below
    
    select p.FirstName, p.LastName, a.City, a.State from Person as p left join Address as a on p.PersonId = a.PersonId
    

    相关文章

      网友评论

          本文标题:【教3妹学编辑-mysql】详解join(内连接、外连接、交叉连

          本文链接:https://www.haomeiwen.com/subject/sgcpwdtx.html