PostgreSQL Tutorial
Data Types
Querying & Filtering Data
Managing Tables
Modifying Data
Conditionals
Control Flow
Transactions & Constraints
Working with JOINS & Schemas
Roles & Permissions
Working with Sets
Subquery & CTEs
User-defined Functions
Important In-Built Functions
PostgreSQL PL/pgSQL
Variables & Constants
Stored Procedures
Working with Triggers
Working with Views & Indexes
Errors & Exception Handling
In PostgreSQL, a FULL OUTER JOIN
returns all the records when there is a match in either the left (first) table or the right (second) table records. If there's no match, the result is NULL
for every column of the table that lacks a matching row.
SELECT columns FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
Let's consider two tables:
employees
| id | name | |----|-----------| | 1 | John | | 2 | Lucy | | 3 | Mike |
orders
| order_id | employee_id | product | |----------|-------------|----------| | 101 | 1 | Laptop | | 102 | 3 | Monitor | | 103 | 5 | Keyboard |
Now, if you want to list all employees and their orders, even if they haven't made any orders or there are orders with non-existent employee IDs, you'd use a FULL OUTER JOIN
:
SELECT e.name, o.product FROM employees e FULL OUTER JOIN orders o ON e.id = o.employee_id;
The result would be:
| name | product | |------|----------| | John | Laptop | | Lucy | NULL | | Mike | Monitor | | NULL | Keyboard |
Here's what happens:
John has made an order, so his name and product ("Laptop") are listed.
Lucy hasn't made any orders, so her name appears with a NULL
in the product column.
Mike has made an order, so his name and product ("Monitor") are listed.
There's an order (Keyboard) with an employee_id (5) that doesn't exist in the employees table, so NULL
appears in the name column and the product is shown.
The FULL OUTER JOIN
ensures that we don't miss data from either table, filling in gaps with NULL
where necessary.
How to use FULL OUTER JOIN in PostgreSQL:
FULL OUTER JOIN
to combine rows from both tables, including unmatched rows from both tables.SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
PostgreSQL FULL OUTER JOIN example:
FULL OUTER JOIN
to retrieve all rows from both tables.SELECT * FROM employees FULL OUTER JOIN departments ON employees.department_id = departments.department_id;
Comparing INNER JOIN and FULL OUTER JOIN in PostgreSQL:
INNER JOIN
and FULL OUTER JOIN
.-- INNER JOIN SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column; -- FULL OUTER JOIN SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
Multiple tables FULL OUTER JOIN in PostgreSQL:
FULL OUTER JOIN
to include multiple tables.SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column FULL OUTER JOIN table3 ON table1.column = table3.column;
Handling NULL values with FULL OUTER JOIN in PostgreSQL:
FULL OUTER JOIN
.SELECT table1.column, table2.column FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
FULL OUTER JOIN vs. LEFT JOIN vs. RIGHT JOIN in PostgreSQL:
FULL OUTER JOIN
with LEFT JOIN
and RIGHT JOIN
.-- LEFT JOIN SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column; -- RIGHT JOIN SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column; -- FULL OUTER JOIN SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
Using WHERE clause with FULL OUTER JOIN in PostgreSQL:
WHERE
clause to filter results from FULL OUTER JOIN
.SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column WHERE table1.condition_column = 'value';
Conditional FULL OUTER JOIN in PostgreSQL:
FULL OUTER JOIN
to control the joining condition.SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column AND table2.condition_column = 'value';
Combining FULL OUTER JOIN with GROUP BY in PostgreSQL:
FULL OUTER JOIN
using GROUP BY
.SELECT column1, COUNT(column2) FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column GROUP BY column1;
FULL OUTER JOIN with subqueries in PostgreSQL:
FULL OUTER JOIN
for more complex queries.SELECT * FROM ( SELECT column1 FROM table1 UNION SELECT column1 FROM table2 ) AS subquery FULL OUTER JOIN table3 ON subquery.column1 = table3.column1;
Applying ORDER BY with FULL OUTER JOIN results in PostgreSQL:
FULL OUTER JOIN
using the ORDER BY
clause.SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column ORDER BY table1.column;
Handling duplicates in FULL OUTER JOIN in PostgreSQL:
FULL OUTER JOIN
.SELECT DISTINCT column1, column2 FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
Nested FULL OUTER JOIN in PostgreSQL:
FULL OUTER JOIN
within other join types for more complex queries.SELECT * FROM table1 FULL OUTER JOIN (table2 INNER JOIN table3 ON table2.column = table3.column) ON table1.column = table2.column;
Using aliases with FULL OUTER JOIN in PostgreSQL:
FULL OUTER JOIN
.SELECT t1.column AS t1_column, t2.column AS t2_column FROM table1 t1 FULL OUTER JOIN table2 t2 ON t1.column = t2.column;
Optimizing queries with FULL OUTER JOIN in PostgreSQL:
FULL OUTER JOIN
condition.CREATE INDEX idx_table1_column ON table1(column); CREATE INDEX idx_table2_column ON table2(column); SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
Common mistakes with FULL OUTER JOIN in PostgreSQL:
-- Incorrect column reference SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column1 = table2.column2;