mziesel.com/content/notities/sql/index.nl.md
Mans Ziesel aa53794b91
Some checks failed
/ deploy (push) Failing after 1m29s
fix hero image on certain pages & fix title
2024-04-27 19:25:57 +02:00

520 lines
11 KiB
Markdown

---
title: "SQL notities"
date: 2023-06-13
draft: false
showHero: 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;
```