519 lines
11 KiB
Markdown
519 lines
11 KiB
Markdown
---
|
|
title: "SQL notes"
|
|
date: 2023-06-13
|
|
draft: false
|
|
---
|
|
|
|
# SQL opdrachten & antwoorden
|
|
|
|
## Onderdeel Een
|
|
|
|
Welke leerlingen hebben de achternaam Dijkstra ? (geef de voornaam en de achternaam)
|
|
|
|
```sql
|
|
SELECT
|
|
VOORNAAM, ACHTERNAAM
|
|
FROM
|
|
LEERLINGEN;
|
|
WHERE
|
|
ACHTERNAAM = "Dijkstra";
|
|
```
|
|
|
|
Welke schrijvers zijn na 1900 geboren ? (geef de voornaam, achternaam en geboortejaar)
|
|
|
|
```sql
|
|
SELECT
|
|
VOORNAAM, ACHTERNAAM, GEB_JAAR
|
|
FROM
|
|
AUTEURS
|
|
WHERE
|
|
GEB_JAAR < 1900;
|
|
```
|
|
|
|
Welke boeken vallen niet in de rubriek Nederlands ?
|
|
|
|
```sql
|
|
SELECT
|
|
TITEL, RUBRIEK
|
|
FROM
|
|
BOEKEN
|
|
WHERE
|
|
RUBRIEK != 'Nederlands';
|
|
```
|
|
|
|
Welke boeken zijn er van Gerard Reve in de bibliotheek (Er zijn twee SQL-query's nodig!)
|
|
|
|
```sql
|
|
SELECT
|
|
BOEKEN.*
|
|
FROM
|
|
BOEKEN
|
|
INNER JOIN
|
|
AUTEURS ON BOEKEN.AUTEURNR = AUTEURS.AUTEURNR
|
|
WHERE
|
|
AUTEURS.VOORNAAM = 'Gerard'
|
|
AND AUTEURS.ACHTERNAAM = 'Reve';
|
|
```
|
|
|
|
Welke leerlingen hebben een boete van meer dan twee euro gehad ?
|
|
|
|
```sql
|
|
SELECT DISTINCT
|
|
VOORNAAM, ACHTERNAAM
|
|
FROM
|
|
LEERLINGEN
|
|
INNER JOIN
|
|
UITLENINGEN ON LEERLINGEN.LLNR = UITLENINGEN.LLNR
|
|
WHERE
|
|
UITLENINGEN.BOETE > 2;
|
|
```
|
|
|
|
## Onderdeel Twee
|
|
|
|
Welke leerlingen hebben de lettercombinatie 'an' in hun naam ? (geef de voornaam en de achternaam)
|
|
|
|
```sql
|
|
SELECT
|
|
VOORNAAM, ACHTERNAAM
|
|
FROM
|
|
LEERLINGEN
|
|
WHERE
|
|
VOORNAAM LIKE '%an%'
|
|
OR TUSSENVOEGSEL LIKE '%an'
|
|
OR ACHTERNAAM LIKE '%an'
|
|
```
|
|
|
|
Welke leerlingen uit klas 6 (dus 6a of 6b) wonen in Utrecht aan de Julianaweg ? (geef de voornaam, achternaam, klas, adres en woonplaats)
|
|
|
|
```sql
|
|
SELECT
|
|
VOORNAAM, ACHTERNAAM, KLAS, STRAAT, HUISNUMMER, PLAATS
|
|
FROM
|
|
LEERLINGEN
|
|
WHERE
|
|
KLAS LIKE '6%';
|
|
```
|
|
|
|
Welke leerlingen uit de vierde klas zijn na 1 juni 1991 geboren ? (geef de voornaam, achternaam, klas, geboortedatum)
|
|
|
|
```sql
|
|
SELECT
|
|
VOORNAAM, ACHTERNAAM, KLAS, GEB_DATUM
|
|
FROM
|
|
LEERLINGEN
|
|
WHERE
|
|
KLAS LIKE '4%'
|
|
AND GEB_DATUM > '1991-06-01'
|
|
```
|
|
|
|
Welke leerlingen wonen in Bunnik of Schalkwijk ? (geef de voornaam, achternaam, adres en woonplaats))
|
|
|
|
```sql
|
|
SELECT
|
|
VOORNAAM,ACHTERNAAM,STRAAT,HUISNUMMER,PLAATS
|
|
FROM
|
|
LEERLINGEN
|
|
WHERE
|
|
PLAATS = 'Bunnik'
|
|
OR PLAATS = 'Schalkwijk'
|
|
```
|
|
|
|
Komt de schrijver William Somerset Maugham voor bij de auteurs ?
|
|
|
|
```sql
|
|
SELECT exists (
|
|
SELECT *
|
|
FROM
|
|
AUTEURS
|
|
WHERE
|
|
VOORNAAM = 'William Somerset'
|
|
AND ACHTERNAAM = 'Maugham' ) as resultaat;
|
|
```
|
|
|
|
## Onderdeel drie
|
|
|
|
Wat is de grootste boete, die iemand heeft moeten betalen ?
|
|
|
|
```sql
|
|
SELECT
|
|
MAX(boete)
|
|
FROM
|
|
UITLENINGEN
|
|
```
|
|
|
|
Wat is de gemiddelde boete die werd opgelegd, gerekend over alle uitleningen ?
|
|
|
|
```sql
|
|
SELECT
|
|
AVG(boete)
|
|
FROM
|
|
UITLENINGEN
|
|
```
|
|
|
|
Wat is de geboortedatum van de oudste leerling? En wat van de jongste ?
|
|
|
|
```sql
|
|
SELECT
|
|
min(GEB_DATUM), max(GEB_DATUM)
|
|
FROM
|
|
LEERLINGEN
|
|
```
|
|
|
|
Hoeveel boeken zijn er in reparatie ?
|
|
|
|
```sql
|
|
SELECT
|
|
COUNT(*)
|
|
FROM
|
|
EXEMPLAREN
|
|
WHERE
|
|
STATUS = 'in reparatie'
|
|
```
|
|
|
|
## Onderdeel vier
|
|
|
|
Maak een lijstje van aantallen leerlingen per woonplaats (dus een lijstje van alle plaatsen met daarachter het aantal leerlingen uit die plaats)
|
|
|
|
```sql
|
|
SELECT
|
|
plaats, COUNT(PLAATS)
|
|
FROM
|
|
LEERLINGEN
|
|
GROUP BY PLAATS
|
|
```
|
|
|
|
Maak een lijstje waarin het aantal jongens en het aantal meisjes staat
|
|
|
|
```sql
|
|
SELECT
|
|
GESLACHT, COUNT(GESLACHT)
|
|
FROM
|
|
LEERLINGEN
|
|
GROUP BY GESLACHT
|
|
```
|
|
|
|
Maak een overzicht van de aantallen jongens en meisje per klas.
|
|
|
|
```sql
|
|
SELECT
|
|
KLAS, GESLACHT, COUNT(*) AS AANTAL
|
|
FROM
|
|
LEERLINGEN
|
|
GROUP BY KLAS , GESLACHT;
|
|
```
|
|
|
|
Maak een lijstje waarin het aantal boeken per rubriek staat.
|
|
|
|
```sql
|
|
SELECT
|
|
RUBRIEK, COUNT(*) AS AANTAL
|
|
FROM
|
|
BOEKEN
|
|
GROUP BY RUBRIEK;
|
|
```
|
|
|
|
## Onderdeel vijf
|
|
|
|
Wie is de oudste leerling in de database (geef voornaam, achternaam, geboortedatum)
|
|
|
|
```sql
|
|
SELECT
|
|
VOORNAAM, ACHTERNAAM, GEB_DATUM
|
|
FROM
|
|
LEERLINGEN
|
|
WHERE
|
|
GEB_DATUM = (SELECT
|
|
MAX(GEB_DATUM)
|
|
FROM
|
|
LEERLINGEN);
|
|
```
|
|
|
|
Kun je IN DE QUERY VAN vraag a het beste WHERE GEB_DATUM = gebruiken of WHERE GEB_DATUM IN ? Leg uit waarom.
|
|
|
|
```sql
|
|
Je kan het beste WHERE GEB_DATUM = gebruiken omdat IN gebruikt wordt om meerder waardes te kunnen gebruiken, de oudste student is maar een leeftijd.
|
|
```
|
|
|
|
Welke boeken in de rubriek Nederlands zijn in reparatie ? (geef de titel en de rubriek)
|
|
|
|
```sql
|
|
SELECT
|
|
*
|
|
FROM
|
|
EXEMPLAREN
|
|
INNER JOIN
|
|
BOEKEN ON EXEMPLAREN.BOEKNR = BOEKEN.BOEKNR
|
|
WHERE
|
|
STATUS = 'in reparatie'
|
|
AND RUBRIEK = 'Nederlands'
|
|
```
|
|
|
|
Van welke auteurs werden er boeken gereserveerd ? (geef de voornaam en achternaam)
|
|
|
|
```sql
|
|
SELECT DISTINCT
|
|
A.VOORNAAM, A.ACHTERNAAM
|
|
FROM
|
|
AUTEURS A
|
|
JOIN
|
|
BOEKEN B ON A.AUTEURNR = B.AUTEURNR
|
|
JOIN
|
|
RESERVERINGEN R ON B.BOEKNR = R.BOEKNR
|
|
```
|
|
|
|
Er is een exemplaar van "Hoe vreselijk is dit alles" van Marten Toonder beschadigd. Welke leerling kan dat op zijn geweten hebben ?
|
|
|
|
```sql
|
|
Boek bestaat niet
|
|
```
|
|
|
|
## Onderdeel zes
|
|
|
|
Maak een lijst van auteurs en de titels van hun boeken, die in de bibliotheek zijn (voornaam en achternaam van de auteur, titel van het boek)
|
|
|
|
```sql
|
|
SELECT
|
|
AUTEURS.VOORNAAM, AUTEURS.ACHTERNAAM, BOEKEN.TITEL
|
|
FROM
|
|
AUTEURS
|
|
JOIN
|
|
BOEKEN ON AUTEURS.AUTEURNR = BOEKEN.AUTEURNR;
|
|
```
|
|
|
|
Maak een lijst van leerlingen en de boetes die ze hebben betaald (alleen degenen die echt een boete hebben gehad, dus als er in de kolom boete 0,00 staat moet die niet worden afgedrukt)
|
|
|
|
```sql
|
|
SELECT
|
|
LEERLINGEN.VOORNAAM,
|
|
LEERLINGEN.ACHTERNAAM,
|
|
UITLENINGEN.BOETE
|
|
FROM
|
|
LEERLINGEN
|
|
JOIN
|
|
UITLENINGEN ON LEERLINGEN.LLNR = UITLENINGEN.LLNR
|
|
WHERE
|
|
UITLENINGEN.BOETE;
|
|
```
|
|
|
|
Welke boeken zijn er van schrijvers uit de negentiende eeuw (geef de titel, de voornaam en achternaam en geboortedatum van de auteur)
|
|
|
|
```sql
|
|
SELECT
|
|
BOEKEN.TITEL,
|
|
AUTEURS.VOORNAAM,
|
|
AUTEURS.ACHTERNAAM,
|
|
AUTEURS.GEB_JAAR
|
|
FROM
|
|
AUTEURS
|
|
JOIN
|
|
BOEKEN ON AUTEURS.AUTEURNR = BOEKEN.AUTEURNR
|
|
WHERE
|
|
AUTEURS.GEB_JAAR >= 1801
|
|
AND AUTEURS.GEB_JAAR <= 1900;
|
|
```
|
|
|
|
Van welke auteurs zijn er boeken in reparatie ? (geef de titel en de status van het boek, de voornaam en achternaam van de auteur)
|
|
|
|
```sql
|
|
SELECT
|
|
BOEKEN.TITEL,
|
|
EXEMPLAREN.STATUS,
|
|
AUTEURS.VOORNAAM,
|
|
AUTEURS.ACHTERNAAM
|
|
FROM
|
|
AUTEURS
|
|
JOIN
|
|
BOEKEN ON AUTEURS.AUTEURNR = BOEKEN.AUTEURNR
|
|
JOIN
|
|
EXEMPLAREN ON BOEKEN.BOEKNR = EXEMPLAREN.BOEKNR
|
|
WHERE
|
|
EXEMPLAREN.STATUS = 'in reparatie';
|
|
```
|
|
|
|
Maak een lijstje van de boeken uit de categorie Nederlands, die zijn uitgeleend aan leerlingen uit de zesde klas (geef de titel van het boek en de categorie, en de voornaam en achternaam en klas van de leerling)
|
|
|
|
```sql
|
|
SELECT
|
|
BOEKEN.TITEL,
|
|
BOEKEN.RUBRIEK,
|
|
LEERLINGEN.VOORNAAM,
|
|
LEERLINGEN.ACHTERNAAM,
|
|
LEERLINGEN.KLAS
|
|
FROM
|
|
BOEKEN
|
|
JOIN
|
|
UITLENINGEN ON BOEKEN.BOEKNR = UITLENINGEN.BOEKNR
|
|
JOIN
|
|
LEERLINGEN ON UITLENINGEN.LLNR = LEERLINGEN.LLNR
|
|
WHERE
|
|
BOEKEN.RUBRIEK = 'Nederlands'
|
|
AND LEERLINGEN.KLAS LIKE '6%';
|
|
```
|
|
|
|
## Onderdeel zeven
|
|
|
|
Maak een lijstje van de plaatsen waar minstens tien leerlingen wonen (geef de plaatsnaam en het aantal leerlingen uit die plaats)
|
|
|
|
```sql
|
|
SELECT
|
|
PLAATS, COUNT(*) AS AANTAL_LEERLINGEN
|
|
FROM
|
|
LEERLINGEN
|
|
GROUP BY PLAATS
|
|
HAVING COUNT(*) >= 10;
|
|
```
|
|
|
|
Maak een lijstje van de auteurs, waarvan meer dan vijf boektitels aanwezig zijn (geef de voornaam, achternaam, en aantal boektitels)
|
|
|
|
```sql
|
|
SELECT
|
|
AUTEURS.VOORNAAM,
|
|
AUTEURS.ACHTERNAAM,
|
|
COUNT(BOEKEN.BOEKNR) AS AANTAL_BOEKTITELS
|
|
FROM
|
|
AUTEURS
|
|
JOIN
|
|
BOEKEN ON AUTEURS.AUTEURNR = BOEKEN.AUTEURNR
|
|
GROUP BY AUTEURS.AUTEURNR , AUTEURS.VOORNAAM , AUTEURS.ACHTERNAAM
|
|
HAVING COUNT(BOEKEN.BOEKNR) > 5;
|
|
```
|
|
|
|
Maak een lijstje van de boeken, die meer dan tien keer zijn uitgeleend (geef de titel en het aantal keren uitgeleend)
|
|
|
|
```sql
|
|
SELECT
|
|
BOEKEN.TITEL,
|
|
COUNT(UITLENINGEN.BOEKNR) AS AANTAL_UITLENINGEN
|
|
FROM
|
|
BOEKEN
|
|
JOIN
|
|
UITLENINGEN ON BOEKEN.BOEKNR = UITLENINGEN.BOEKNR
|
|
GROUP BY BOEKEN.BOEKNR , BOEKEN.TITEL
|
|
HAVING COUNT(UITLENINGEN.BOEKNR) > 10;
|
|
```
|
|
|
|
## Onderdeel acht
|
|
|
|
Maak een lijstje met alle openstaande uitleningen (geef titel boek, naam auteur, naam en klas van leerling). Ga er daarbij vanuit dat het vandaag 3 maart 2006 is.
|
|
|
|
```sql
|
|
SELECT
|
|
BOEKEN.TITEL,
|
|
AUTEURS.ACHTERNAAM,
|
|
AUTEURS.VOORNAAM,
|
|
LEERLINGEN.ACHTERNAAM,
|
|
LEERLINGEN.VOORNAAM,
|
|
LEERLINGEN.KLAS
|
|
FROM
|
|
UITLENINGEN
|
|
JOIN
|
|
BOEKEN ON UITLENINGEN.BOEKNR = BOEKEN.BOEKNR
|
|
JOIN
|
|
AUTEURS ON BOEKEN.AUTEURNR = AUTEURS.AUTEURNR
|
|
JOIN
|
|
LEERLINGEN ON UITLENINGEN.LLNR = LEERLINGEN.LLNR
|
|
WHERE
|
|
UITLENINGEN.DATUM_TERUG IS NULL
|
|
```
|
|
|
|
Er komt iemand in de bibliotheek die het boek Giph! van Ronald Giphart wil lenen. Ga met een query na of er een uitleenbaar exemplaar is dat aan hem uitgeleend kan worden.
|
|
|
|
```sql
|
|
SELECT
|
|
*
|
|
FROM
|
|
BOEKEN
|
|
JOIN
|
|
EXEMPLAREN ON BOEKEN.BOEKNR = EXEMPLAREN.BOEKNR
|
|
WHERE
|
|
BOEKEN.TITEL = 'Giph!'
|
|
AND BOEKEN.AUTEURNR = (SELECT
|
|
AUTEURNR
|
|
FROM
|
|
AUTEURS
|
|
WHERE
|
|
ACHTERNAAM = 'Giphart'
|
|
AND VOORNAAM = 'Ronald')
|
|
AND EXEMPLAREN.UITLEENBAAR = 'J';
|
|
```
|
|
|
|
Maak een lijst van alle uitgeleende boeken waarvan de uitleentermijn verstreken is. Ga er daarbij vanuit dat het vandaag 3 maart 2006 is, en dat de uitleentermijn drie weken is.
|
|
|
|
```sql
|
|
```
|
|
|
|
Een leerling brengt het boek Figuranten van Arnon Grunberg, met boeknummer 66, terug op 3 maart 2006. Schrijf een query die nagaat of er een reservering voor dat boek is en welke leerling in dat geval die reservering gedaan heeft.
|
|
|
|
```sql
|
|
SELECT
|
|
LEERLINGEN.VOORNAAM, LEERLINGEN.ACHTERNAAM
|
|
FROM
|
|
RESERVERINGEN
|
|
JOIN
|
|
LEERLINGEN ON RESERVERINGEN.LLNR = LEERLINGEN.LLNR
|
|
WHERE
|
|
RESERVERINGEN.BOEKNR = 66
|
|
and RESERVERINGEN.STATUS = "open"
|
|
```
|
|
|
|
Maak een lijstje van boeken, met titel en auteur, waarin per boek is aangegeven hoe vaak het is uitgeleend.
|
|
|
|
```sql
|
|
SELECT
|
|
BOEKEN.TITEL,
|
|
AUTEURS.VOORNAAM,
|
|
AUTEURS.ACHTERNAAM,
|
|
COUNT(UITLENINGEN.BOEKNR) AS AANTAL_UITLENINGEN
|
|
FROM
|
|
BOEKEN
|
|
JOIN
|
|
AUTEURS ON BOEKEN.AUTEURNR = AUTEURS.AUTEURNR
|
|
LEFT JOIN
|
|
UITLENINGEN ON BOEKEN.BOEKNR = UITLENINGEN.BOEKNR
|
|
GROUP BY BOEKEN.BOEKNR , BOEKEN.TITEL , AUTEURS.VOORNAAM , AUTEURS.ACHTERNAAM;
|
|
```
|
|
|
|
Maak een lijstje van de boeken, die nog nooit zijn uitgeleend (geef alleen de titels)
|
|
|
|
```sql
|
|
SELECT
|
|
BOEKEN.TITEL
|
|
FROM
|
|
BOEKEN
|
|
LEFT JOIN
|
|
UITLENINGEN ON BOEKEN.BOEKNR = UITLENINGEN.BOEKNR
|
|
WHERE
|
|
UITLENINGEN.BOEKNR IS NULL;
|
|
```
|
|
|
|
Welke leerlingen hebben nog nooit een nederlands boek geleend (geef voornaam en achternaam)
|
|
|
|
```sql
|
|
SELECT DISTINCT
|
|
LEERLINGEN.VOORNAAM, LEERLINGEN.ACHTERNAAM
|
|
FROM
|
|
LEERLINGEN
|
|
LEFT JOIN
|
|
UITLENINGEN ON LEERLINGEN.LLNR = UITLENINGEN.LLNR
|
|
LEFT JOIN
|
|
BOEKEN ON UITLENINGEN.BOEKNR = BOEKEN.BOEKNR
|
|
WHERE
|
|
BOEKEN.RUBRIEK != 'Nederlands'
|
|
```
|
|
|
|
Welke leerlingen hebben in totaal meer dan € 5,- aan boete betaald (geef voornaam en achternaam en de totale hoeveelheid boete, denk er om dat de leerlingen vaker dan één keer boete kunnen krijgen!)
|
|
|
|
```sql
|
|
SELECT
|
|
LEERLINGEN.VOORNAAM,
|
|
LEERLINGEN.ACHTERNAAM,
|
|
SUM(UITLENINGEN.BOETE) AS TOTAAL_BOETE
|
|
FROM
|
|
LEERLINGEN
|
|
JOIN
|
|
UITLENINGEN ON LEERLINGEN.LLNR = UITLENINGEN.LLNR
|
|
GROUP BY LEERLINGEN.LLNR , LEERLINGEN.VOORNAAM , LEERLINGEN.ACHTERNAAM
|
|
HAVING SUM(UITLENINGEN.BOETE) > 5.00;
|
|
```
|
|
|