5.10. Joins#
A relationship is a connection between relations, i.e. tables. For example, we can add
a transactions
table to relate our customers
and products
table. The first
record of our transactions table tells us that Stephen has purchased 2 pineapples.
Sometimes it can be useful to combine data from multiple tables. To merge two tables
together, we use a JOIN
. We will also need to specify which column in the two
tables need to match and for that we use the ON`
keyword.
SELECT table.attribute_1, table.attribute_2, ...
FROM table_1
JOIN table_2
ON table_1.attribute = table_2.attribute;
Example
In this example we have a table called students
and a table called marks
.
We can merge these tables by matching the student_id
and the id
attributes.
SELECT *
FROM students
JOIN marks
ON students.student_id = marks.id;
If you run the code above you’ll find that the JOIN`
will return a new table
that looks like this:
We take all the columns from both tables, and we keep only the people that appear
in both tables. For this reason, this operation is also called an INNER JOIN
.
When performing the JOIN
we had to match ON`
the id
columns between the
two tables, but we also had to specify the table first so we know which table the
column, i.e. the attribute, came from.
In general, to identify a column we use the following format:
table.attribute
Since it can be exhausting to type out the table name again and again, we can give the tables an alias (think of this as a nickname) by specifying the alias after the table name.
table alias
SELECT *
FROM students s
JOIN marks m
ON s.student_id = m.id;
Here, we use the alias s
for the students
table and m
for the marks
table.
You will have noticed that some of the columns/attributes are repeated. This is because
we used SELECT *`
so we see all of the columns across both tables.
We can reduce the number of columns with our SELECT
statement, but don’t forget
we need to label our columns by table.attribute
!
SELECT students.student_id, students.firstname, students.lastname, marks.exam_mark
FROM students
JOIN marks
ON students.student_id = marks.id;
In this case, we take all the attributes from the students
table but only the
exam_mark
attribute from the marks
table.
To make this nicer, we can use aliases instead!
SELECT s.student_id, s.firstname, s.lastname, m.exam_mark
FROM students s
JOIN marks m
ON s.student_id = m.id;