--- 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 AUTEURS; ``` #### 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' ``` #### N.B. Een datum moet je in Access (als je met SQL werkt) tussen hekjes # typen, dus 1 juni 1991 tik je in als \#1-jun-1991# ```sql ``` #### 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; ```