JOINS
SQL
● Welcome to this section on JOINS.
● JOINS will allow us to combine information from
multiple tables!
● Let’s see what we will learn in this section
SQL
● Section Overview
○ Creating an alias with the AS clause
○ Understanding different kinds of JOINs
■ INNER JOINS
■ OUTER JOINS
■ FULL JOINS
■ UNIONS
○ Challenge Tasks
AS
SQL
● Before we learn about JOINs , let’s quickly cover the
AS clause which allows us to create an “alias” for a
column or result.
● Let’s see the example syntax
SQL
● SELECT column AS new_name
FROM table
SQL
● SELECT SUM(column) AS new_name
FROM table
SQL
● Example
SQL
● Example
SQL
● Example
SQL
● The AS operator gets executed at the very end of a
query, meaning that we can not use the ALIAS inside
a WHERE operator.
● Let’s walk through a few examples in pgAdmin!
INNER JOIN
SQL
● There are several types of JOINs, in this lecture we
will go through the simplest JOIN type, which is an
INNER JOIN
SQL
● What is a JOIN operation?
● JOINs allow us to combine multiple tables together.
● The main reason for the different JOIN types is to
decide how to deal with information only present in
one of the joined tables.
SQL
● Let’s imagine a simple example.
● Our company is holding a conference for people in
the movie rental industry.
● We’ll have people register online beforehand and then
login the day of the conference.
SQL
● After the conference we have these tables
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● The respective id columns indicate what order they
registered or logged in on site.
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● For the sake of simplicity, we will assume the names
are unique.
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● To help you keep track, Registrations names’ first
letters go A,B,C,D
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● An INNER JOIN will result with the set of records
that match in both tables.
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● An INNER JOIN will result with the set of records
that match in both tables.
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM TableA
INNER JOIN TableB
ON TableA.col_match = TableB.col_match
SQL
● SELECT * FROM TableA
INNER JOIN TableB
ON TableA.col_match = TableB.col_match
SQL
● SELECT * FROM TableB
INNER JOIN TableA
ON TableA.col_match = TableB.col_match
SQL
● SELECT * FROM Registrations
INNER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations
INNER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations
INNER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations
INNER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
reg_id name RESULTS log_id name
1 Andrew reg_id name log_id name 1 Xavier
2 Bob 1 Andrew 2 Andrew 2 Andrew
3 Charlie 2 Bob 4 Bob 3 Yolanda
4 David 4 Bob
SQL
● SELECT reg_id,[Link],log_id
FROM Registrations
INNER JOIN Logins
ON [Link] = [Link]
RESULTS
reg_id name log_id
1 Andrew 2
2 Bob 4
SQL
● SELECT reg_id,[Link],log_id
FROM Registrations
INNER JOIN Logins
ON [Link] = [Link]
RESULTS
reg_id name log_id
1 Andrew 2
2 Bob 4
SQL
● Remember that table order won’t matter in an INNER
JOIN
● Also if you see just JOIN without the INNER,
PostgreSQL will treat it as an INNER JOIN.
● Let’s see some examples in pgAdmin!
OUTER JOINS
SQL
● There are few different types of OUTER JOINs
● They will allow us to specify how to deal with values
only present in one of the tables being joined.
● These are the more complex JOINs, take your time
when trying to understand them!
SQL
● In these lectures we will explain:
○ FULL OUTER JOIN
■ Clarifying WHERE null
○ LEFT OUTER JOIN
■ Clarifying WHERE null
○ RIGHT OUTER JOIN
■ Clarifying WHERE null
FULL OUTER JOIN
SQL
● Let’s review our two example tables from the
previous lectures.
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● We know we would join these tables together on the
name column
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● Recall we match Andrew and Bob in both tables
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● But we have names that only appear in one table!
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● Let’s see how the different OUTER JOINs deal with
this discrepancy.
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
We will first take a look at the simplest, which is a
FULL OUTER JOIN
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
SQL
● SELECT * FROM TableB
FULL OUTER JOIN TableA
ON TableA.col_match = TableB.col_match
SQL
● SELECT * FROM Registrations
FULL OUTER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations FULL OUTER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations FULL OUTER JOIN Logins
ON [Link] = [Link]
RESULTS
reg_id name log_id name
REGISTRATIONS LOGINS
1 Andrew
reg_id name log_id name
2 Bob
1 Andrew 1 Xavier
3 Charlie
2 Bob 2 Andrew
3 Charlie 4 David
3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations FULL OUTER JOIN Logins
ON [Link] = [Link]
RESULTS
reg_id name log_id name
REGISTRATIONS LOGINS
1 Andrew 2 Andrew
reg_id name log_id name
2 Bob 4 Bob
1 Andrew 1 Xavier
3 Charlie
2 Bob 2 Andrew
4 David
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations FULL OUTER JOIN Logins
ON [Link] = [Link]
RESULTS
reg_id name log_id name
REGISTRATIONS LOGINS
1 Andrew 2 Andrew
reg_id name log_id name
2 Bob 4 Bob
1 Andrew 1 Xavier
3 Charlie null null
2 Bob 2 Andrew
4 David null null
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations FULL OUTER JOIN Logins
ON [Link] = [Link]
RESULTS
reg_id name log_id name
REGISTRATIONS LOGINS
1 Andrew 2 Andrew
reg_id name log_id name
2 Bob 4 Bob
1 Andrew 1 Xavier
3 Charlie null null
2 Bob 2 Andrew
4 David null null
3 Charlie 3 Yolanda
null null 1 Xavier
4 David 4 Bob
null null 3 Yolanda
FULL OUTER JOIN
with WHERE
Get rows unique to either table
(rows not found in both tables)
SQL
● SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
WHERE [Link] IS null OR
[Link] IS null
SQL
● SELECT * FROM TableB
FULL OUTER JOIN TableA
ON TableA.col_match = TableB.col_match
WHERE [Link] IS null OR
[Link] IS null
SQL
SELECT * FROM Registrations FULL OUTER JOIN
Logins
ON [Link] = [Link]
WHERE Registrations.reg_id IS null OR
Logins.log_id IS null
SQL
● SELECT * FROM Registrations FULL OUTER JOIN Logins
ON [Link] = [Link]
RESULTS
reg_id name log_id name
REGISTRATIONS LOGINS
1 Andrew 2 Andrew
reg_id name log_id name
2 Bob 4 Bob
1 Andrew 1 Xavier
3 Charlie null null
2 Bob 2 Andrew
4 David null null
3 Charlie 3 Yolanda
null null 1 Xavier
4 David 4 Bob
null null 3 Yolanda
SQL
● SELECT * FROM Registrations FULL OUTER JOIN Logins
ON [Link] = [Link]
WHERE Registrations.reg_id IS null OR
Logins.log_id IS null
REGISTRATIONS RESULTS LOGINS
reg_id name reg_id name log_id name log_id name
1 Andrew 3 Charlie null null 1 Xavier
2 Bob 4 David null null 2 Andrew
3 Charlie 3 Yolanda
null null 1 Xavier
4 David 4 Bob
null null 3 Yolanda
SQL
● Let’s see a quick example in pgAdmin of FULL
OUTER JOINs!
LEFT OUTER JOIN
SQL
● A LEFT OUTER JOIN results in the set of records
that are in the left table, if there is no match with the
right table, the results are null.
● Later on we will learn how to add WHERE statements
to further modify a LEFT OUTER JOIN
SQL
● SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
SQL
● SELECT * FROM TableA
LEFT JOIN TableB
ON TableA.col_match = TableB.col_match
SQL
● SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
SQL ORDER
MATTERS FOR
● SELECT * FROM TableA LEFT OUTER JOIN!
LEFT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
SQL ORDER
MATTERS FOR
● SELECT * FROM TableA LEFT OUTER JOIN!
LEFT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
SQL
Let’s explore a LEFT OUTER JOIN with our two
example tables.
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations
LEFT OUTER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
2 Bob 2 Andrew
3 Charlie 3 Yolanda
4 David 4 Bob
SQL
● SELECT * FROM Registrations
LEFT OUTER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
RESULTS
reg_id name log_id name
reg_id name log_id name
1 Andrew 1 Xavier
1 Andrew 2 Andrew
2 Bob 2 Andrew
2 Bob 4 Bob
3 Charlie 3 Yolanda
3 Charlie null null
4 David 4 Bob
4 David null null
SQL
● SELECT * FROM Registrations
LEFT OUTER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
RESULTS
reg_id name log_id name
reg_id name log_id name
1 Andrew 1 Xavier
1 Andrew 2 Andrew
2 Bob 2 Andrew
2 Bob 4 Bob
3 Charlie 3 Yolanda
3 Charlie null null
4 David 4 Bob
4 David null null
LEFT OUTER JOIN
With WHERE
Get rows unique to left table
SQL
● What if we only wanted entries unique to Table A?
Those rows found in Table A and not found in Table
B.
SQL
● SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
WHERE [Link] IS null
SQL
● SELECT * FROM Registrations
LEFT OUTER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS LOGINS
RESULTS
reg_id name log_id name
reg_id name log_id name
1 Andrew 1 Xavier
1 Andrew 2 Andrew
2 Bob 2 Andrew
2 Bob 4 Bob
3 Charlie 3 Yolanda
3 Charlie null null
4 David 4 Bob
4 David null null
SQL
SELECT * FROM Registrations
LEFT OUTER JOIN Logins
ON [Link] = [Link]
REGISTRATIONS
WHERE Logins.log_id IS null LOGINS
reg_id name log_id name
1 Andrew 1 Xavier
RESULTS
2 Bob 2 Andrew
reg_id name log_id name
3 Charlie 3 Yolanda
3 Charlie null null
4 David 4 Bob
4 David null null
SQL
● Let’s see some examples of LEFT OUTER JOINs in
pgAdmin!
RIGHT JOINS
SQL
● A RIGHT JOIN is essentially the same as a LEFT
JOIN, except the tables are switched.
● This would be the same as switching the table order in
a LEFT OUTER JOIN.
● Let’s quickly see some examples of a RIGHT JOIN.
SQL
● SELECT * FROM TableA
RIGHT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
Table A Table B
SQL
● SELECT * FROM TableA
RIGHT JOIN TableB
ON TableA.col_match = TableB.col_match
Table A Table B
SQL
● SELECT * FROM TableA
RIGHT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
WHERE [Link] IS null
Table A Table B
SQL
● It is up to you and how you have the tables organized
“in your mind” when it comes to choosing a LEFT vs
RIGHT join, since depending on the table order you
specify in the JOIN, you can perform duplicate JOINs
with either method.
JOIN
CHALLENGE TASKS
UNIONS
SQL
● The UNION operator is used to combine the result-set
of two or more SELECT statements.
● It basically serves to directly concatenate two results
together, essentially “pasting” them together.
SQL
● SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
SQL
Let’s explore a UNION with two example tables.
Sales2021_Q1 Sales2021_Q2
name amount name amount
David 100 David 200
Claire 50 Claire 100
SQL
● SELECT * FROM Sales2021_Q1
UNION
SELECT * FROM Sales2021_Q2;
name amount
David 100
Claire 50
David 200
Claire 100
SQL
● SELECT * FROM Sales2021_Q1
UNION
SELECT * FROM Sales2021_Q2
ORDER BY name;
name amount
David 100
David 200
Claire 50
Claire 100
JOIN
Challenges
SQL
● California sales tax laws have changed and we need to
alert our customers to this through email.
● What are the emails of the customers who live in
California?
SQL
● Expected Results
SQL
● Hints
○ You will need to use the address and customer
tables.
○ Look at the district column
SQL
SELECT district,email FROM address
INNER JOIN customer ON
address.address_id = customer.address_id
WHERE district = 'California'
SQL
● A customer walks in and is a huge fan of the actor
“Nick Wahlberg” and wants to know which movies he
is in.
● Get a list of all the movies “Nick Wahlberg” has been
in.
SQL
● Expected Results
……………...
SQL
● HINTS
○ You will need to do 2 JOINs in a row to do this in
a single query.
○ Try using the online documentation or a simple
google search to see how this is done.
○ Tables to use: actor, film, film_actor
SQL
SELECT title,first_name,last_name
FROM film_actor INNER JOIN actor
ON film_actor.actor_id = actor.actor_id
INNER JOIN film
ON film_actor.film_id = film.film_id
WHERE first_name = 'Nick'
AND last_name = 'Wahlberg'