JOIN clause in SQL
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);
SELECT *
FROM Customers
WHERE customerId IN (6, 7);
customerId | name | lastName | address | bankAccount |
---|---|---|---|---|
6 | Jessie | Good | 4452 Ventura Drive | 790763467 |
7 | Paul | Williams | 2696 Ocello Street | NULL |
SELECT *
FROM Orders
WHERE orderId = 8;
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.
Multiple 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:
SELECT C.customerId,
C.lastName,
O.orderId,
O.product,
O.price,
O.productQuantity
FROM Customers C
JOIN Orders O
ON C.customerId = O.customerId
WHERE C.name = 'Mavin';
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
SELECT C.customerId,
C.lastName,
O.orderId,
O.product,
O.price,
O.productQuantity
FROM Customers C , Orders O
WHERE C.customerId = O.customerId
AND C.name = 'Mavin';
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.
SELECT C.customerId,
C.lastName,
O.orderId,
O.product,
O.price,
O.productQuantity
FROM Customers C
INNER JOIN Orders O
ON C.customerId = O.customerId
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
:
SELECT C.customerId,
C.lastName,
O.orderId,
O.product,
O.price,
O.productQuantity
FROM Customers C
LEFT JOIN Orders O
ON C.customerId = O.customerId
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:
SELECT C.customerId,
C.lastName,
O.orderId,
O.product,
O.price,
O.productQuantity
FROM Customers C
RIGHT JOIN Orders O
ON C.customerId = O.customerId
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
:
SELECT C.customerId,
C.lastName,
O.orderId,
O.product,
O.price,
O.productQuantity
FROM Customers C
FULL JOIN Orders O
ON C.customerId = O.customerId
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 | Xiami 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 |