Inner Join
Basic INNER JOIN
Query
INNER JOIN
QueryLet's create a query that you should be familiar with, which outputs the Title
and Rating
of all the movies.
Like so:
SELECT Title, Rating
FROM Movie, Review
WHERE Movie.mID = Review.mID;
In the above query, we make a join relation making sure that the movie ID is the same across the Movie
and Review
table.
Now let's rewrite it using an INNER JOIN
:
SELECT Title, RATING
FROM Movie INNER JOIN Review
ON Movie.mID = Review.mID;
This query does the INNER JOIN
, or the combination of Movie
and Review
, ON a specific condition. So it does the cross product of the two tables, then after doing the cross product, it checks the condition and only returns the elements that satisfy the condition.
We would then get a table in return with every movie in the database and its Rating
.
The INNER JOIN
operator is the default operator in SQL, and even if you were to take out the INNER
and just write: <table> JOIN <table>
, it would default to an INNER JOIN
.
Inner Join with Multiple Conditions
Let's create another query that gets the Title
and Rating
of all movies whose Rating
is greater than 3, and was produced after the year 1990.
Like so:
SELECT Title, Rating
FROM Movie, Review
WHERE Movie.mID = Review.mID
and Rating > 3 and Year > 1990;
Let's now rewrite this query to use the INNER JOIN
operator. Our query would look like this:
SELECT Title, Rating
FROM Movie JOIN Review
ON Movie.mID = Review.mID
and Rating > 3 and Year > 1990;
Our query selects all movies whose Rating
is greater than 3, and whose Year
is greater than 1990. It joins the Movie
and Review
tables, and the join relation is again combining the Movie
and Review
records where the mID
matches. It then checks the condition and returns the tuples that satisfy the condition.
We would then get the following movies in return: Gravity, The Lion King, Titanic, and Cast Away.
The ON
condition can also be ran using the WHERE
clause, but it's more efficient to use the ON
operator for reasons I will not get into here.
Running a Query with Three Relations
We will create a query that just gets all the general information on each individual movie, and also return all the user's names.
Our query will look like this:
SELECT Movie.mID, Title, Year, Director, Rating, User.uID Name
FROM Movie, User, Review
WHERE Movie.mID = Review.mID
and User.uID = Review.uID;
Now lets rewrite it using a join operator:
SELECT Movie.mID, Title, Year, Director, Rating, User.uID, Name
FROM Movie JOIN User JOIN Review
ON Movie.mID = Review.mID
and User.uID = Review.uID;
In this particular query, we would possibly get an error depending on the type of system that you are using. A few SQL sytems are: SQLite, MySQL, and Postrisk.
If working in the Postrisk system, we would get an error when running the above query because Postrisk does not support multiple join operators. It requires all join operations to be binary, meaning it can only join two relations. If running on the Postrisk system, you could rewrite the query to look like this:
SELECT Movie.mID, Title, Year, Director, Rating, User.uID, Name
FROM (Movie JOIN Review ON Movie.mID = Review.mID) JOIN User
ON User.uID = Review.uID;
Notice in the above query we joined the two relations Movie
and Review
and then wrapped them in parenthesis. This allows for it to satisfy the Postrisk's requirement for all join relations to be binary. We are saying "First join the Movie
and Review
table, then join that result with the User
table. Lastly, we moved the ON
condition inside the parenthesis for that particular join operator.
Last updated
Was this helpful?