
Subqueries introductie - Opdrachten
1. Films met een score hoger dan gemiddeld
In onze database hebben we gegevens van films, tabel movies:

Ieder film heeft een score, in kolom rank.
We zijn in deze opdracht benieuwd naar de films met een hogere score dan gemiddeld.
- Hier gaan we stap voor stap mee aan de slag.
- Daarbij gaan we een subquery gebruiken.
1.1. Query om details van films op te halen
Maak onderstaande query af om details van films op te halen.
- Haal data op uit tabel
movies. - Selecteer kolommen
id,name, enrank.
Je moet de volgende output zien:
| id | name | rank |
|---|---|---|
| 10920 | Aliens | 8.2 |
| 17173 | Animal House | 7.5 |
| 18979 | Apollo 13 | 7.5 |
| 30959 | Batman Begins | (NULL) |
| 46169 | Braveheart | 8.3 |
| ... | ... | ... |
1.2. Query om gemiddelde score te berekenen
Maak onderstaande query af om de gemiddelde score van films te berekenen.
- Haal data op uit tabel
movies. - Selecteer en bereken met functie
AVG()het gemiddelde van de scores, kolomrank.
Je moet één getal terugkrijgen.
1.3. Query om films te filteren afhankelijk van de score
Maak onderstaande query af waarbij je een filter toepast. Zodang dat alleen films met een score groter dan een bepaalde waarde getoond worden.
- Hergebruik je code uit vraag 1.1.
- Voeg een
WHEREstatement toe.- Filter hiermee op kolom
rank, de score.- Selecteer waarden
groter daneen score van7.7.
- Selecteer waarden
- Filter hiermee op kolom
Controleer het resultaat.
| id | name | rank |
|---|---|---|
| 10920 | Aliens | 8.2 |
| 46169 | Braveheart | 8.3 |
| 109093 | Fargo | 8.2 |
| 112290 | Fight Club | 8.5 |
| 124110 | Garden State | 8.3 |
| ... | ... | ... |
1.4. Toevoegen van een subquery
In de vorige vraag hebben we de gemiddelde score in het filter hardcoded toegevoegd.
In de vraag daarvoor hebben we een query geschreven die de gemiddelde score berekent.
Hergebruik je eerdere code en pas een subquery toe. Zodanig dat je de gemiddelde score berekent in plaats van hardcoded toevoegt.
- Hergebruik je vode uit de vorige vraag.
- Vergang getal
7.7in hetWHEREstatment door een subquery.- De subquery moet je eerdere query zijn.
- Waarmee je de gemiddelde score berekent.
- De subquery moet je eerdere query zijn.
Controleer het resultaat.
| id | name | rank |
|---|---|---|
| 10920 | Aliens | 8.2 |
| 46169 | Braveheart | 8.3 |
| 109093 | Fargo | 8.2 |
| 112290 | Fight Club | 8.5 |
| 124110 | Garden State | 8.3 |
| ... | ... | ... |
2. (Extra) Films met een score hoger dan gemiddeld
In de vorige opdracht heb je informatie van films opgehaald gebaseerd op de score.
Nu moet je iets vergelijkbaars gaan doen.
Schrijf een query waarmee je de films selecteert waarvan de naam langer is dan de gemiddelde lengte.
- Maak gebruik van een subquery.
- Toon de volgende kolommen in je uitkomst:
idname- Lengte van
name
- Sorteer op de kolom met de lengte van
name. - Maak onder andere gebruik van:
SELECT,FROM,WHERE,AVG(),LENGTH(),ORDER BY.
SELECT
id,
name,
LENGTH(name) AS name_length
FROM
movies
WHERE
LENGTH(name) > (
SELECT
AVG(LENGTH(name))
FROM
movies
)
ORDER BY
LENGTH(name);
| id | name | name_length |
|---|---|---|
| 30959 | Batman Begins | 13 |
| 130128 | Godfather, The | 14 |
| 314965 | Stir of Echoes | 14 |
| 276217 | Reservoir Dogs | 14 |
| 111813 | Few Good Men, A | 15 |
| 238072 | Oceanâ€s Eleven | 16 |
| 176712 | Kill Bill: Vol. 2 | 17 |
| 176711 | Kill Bill: Vol. 1 | 17 |
| 194874 | Lost in Translation | 19 |
| 192017 | Little Mermaid, The | 19 |
| 256630 | Pirates of the Caribbean | 24 |
| 297838 | Shawshank Redemption, The | 25 |
| 237431 | O Brother, Where Art Thou? | 26 |
| 257264 | Planes, Trains & Automobiles | 28 |
3. (Extra) Acteurs op basis van rollen
Je gaat een complexe query schrijven.
We maken hierbij gebruik van 2 tabellen:
actors: details van acteurs.roles: details van filmrollen.
Je gaat het volgende doen:
- Maak een query waarmee je de meest voorkomende eerste 2 letters van een naam van een filmrol bepaalt.
- Voorbeeld: rolnaam
Tyroneeerste 2 letters:Ty. - Gebruik daarbij:
SELECT,LEFT(),COUNT(),FROMGROUP BY,ORDER BY ... DESC,LIMIT 1.
- Voorbeeld: rolnaam
- Maak een query waarmee je de vorige query als subquery gebruikt.
- Selecteer hiermee alleen de bepaalde 2 letters.
- Voorbeeld:
Ty.
- Voorbeeld:
- Gebruik daarbij:
SELECT,FROMen een subquery.
- Selecteer hiermee alleen de bepaalde 2 letters.
- Maak een query waarmee je de vorige queries als subquery gebruikt.
- Zodanig dat je details van acteurs selecteert. Daar waarvan de eerste 2 letters van hun voornaam gelijk zijn aan de bepaalde 2 letters.
- Gebruik daarbij:
SELECT,FROM,WHERE,LEFT, en een subquery.
Tip: Schrijf je queries stap voor stap. Zodat je de resultaten tussentijds kunt controleren.
SELECT
id,
first_name,
last_name
FROM
actors
WHERE
LEFT(first_name, 2) = (
SELECT
most_used_character.left
FROM
(
SELECT
LEFT(role, 2),
COUNT(role)
FROM
roles
GROUP BY
LEFT(role, 2)
ORDER BY
COUNT(role) DESC
LIMIT
1
) as most_used_character
);
| id | first_name | last_name |
|---|---|---|
| 241542 | Hiroshi (I) | Kawashima |
| 319868 | Hikaru | Midorikawa |
| 672860 | Hiroko | Kawasaki |