• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SQL之各种join小结详细讲解

    SQL Left Join, Right Join, Inner Join, and Natural Join 各种Join小结

    在SQL语言中,存在着各种Join,有Left Join, Right Join, Inner Join, and Natural Join等,对于初学者来说肯定一头雾水,都是神马跟神马啊,它们之间到底有着怎样的区别和联系呢,我们先用一张图片来说明:

    上面这张图很好的阐释了Left Join, Right Join, Inner Join,和Full Outer Join的区别,下面用我们用一个简单的例子来帮助我们理解和区分,现在有两个表Person和Address:

    -- Table Person
    +----------+-----------+----------+
    | PersonId | FirstName | LastName |
    +----------+-----------+----------+
    |        1 | Zhang     | San      |
    |        2 | Li        | Si       |
    |        3 | Wang      | Wu       |
    |        4 | Yang      | Liu      |
    +----------+-----------+----------+


    -- Table Address
    +-----------+----------+---------------+-------+
    | AddressId | PersonId | City          | State |
    +-----------+----------+---------------+-------+
    |         1 |        2 | San Francisco | CA    |
    |         2 |        3 | Los Angeles   | CA    |
    |         3 |        1 | San Diego     | CA    |
    +-----------+----------+---------------+-------+

    我们下面一个一个的来看:

    Left Join: returns all rows from the left table (table1), with the matching rows in the right table (table2). The result is NULL in the right side when there is no match.

    左交:返回左表的所有行和匹配的右表的行,如果没有匹配上的用NULL.

    SELECT * FROM Person LEFT JOIN Address ON Person.PersonId = Address.PersonId; 
    +----------+-----------+----------+-----------+----------+---------------+-------+
    | PersonId | FirstName | LastName | AddressId | PersonId | City   | State |
    +----------+-----------+----------+-----------+----------+---------------+-------+
    |        2 | Li        | Si       |         1 |        2 | San Francisco | CA    |
    |        3 | Wang      | Wu       |         2 |        3 | Los Angeles   | CA    |
    |        1 | Zhang     | San      |         3 |        1 | San Diego     | CA    |
    |        4 | Yang      | Liu      |      NULL |     NULL | NULL          | NULL  |
    +----------+-----------+----------+-----------+----------+---------------+-------+

    Right Join: returns all rows from the right table (table2), with the matching rows in the left table (table1). The result is NULL in the left side when there is no match.

    右交:返回右表的所有行和匹配的左表的行,如果没有匹配上的用NULL.

    SELECT * FROM Person RIGHT JOIN Address ON Person.PersonId = Address.PersonId; 
    +----------+-----------+----------+-----------+----------+---------------+-------+
    | PersonId | FirstName | LastName | AddressId | PersonId | City          | State |
    +----------+-----------+----------+-----------+----------+---------------+-------+
    |        1 | Zhang     | San      |         3 |        1 | San Diego     | CA    |
    |        2 | Li        | Si       |         1 |        2 | San Francisco | CA    |
    |        3 | Wang      | Wu       |         2 |        3 | Los Angeles   | CA    |
    |     NULL | NULL      | NULL     |         4 |        5 | Memphis       | TN    |
    +----------+-----------+----------+-----------+----------+---------------+-------+

    Inner Join: selects all rows from both tables as long as there is a match between the columns in both tables.

    内交: 选择左右表中关键字匹配上的行。

    SELECT * FROM Person INNER JOIN Address ON Person.PersonId = Address.PersonId;  +----------+-----------+----------+-----------+----------+---------------+-------+
    | PersonId | FirstName | LastName | AddressId | PersonId | City          | State |
    +----------+-----------+----------+-----------+----------+---------------+-------+
    |        1 | Zhang     | San      |         3 |        1 | San Diego     | CA    |
    |        2 | Li        | Si       |         1 |        2 | San Francisco | CA    |
    |        3 | Wang      | Wu       |         2 |        3 | Los Angeles   | CA    |
    +----------+-----------+----------+-----------+----------+---------------+-------+

    Full Join: returns all rows from the left table (table1) and from the right table (table2), and it combines the result of both LEFT and RIGHT joins.

    全交: 返回左表的所有行和右表的所有行,是左交和右交的联合。

    注意,由于MySql中没有Full Join命令,所以我们通过把Left Join和Right Join的结果Union起来也是可以的:

    SELECT * FROM Person LEFT JOIN Address ON Person.PersonId = Address.PersonId UNION
    SELECT * FROM Person RIGHT JOIN Address ON Person.PersonId = Address.PersonId;  +----------+-----------+----------+-----------+----------+---------------+-------+
    | PersonId | FirstName | LastName | AddressId | PersonId | City          | State |
    +----------+-----------+----------+-----------+----------+---------------+-------+
    |        2 | Li        | Si       |         1 |        2 | San Francisco | CA    |
    |        3 | Wang      | Wu       |         2 |        3 | Los Angeles   | CA    |
    |        1 | Zhang     | San      |         3 |        1 | San Diego     | CA    |
    |        4 | Yang      | Liu      |      NULL |     NULL | NULL          | NULL  |
    |     NULL | NULL      | NULL     |         4 |        5 | Memphis       | TN    |
    +----------+-----------+----------+-----------+----------+---------------+-------+

    Natural Join: creates an implicit join clause for you based on the common columns in the two tables being joined. Common columns are columns that have the same name in both tables. A NATURAL JOIN can be an INNER join, a LEFT OUTER join, or a RIGHT OUTER join. The default is INNER join.

    自然交: 根据左右两表的相同列创建一个隐含的join操作,相同列就是两表中列名相同的两列。自然交可以是内交,左交或者是右交。默认是内交。

    SELECT * FROM Person NATURAL JOIN Address; 

    +----------+-----------+----------+-----------+---------------+-------+
    | PersonId | FirstName | LastName | AddressId | City          | State |
    +----------+-----------+----------+-----------+---------------+-------+
    |        1 | Zhang    | San      |         3 | San Diego     | CA    |
    |        2 | Li        | Si       |         1 | San Francisco | CA    |
    |        3 | Wang      | Wu       |         2 | Los Angeles   | CA    |
    +----------+-----------+----------+-----------+---------------+-------+

    最后注意一下,下面等号左右两边的关键字是等价的:

    A LEFT JOIN B      =       A LEFT OUTER JOIN B
    A RIGHT JOIN B     =       A RIGHT OUTER JOIN B
    A FULL JOIN B      =       A FULL OUTER JOIN B
    A INNER JOIN B     =       A JOIN B

    到此这篇关于SQL之各种join小结详细讲解的文章就介绍到这了,更多相关SQL之各种join小结内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 浅谈mysql join底层原理
    • SQL语句中JOIN的用法场景分析
    • MYSQL数据库基础之Join操作原理
    • 解决Mysql的left join无效及使用的注意事项说明
    • mysql left join快速转inner join的过程
    • 为什么代码规范要求SQL语句不要过多的join
    • mysql高效查询left join和group by(加索引)
    • MySQL的join buffer原理
    上一篇:SQL实现LeetCode(175.联合两表)
    下一篇:Mysql8.0递归查询的简单用法示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    SQL之各种join小结详细讲解 SQL,之,各种,join,小结,详细,