Wednesday, May 10, 2017

There are two kinds of OUTER joins in SQL, LEFTOUTER join and RIGHTOUTER join. The main difference between RIGHTOUTER join and LEFTOUTER join, as there name suggest, is the inclusion of non-matched rows. Sine INNER join only include matching rows, where the value of joining column is same, in the final result set, but OUTER join extends that functionality and also include unmatched rows in the final result. LEFT outer join includes unmatched rows from table written on the left of join predicate. On the other hand, RIGHTOUTER join, along with all matching rows, includes unmatched rows from the right side of the table.
In short result of LEFT outer join is INNERJOIN + unmatched rows from LEFT table and RIGHTOUTER join is INNERJOIN + unmatched rows from the right-hand side table.

Similar to the difference between INNER join and OUTER join, the difference between LEFT and RIGHTOUTERJOIN can be better understand by a simple example, which we will see in next section.

By the way, joins are very popular in SQL interviews, and along with classic questions about finding second highest salary of employee, Inner join vs outer join or left outer join vs right outer join is commonly asked.

LEFT and RIGHT OUTER Join Example in SQL

In order to understand difference between LEFT and RIGHT outer join, we will use once again use classical Employee and Department relationship. In this example, both of these tables are connected using dept_id, which means both have the same set of data in that column, let's see data on these two tables.

mysql> select * from employee;

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

| emp_id | emp_name | dept_id | salary |

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

|103 | Jack|1 |1400 |

|104 | John|2 |1450 |

|108 | Alan|3 |1150 |

|107 | Ram|NULL |600 |

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

4 rows in set (0.00 sec)

mysql> select * from department;

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

| dept_id | dept_name |

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

|1 | Sales|

|2 | Finance|

|3 | Accounts|

|4 | Marketing |

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

4 rows in set (0.00 sec)

If you look closely, there is one row in employee table which contains NULL, for which there is no entry in department table. Similarly, department table contains a department (row) Marketing ,for which there is no employee in the employee table.

When we do a LEFT or RIGHT outer join it includes unmatched rows from left or right table. In this case LEFTOUTERJOIN should include employee with NULL as department and RIGHTOUTER JOIN should include Marketing department. Here is example of LEFT and RIGHTOUTER Join in MySQL database :

As I said unmatched rows, i.e. row with dept_id as NULL has included in the final result and dept_name for that row is NULL, as there is no corresponding row for NULLdept_id in department table. But note that Marketing department is not included in this result. Now, let's see example of RIGHT OUTER JOIN in MySQL, this should include Marketing department but leave out employee with NULL dept_id.

As I said, final result set has Marketing department and emp_id, emp_name is NULL in that row because there is no employee with dept_id=4 in the employee table.

Difference between LEFT and RIGHT OUTER JOIN in SQL

In short, following are some notable difference between LEFT and RIGHT outer join in SQL :

1) LEFT OUTER join includes unmatched rows from left table while RIGHT OUTER join includes unmatched rows from the right side of the table.

2) The result of LEFT OUTER join can be seen as INNER JOIN + unmatched rows of left able while the result of the RIGHT OUTER join is equal to INNER JOIN + unmatched rows from the right side table.

3) In ANSI SQL, left outer join is written as LEFT JOIN while right outer join is written as RIGHT JOIN in select SQL statements.

4) In Transact-SQL syntax left outer join is written as *= and right outer join is written as =*, Sybase database supports both syntax and you can write join queries in both ANSI and T-SQL syntax.

That's all on difference between LEFT and RIGHT OUTER JOIN in SQL. We have seen example of RIGHT and LEFT join in MySQL database but since we have used ANSI syntax of OUTER joins, it's for other databases e.g. Oracle, Sybase, SQL Server and PostgreSQL as well. JOIN is a one of the most important and common concept in SQL and you should be good enough to figure out which rows will be included as a result of JOIN statement before actually running that SELECT query against any table. Sometimes erroneous JOIN query can bring loads of data and potentially may hang your database so beware of it.

8 comments
:

@PravinShirke:I was asked this question in one of my inteviews 5-6yrs back and i have still not able to find the answer, maybe you can answer it hopefully..w.r.t above classic example.Q. If we perform left outer join on employee and department it will return all records from left table and only matching from right. similarly, right outer join will return all the records from department and only matching from employee table. NOW... what if we swap the tables in left outer join. i.e if we perform left outer join of department and employee which will return same records as output as right outer join. THEN THE QUESTION IS WHY DO WE HAVE RIGHT OUTER JOIN IN SQL???

Main difference between LEFT OUTER Join and INNER Join is that former will also include non-matching rows from left table, while INNER join will only include matching rows. To better understand, consider classic Employee and Department schema joined together by DEPT_ID. How do you list ALL departments with number of employees there? If you use INNER join you will miss out empty departments because those DEPT_ID will not be found in DEPARTMENT table. This is the classical mistake SQL programmers make, not just on interviews but also while writing queries.

Quoting Anonymous:"Having said that I rarely see anyone code a "RIGHT OUTER", most people just automatically order their tables to be "LEFT OUTER" joins if an outer is needed."I agree. I don't know the ANSI SQL standard well enough to know if there actually IS a theoretical difference between LEFT and RIGHT. Nevertheless Microsoft Access QBE GUI will create a RIGHT OUTER JOIN if you want to list all tuples from the detail table (m-side) and only matching tuples from the master table (1-side). At least it will stay quiet if you manually change the RIGHT into a LEFT OUTER JOIN flipping the tables' names. I don't know any example (yet) where you are actually forced to use RIGHT OUTER joins.