Subquery
Subquery
============================
SELECT * FROM movies
WHERE score = (SELECT MAX(score) FROM movies)
TYPES OF SUBQUERIES
==========================
1. BASED ON RETURNED DATA
I. SCALAR SUBQUERY (RETURNS SINGLE VALUE)
II. RETURNS MULTIPLE ROWS BUT SINGLE COLUMNS
III. RETURNS MULTIPLE ROWS AND MULTIPLE COLUMNS
2. BASED ON WORKING
I. INDEPENDENT SUBQUERY (INNER QUERY IS INDEPENDENT OF OUTER QUERY)
II. CORRELATED SUBQUERY (INNER QUERY DEPENDS ON OUTER QUERY)
==========================================
I. SCALAR SUBQUERY (RETURNS SINGLE VALUE)
==========================================
HOW MANY MOVIES HAVE RATING > AVG. OF ALL MOVIE RATINGS
=======================================================
SELECT COUNT(*) FROM movies
WHERE score > (SELECT AVG(score) FROM movies)
HIGHEST RATED MOVIE AMONG ALL MOVIES WHOSE NUMBER OF VOTES ARE > THE DATASET AVG
VOTES
===================================================================================
======
SELECT * FROM movies
WHERE votes > (SELECT AVG(votes) FROM movies)
AND score = (SELECT MAX(score) FROM movies)
=============================================
II. RETURNS MULTIPLE ROWS BUT SINGLE COLUMNS
=============================================
FIND ALL MOVIES OF THOSE ACTORS WHOSE FILMOGRAPHY AVG. RATING > 8.5(TAKE 25K VOTES
AS CUTOFF)
===================================================================================
==========
SELECT * FROM movies
WHERE star IN (SELECT star FROM movies WHERE votes > 25000 GROUP BY star HAVING
AVG(score) > 8.5)
===============================================
III. RETURNS MULTIPLE ROWS AND MULTIPLE COLUMNS
===============================================
FIND HIGHEST RATED MOVIE OF EACH GENRE AND VOTES CUTOFF OF 25000
=================================================================
SELECT * FROM movies
WHERE (genre,score) IN (SELECT GENRE,MAX(score) FROM MOVIES WHERE votes > 25000
GROUP BY GENRE)
FIND HIGHEST GROSSING MOVIE OF TOP 5 ACTOR/DIRECTOR COMBO IN TERMS OF GROSS INCOME
===================================================================================
==
WITH top_duos AS (SELECT star,director,MAX(gross) FROM movies GROUP by
star,director ORDER BY MAX(gross) DESC LIMIT 5)
=========================
II. CORRELATED SUBQUERY
=========================
FIND ALL THE MOVIES THAT HAVE A RATING HIGHER THAN THE AVERAGE RATING OF MOVIES IN
SAME GENRE
===================================================================================
==========
SELECT * FROM movies m1
WHERE score > (SELECT AVG(score) FROM movies m2 WHERE m2.genre = m1.genre )
=====================================
III. SUBQUERIES WITH SELECT STATEMENT
=====================================
GET THE PERCENTAGE OF VOTES FOR EACH MOVIE COMPARED TO THE TOTAL NUMBER OF VOTES
===================================================================================
=
SELECT name,(votes/(SELECT SUM(votes) FROM movies))*100 FROM movies
DISPLAY ALL MOVIE NAMES, GENRE, SCORE AND AVG(score) OF genre
===========================================================
SELECT name, genre, score, (SELECT AVG(score) FROM movies t2 WHERE t2.genre =
t1.genre) FROM movies t1
=====================================
III. SUBQUERIES WITH FROM STATEMENT
=====================================