JOIN Clause
The relational model allows us to execute queries on related tables, so that we can extract and integrate information from several tables in a single execution. This is possible thanks to the JOIN clause, which we will explain in more detail below:
For better understanding of the examples, we have done some new INSERT INTO on the Customers and Orders table:
INSERT INTO Customers ([name], lastName, [address], bankAccount)
VALUES ('Jessie', 'Good', '4452 Ventura Drive', 790763467);
INSERT INTO Customers ([name], lastName, [address], bankAccount)
VALUES ('Paul', 'Williams', '2696 Ocello Street', NULL);
INSERT INTO Orders (product, productDescription, price, orderDate, productQuantity, customerId)
VALUES ('Balay Oven', 'Appliance', '699.55 ', '2022-09-10', 2, NULL);
| customerId | name | lastName | address | bankAccount |
|---|---|---|---|---|
| 6 | Jessie | Good | 4452 Ventura Drive | 790763467 |
| 7 | Paul | Williams | 2696 Ocello Street | NULL |
| orderId | product | productDescription | price | orderDate | productQuantity | totalPrice | customerId |
|---|---|---|---|---|---|---|---|
| 8 | Balay Oven | Appliance | 699,55 | 2022-09-10 | 2 | 1399,1 | NULL |
INNER JOIN
Is the most common JOIN .In fact if we only indicate the word JOIN in our SELECT, the system will automatically interpret it as INNER JOIN. This clause establish a relation between two tables through a common field of the main and secondary tables, returning only the records that have matching values in both tables.
JOIN can be chained together to establish several relationships from a single statement.
The basic syntax is simple:
SELECT columns FROM table1 (INNER) JOIN table2 ON table1.relationField = table2.relationField;
The following example illustrates an INNER JOIN relationship between the Customers and Orders tables:
| customerId | lastName | orderId | product | price | productQuantity |
|---|---|---|---|---|---|
| 2 | Pettitt | 2 | Play Station 5 | 549,95 | 4 |
| 2 | Pettitt | 3 | Xbox series X | 499,99 | 2 |
From this execution we can know that the client with the last name Pettitt has made 2 orders, and we can also see the information of the articles.
There is an alternative way to carry out the INNER JOIN, directly indicating the tables that we want to relate in the FROM and establishing the relationship through the related fields in the WHERE.The syntax will be as it follows:
SELECT columns FROM table1, table2 WHERE table1.relationField = table2.relationField
This execution would return the same result as the previous one.
If we launch an execution without WHERE filters, we can see that it returns all records whose common field (customerId) is present in both tables.
| customerId | lastName | orderId | product | price | productQuantity |
|---|---|---|---|---|---|
| 1 | Haynes | 4 | MacBook Pro M1 | 2449,5 | 1 |
| 2 | Pettitt | 2 | Play Station 5 | 549,95 | 4 |
| 2 | Pettitt | 3 | Xbox series X | 499,99 | 2 |
| 3 | Davis | 1 | Xiaomi Mi 11 | 286,95 | 15 |
| 4 | Ward | 5 | Echo DOT 3 | 39,99 | 50 |
| 4 | Ward | 6 | Echo DOT 4 | 59,99 | 50 |
| 5 | Lee | 7 | Nintendo Switch | 299,99 | 3 |
LEFT (OUTER) JOIN
This clause returns all the records of the left table (Customers) plus those that intersect both tables (such as the INNER JOIN).

We execute the previous statement changing the INNER JOIN clause for LEFT JOIN:
| customerId | lastName | orderId | product | price | productQuantity |
|---|---|---|---|---|---|
| 1 | Haynes | 4 | MacBook Pro M1 | 2449,5 | 1 |
| 2 | Pettitt | 2 | Play Station 5 | 549,95 | 4 |
| 2 | Pettitt | 3 | Xbox series X | 499,99 | 2 |
| 3 | Davis | 1 | Xiaomi Mi 11 | 286,95 | 15 |
| 4 | Ward | 5 | Echo DOT 3 | 39,99 | 50 |
| 4 | Ward | 6 | Echo DOT 4 | 59,99 | 50 |
| 5 | Lee | 7 | Nintendo Switch | 299,99 | 3 |
| 6 | Good | NULL | NULL | NULL | NULL |
| 7 | Williams | NULL | NULL | NULL | NULL |
RIGHT (OUTER) JOIN
This clause returns all records from the right table (Orders) plus those that intersect both tables.

We execute the previous statement using the RIGHT JOIN clause:
| customerId | lastName | orderId | product | price | productQuantity |
|---|---|---|---|---|---|
| 1 | Haynes | 4 | MacBook Pro M1 | 2449,5 | 1 |
| 2 | Pettitt | 2 | Play Station 5 | 549,95 | 4 |
| 2 | Pettitt | 3 | Xbox series X | 499,99 | 2 |
| 3 | Davis | 1 | Xiaomi Mi 11 | 286,95 | 15 |
| 4 | Ward | 5 | Echo DOT 3 | 39,99 | 50 |
| 4 | Ward | 6 | Echo DOT 4 | 59,99 | 50 |
| 5 | Lee | 7 | Nintendo Switch | 299,99 | 3 |
| NULL | NULL | 8 | Balay Oven | 699,55 | 2 |
FULL (OUTER) JOIN
This clause returns both the left and right table records, regardless of whether they intersect or not.

We execute the previous statement with FULL JOIN:
| customerId | lastName | orderId | product | price | productQuantity |
|---|---|---|---|---|---|
| 1 | Haynes | 4 | MacBook Pro M1 | 2449,5 | 1 |
| 2 | Pettitt | 2 | Play Station 5 | 549,95 | 4 |
| 2 | Pettitt | 3 | Xbox series X | 499,99 | 2 |
| 3 | Davis | 1 | Xiaomi Mi 11 | 286,95 | 15 |
| 4 | Ward | 5 | Echo DOT 3 | 39,99 | 50 |
| 4 | Ward | 6 | Echo DOT 4 | 59,99 | 50 |
| 5 | Lee | 7 | Nintendo Switch | 299,99 | 3 |
| 6 | Good | NULL | NULL | NULL | NULL |
| 7 | Williams | NULL | NULL | NULL | NULL |
| NULL | NULL | 8 | Balay Oven | 699,55 | 2 |