mziesel.com/content/notities/sql/index.en.md
Mans Ziesel f9aea464c9
All checks were successful
/ deploy (push) Successful in 26s
fix errors
2023-06-13 19:47:38 +02:00

11 KiB

title date draft
SQL notes 2023-06-13 false

SQL opdrachten & antwoorden

Onderdeel Een

Welke leerlingen hebben de achternaam Dijkstra ? (geef de voornaam en de achternaam)

SELECT 
    VOORNAAM, ACHTERNAAM
FROM
    LEERLINGEN;
WHERE
    ACHTERNAAM = "Dijkstra";

Welke schrijvers zijn na 1900 geboren ? (geef de voornaam, achternaam en geboortejaar)

SELECT 
    VOORNAAM, ACHTERNAAM, GEB_JAAR
FROM
    AUTEURS
WHERE
    GEB_JAAR < 1900;

Welke boeken vallen niet in de rubriek Nederlands ?

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!)

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 ?

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)

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)

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)

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))

SELECT 
    VOORNAAM,ACHTERNAAM,STRAAT,HUISNUMMER,PLAATS
FROM
    LEERLINGEN
WHERE
    PLAATS = 'Bunnik'
        OR PLAATS = 'Schalkwijk'

Komt de schrijver William Somerset Maugham voor bij de auteurs ?

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 ?

SELECT 
    MAX(boete)
FROM
    UITLENINGEN

Wat is de gemiddelde boete die werd opgelegd, gerekend over alle uitleningen ?

SELECT 
    AVG(boete)
FROM
    UITLENINGEN

Wat is de geboortedatum van de oudste leerling? En wat van de jongste ?

SELECT 
    min(GEB_DATUM), max(GEB_DATUM)
FROM
    LEERLINGEN

Hoeveel boeken zijn er in reparatie ?

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)

SELECT 
    plaats, COUNT(PLAATS)
FROM
    LEERLINGEN
GROUP BY PLAATS

Maak een lijstje waarin het aantal jongens en het aantal meisjes staat

SELECT 
    GESLACHT, COUNT(GESLACHT)
FROM
    LEERLINGEN
GROUP BY GESLACHT

Maak een overzicht van de aantallen jongens en meisje per klas.

SELECT 
    KLAS, GESLACHT, COUNT(*) AS AANTAL
FROM
    LEERLINGEN
GROUP BY KLAS , GESLACHT;

Maak een lijstje waarin het aantal boeken per rubriek staat.

SELECT 
    RUBRIEK, COUNT(*) AS AANTAL
FROM
    BOEKEN
GROUP BY RUBRIEK;

Onderdeel vijf

Wie is de oudste leerling in de database (geef voornaam, achternaam, geboortedatum)

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.

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)

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)

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 ?

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)

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)

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)

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)

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)

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)

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)

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)

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.

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.

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.

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.

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.

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)

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)

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!)

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;