w3resource

SQL exercises on movie Database: Find all the movies with year, genres, and name of the director


8. From the following tables, write a SQL query to find all the movies with year, genres, and name of the director.

Sample table: movie

 mov_id |                     mov_title                      | mov_year | mov_time |    mov_lang     | mov_dt_rel | mov_rel_country
--------+----------------------------------------------------+----------+----------+-----------------+------------+-----------------
    901 | Vertigo                                            |     1958 |      128 | English         | 1958-08-24 | UK
    902 | The Innocents                                      |     1961 |      100 | English         | 1962-02-19 | SW
    903 | Lawrence of Arabia                                 |     1962 |      216 | English         | 1962-12-11 | UK
    904 | The Deer Hunter                                    |     1978 |      183 | English         | 1979-03-08 | UK
    905 | Amadeus                                            |     1984 |      160 | English         | 1985-01-07 | UK
    906 | Blade Runner                                       |     1982 |      117 | English         | 1982-09-09 | UK
    907 | Eyes Wide Shut                                     |     1999 |      159 | English         |            | UK
    908 | The Usual Suspects                                 |     1995 |      106 | English         | 1995-08-25 | UK
    909 | Chinatown                                          |     1974 |      130 | English         | 1974-08-09 | UK
.......
    925 | Braveheart                                         |     1995 |      178 | English         | 1995-09-08 | UK

View the table

Sample table: genres

 gen_id |      gen_title
--------+----------------------
   1001 | Action
   1002 | Adventure
   1003 | Animation
   1004 | Biography
   1005 | Comedy
   1006 | Crime
   1007 | Drama
   1008 | Horror
   1009 | Music
.....
   1013 | War

View the table

Sample table: movie_genres

 mov_id | gen_id
--------+--------
    922 |   1001
    917 |   1002
    903 |   1002
    912 |   1003
    911 |   1005
    908 |   1006
    913 |   1006
    926 |   1007
    928 |   1007
....
    904 |   1013

View the table

Sample table: director

 dir_id |      dir_fname       |      dir_lname
--------+----------------------+----------------------
    201 | Alfred               | Hitchcock
    202 | Jack                 | Clayton
    203 | David                | Lean
    204 | Michael              | Cimino
    205 | Milos                | Forman
    206 | Ridley               | Scott
    207 | Stanley              | Kubrick
    208 | Bryan                | Singer
    209 | Roman                | Polanski
.....
    223 | Peter                | Jackson

View the table

Sample table: movie_direction

 dir_id | mov_id
--------+--------
    201 |    901
    202 |    902
    203 |    903
    204 |    904
    205 |    905
    206 |    906
    207 |    907
    208 |    908
    209 |    909
.....
    221 |    923

View the table

Sample Solution:

-- Selecting specific columns from the tables movie, movie_genres, genres, movie_direction, and director
SELECT mov_title, mov_year, gen_title, dir_fname, dir_lname
-- Performing a natural join between the movie and movie_genres tables
FROM movie
NATURAL JOIN movie_genres
-- Performing a natural join between the result and the genres table
NATURAL JOIN genres
-- Performing a natural join between the result and the movie_direction table
NATURAL JOIN movie_direction
-- Performing a natural join between the final result and the director table
NATURAL JOIN director;

Sample Output:

                     mov_title                      | mov_year |      gen_title       |      dir_fname       |      dir_
----------------------------------------------------+----------+----------------------+----------------------+----------
 Vertigo                                            |     1958 | Mystery              | Alfred               | Hitchcock
 The Innocents                                      |     1961 | Horror               | Jack                 | Clayton
 Lawrence of Arabia                                 |     1962 | Adventure            | David                | Lean
 The Deer Hunter                                    |     1978 | War                  | Michael              | Cimino
-- More  --

Code Explanation :

The said query in SQL that joins the tables movie, movie_genres, genres, movie_direction, and director, and retrieves the title and year of the movies, the genre titles for each movie, and the first name and last name of the directors who directed each movie.
The NATURAL JOIN keyword, which joins the movie table with the movie_genres table to get the genre for each movie. Then joins the resulting table with the genres table to get the genre title for each genre ID. It then joins the resulting table with the movie_direction table to get the directors for each movie and finally, it joins the resulting table with the director table to get the first name and last name of the directors.

Alternative Solutions:

Using INNER JOIN:

SELECT a.act_fname, a.act_lname, c.mov_title, c.mov_year
SELECT m.mov_title, m.mov_year, g.gen_title, d.dir_fname, d.dir_lname
FROM movie m
JOIN movie_genres mg ON m.mov_id = mg.mov_id
JOIN genres g ON mg.gen_id = g.gen_id
JOIN movie_direction md ON m.mov_id = md.mov_id
JOIN director d ON md.dir_id = d.dir_id;

Explanation:

This query uses INNER JOINs to combine the movie, movie_genres, genres, movie_direction, and director tables based on their respective IDs. It retrieves the movie title (mov_title), year (mov_year), genre title (gen_title), director's first name (dir_fname), and last name (dir_lname) from the joined tables.

Using WHERE Clause with Table Aliases:

SELECT a.act_fname, a.act_lname, c.mov_title, c.mov_year
SELECT m.mov_title, m.mov_year, g.gen_title, d.dir_fname, d.dir_lname
FROM movie m, movie_genres mg, genres g, movie_direction md, director d
WHERE m.mov_id = mg.mov_id
  AND mg.gen_id = g.gen_id
  AND m.mov_id = md.mov_id
  AND md.dir_id = d.dir_id;

Explanation:

This query uses the older comma-separated syntax for joining tables and specifies the join conditions in the WHERE clause. It retrieves the movie title (mov_title), year (mov_year), genre title (gen_title), director's first name (dir_fname), and last name (dir_lname) from the joined tables.

Relational Algebra Expression:

Relational Algebra Expression: Find all the movies with year, genres, and name of the director.


Relational Algebra Tree:

Relational Algebra Tree: Find all the movies with year, genres, and name of the director.


Go to:


PREV : From the following table, write a SQL query to find the movies with year and genres. Return movie title, movie year and generic title.
NEXT : From the following tables, write a SQL query to find the movies released before 1st January 1989. Sort the result-set in descending order by date of release. Return movie title, release year, date of release, duration, and first and last name of the director.


Practice Online



Movie database model


Query Visualization:

Duration:

Query visualization of Find all the movies with year, genres, and name of the director - Duration.


Rows:

Query visualization of Find all the movies with year, genres, and name of the director - Rows.


Cost:

Query visualization of Find all the movies with year, genres, and name of the director - Cost.


Have another way to solve this solution? Contribute your code (and comments) through Disqus.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Follow us on Facebook and Twitter for latest update.