LEFT JOIN vs. LEFT OUTER JOIN in SQL Server

后端 未结 12 1682
失恋的感觉
失恋的感觉 2020-11-21 13:25

What is the difference between LEFT JOIN and LEFT OUTER JOIN?

相关标签:
12条回答
  • 2020-11-21 13:41

    To answer your question there is no difference between LEFT JOIN and LEFT OUTER JOIN, they are exactly same that said...

    At the top level there are mainly 3 types of joins:

    1. INNER
    2. OUTER
    3. CROSS

    1. INNER JOIN - fetches data if present in both the tables.

    2. OUTER JOIN are of 3 types:

      1. LEFT OUTER JOIN - fetches data if present in the left table.
      2. RIGHT OUTER JOIN - fetches data if present in the right table.
      3. FULL OUTER JOIN - fetches data if present in either of the two tables.
    3. CROSS JOIN, as the name suggests, does [n X m] that joins everything to everything.
      Similar to scenario where we simply lists the tables for joining (in the FROM clause of the SELECT statement), using commas to separate them.


    Points to be noted:

    • If you just mention JOIN then by default it is a INNER JOIN.
    • An OUTER join has to be LEFT | RIGHT | FULL you can not simply say OUTER JOIN.
    • You can drop OUTER keyword and just say LEFT JOIN or RIGHT JOIN or FULL JOIN.

    For those who want to visualise these in a better way, please go to this link: A Visual Explanation of SQL Joins

    0 讨论(0)
  • 2020-11-21 13:43

    As per the documentation: FROM (Transact-SQL):

    <join_type> ::= 
        [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
        JOIN
    

    The keyword OUTER is marked as optional (enclosed in square brackets). In this specific case, whether you specify OUTER or not makes no difference. Note that while the other elements of the join clause is also marked as optional, leaving them out will make a difference.

    For instance, the entire type-part of the JOIN clause is optional, in which case the default is INNER if you just specify JOIN. In other words, this is legal:

    SELECT *
    FROM A JOIN B ON A.X = B.Y
    

    Here's a list of equivalent syntaxes:

    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
    

    Also take a look at the answer I left on this other SO question: SQL left join vs multiple tables on FROM line?.

    enter image description here

    0 讨论(0)
  • 2020-11-21 13:43

    Why are LEFT/RIGHT and LEFT OUTER/RIGHT OUTER the same? Let's explain why this vocabulary. Understand that LEFT and RIGHT joins are specific cases of the OUTER join, and therefore couldn't be anything else than OUTER LEFT/OUTER RIGHT. The OUTER join is also called FULL OUTER as opposed to LEFT and RIGHT joins that are PARTIAL results of the OUTER join. Indeed:

    Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
       1    |   5            1    |   1             1    |   1             1    |   1
       2    |   1            2    |   2             2    |   2             2    |   2
       3    |   6            3    |  null           3    |  null           -    |   -
       4    |   2            4    |  null           4    |  null           -    |   -
                            null  |   5             -    |   -            null  |   5
                            null  |   6             -    |   -            null  |   6
    
                          OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)
    

    It is now clear why those operations have aliases, as well as it is clear only 3 cases exist: INNER, OUTER, CROSS. With two sub-cases for the OUTER. The vocabulary, the way teachers explain this, as well as some answers above, often make it looks like there are lots of different types of join. But it's actually very simple.

    0 讨论(0)
  • 2020-11-21 13:43

    Just in the context of this question, I want to post the 2 'APPLY' operators as well:

    JOINS:

    1. INNER JOIN = JOIN

    2. OUTER JOIN

      • LEFT OUTER JOIN = LEFT JOIN

      • RIGHT OUTER JOIN = RIGHT JOIN

      • FULL OUTER JOIN = FULL JOIN

    3. CROSS JOIN

    SELF-JOIN: This is not exactly a separate type of join. This is basically joining a table to itself using one of the above joins. But I felt it is worth mentioning in the context JOIN discussions as you will hear this term from many in the SQL Developer community.

    APPLY:

    1. CROSS APPLY -- Similar to INNER JOIN (But has added advantage of being able to compute something in the Right table for each row of the Left table and would return only the matching rows)
    2. OUTER APPLY -- Similar to LEFT OUTER JOIN (But has added advantage of being able to compute something in the Right table for each row of the Left table and would return all the rows from the Left table irrespective of a match on the Right table)

    https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

    https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

    Real life example, when to use OUTER / CROSS APPLY in SQL

    I find APPLY operator very beneficial as they give better performance than having to do the same computation in a subquery. They are also replacement of many Analytical functions in older versions of SQL Server. That is why I believe that after being comfortable with JOINS, one SQL developer should try to learn the APPLY operators next.

    0 讨论(0)
  • 2020-11-21 13:46

    I find it easier to think of Joins in the following order:

    • CROSS JOIN - a Cartesian product of both tables. ALL joins begin here
    • INNER JOIN - a CROSS JOIN with a filter added.
    • OUTER JOIN - an INNER JOIN with missing elements (from either LEFT or RIGHT table) added afterward.

    Until I figured out this (relatively) simple model, JOINS were always a bit more of a black art. Now they make perfect sense.

    Hope this helps more than it confuses.

    0 讨论(0)
  • 2020-11-21 13:55

    I'm a PostgreSQL DBA, as far as I could understand the difference between outer or not outer joins difference is a topic that has considerable discussion all around the internet. Until today I never saw a difference between those two; So I went further and I try to find the difference between those. At the end I read the whole documentation about it and I found the answer for this,

    So if you look on documentation (at least in PostgreSQL) you can find this phrase:

    "The words INNER and OUTER are optional in all forms. INNER is the default; LEFT, RIGHT, and FULL imply an outer join."

    In another words,

    LEFT JOIN and LEFT OUTER JOIN ARE THE SAME

    RIGHT JOIN and RIGHT OUTER JOIN ARE THE SAME

    I hope it can be a contribute for those who are still trying to find the answer.

    0 讨论(0)
提交回复
热议问题