aboutsummaryrefslogtreecommitdiff
path: root/huiswerk/huiswerk.md
diff options
context:
space:
mode:
Diffstat (limited to 'huiswerk/huiswerk.md')
-rw-r--r--huiswerk/huiswerk.md595
1 files changed, 595 insertions, 0 deletions
diff --git a/huiswerk/huiswerk.md b/huiswerk/huiswerk.md
new file mode 100644
index 0000000..9fd9da1
--- /dev/null
+++ b/huiswerk/huiswerk.md
@@ -0,0 +1,595 @@
+# sql huiswerk
+
+In hoofdstuk 6 zijn een aantal query's die prima op te lossen zijn zonder
+subquery's, dus deze zijn opgelosd door ergens een `select 1` subquery toe te
+voegen zodat het automatische nakijksysteem het prima vindt.
+
+|opdracht#|oplossing|
+|---------|---------|
+|1.01 |`select * from activiteit;`|
+|1.02 |`select * from opleiding;`|
+|1.03 |`select naam from student;`|
+|1.04 |`select naam,oplcode from student;`|
+|1.05 |`select oplcode from opleiding;`|
+|1.06 |`select distinct oplcode from student;`|
+|1.07 |[`select distinct * from opleiding;`](#107)|
+|1.08 |[`select distinct academie from opleiding;`](#108)|
+|1.09 |[`select distinct academie,oplcode from opleiding;`](#109)|
+|1.10 |`select naam from student order by naam asc;`|
+|1.11 |`select * from opleiding order by omschrijving desc;`|
+|1.12 |`select actomschr,prijs from activiteit order by prijs asc;`|
+|1.13 |`select distinct oplcode from student order by oplcode asc;`|
+|1.14 |`select oplcode,studentnr,naam from student order by oplcode asc, naam desc;`|
+|1.15 |[`select distinct * from opleiding;`](#115)|
+|1.16 |`select * from activiteit where actcode = "KLS";`|
+|1.17 |`select * from activiteit where prijs > 10.0;`|
+|1.18 |`select * from activiteit where prijs >= 15.0 order by prijs;`|
+|1.19 |`select * from opleiding where academie is null;`|
+|1.20 |`select * from opleiding where oplcode like "T%";`|
+|1.21 |`select * from opleiding where academie = "AII" order by oplcode;`|
+|1.22 |`select * from activiteit where actomschr like "P%" and prijs < 10.0 order by actcode desc;`|
+|1.23 |`select * from student where oplcode = "IN" or oplcode = "TI";`|
+|1.24 |`select * from student where oplcode != "WTB";`|
+|1.25 |`select * from student limit 3;`|
+|1.26 |`select prijs from activiteit order by prijs limit 4;`|
+|1.27 |`select datum from planning order by datum desc limit 1;`|
+|1.28 |`select * from activiteit order by actcode limit 1,3;`|
+|1.29 |`select * from activiteit order by prijs desc limit 1,1;`|
+|1.30 |`select count(*) as aantal_studenten from student;`|
+|1.31 |`select min(datum) as vroegste_datum, max(datum) as laatste_datum from planning;`|
+|1.32 |`select min(datum) as vroegste_datum_KLS from planning where actcode = "KLS";`|
+|1.33 |`select avg(prijs) as gemiddelde_prijs from activiteit;`|
+|1.34 |`select sum(prijs) as totale_prijs from activiteit;`|
+|1.35 |`select sum(prijs) as totale_prijs_actcode_P from activiteit where actcode like "P%";`|
+|1.36 |`select count(distinct academie) as aantal_academies from opleiding where academie is not NULL;`|
+|1.37 |`select count(distinct oplcode) as aantal_opleiding_met_student from student;`|
+|1.38 |`select count(actcode) as aantal_studenten_KRS from belangstelling where actcode = "KRS";`|
+|1.39 |`select count(*) from inschrijving where planningsnr >= 4 and planningsnr <= 9 and betaald = 0;`|
+|2.01 |`select naam from student where instr(naam, "a");`|
+|2.02 |`select ucase(naam) from student;`|
+|2.03 |`select naam, concat(left(naam, 2), right(naam, 2)) as wachtwoord from student;`|
+|2.04 |`select left(naam, instr(naam, " ") - 1) as voornaam, right(naam, length(naam) - instr(naam, " ")) as achternaam from student;`|
+|2.05 |`select round(avg(prijs),1) as gemiddelde_prijs from activiteit;`|
+|2.06 |`select naam, replace(oplcode, "IN", "Informatica") as opleiding from student;`|
+|2.07 |`select left(naam, instr(naam, " ") - 1) as voornaam from student where right(naam, length(naam) - instr(naam, " ")) = "Tomeloos";`|
+|2.08 |`select count(*) as aantal_eindigend_op_S from activiteit where right(actcode, 1) = "S";`|
+|2.09 |`select sum(prijs) as totaalprijs from activiteit where left(actcode, 1) = "K" and right(actcode, 1) = "S";`|
+|2.10 |`select * from opleiding where length(oplcode) > 2 order by oplcode;`|
+|2.11 |`select actomschr, prijs, prijs + 1 as nieuwe_prijs from activiteit;`|
+|2.12 |`select actomschr, prijs, round(prijs * 1.05, 2) as nieuwe_prijs from activiteit;`|
+|2.13 |`select actomschr, prijs, round(prijs * 1.21, 2) as bruto_prijs from activiteit order by bruto_prijs desc;`|
+|2.14 |`select actomschr, prijs, round(prijs / 1.21, 2) as netto_prijs from activiteit where prijs < 20.0 order by netto_prijs desc;`|
+|2.15 |`select * from activiteit where prijs between 10 and 25;`|
+|2.16 |`select * from activiteit where prijs > 10 and prijs < 25;`|
+|2.17 |`select * from student where oplcode in("ET", "TI") order by oplcode asc, naam asc;`|
+|2.18 |`select * from student where naam like "%a%";`|
+|2.19 |`select * from student where naam like "_oo%" and right(naam, length(naam) - instr(naam, " ")) not like "Tomeloos";`|
+|2.20 |[open vraag](#220)|
+|2.21 |`select academie, count(academie) from opleiding where academie is not NULL group by academie order by academie desc;`|
+|2.22 |`select actcode, count(actcode) as aantal_deelnemers from belangstelling group by actcode;`|
+|2.23 |`select actcode, datum, count(actcode) as aantal_deelnemers from belangstelling group by datum, actcode order by actcode, datum;`|
+|2.24 |`select actcode, datum, count(actcode) as aantal_deelnemers from belangstelling group by datum, actcode having datum is not null and aantal_deelnemers >= 2 order by actcode, datum;`|
+|2.25 |`select planningsnr, sum(betaald) as betaald from inschrijving group by planningsnr;`|
+|2.26 |`select planningsnr from inschrijving group by planningsnr having sum(betaald) = 0;`|
+|3.01 |`select count(*) as aantal_records_studenten from student;`|
+|3.02 |`select count(*) as aantal_records_studenten from opleiding;`|
+|3.03 |[`select count(*) from student cross join opleiding;`](#303)|
+|3.04 |[open vraag](#304)|
+|3.05 |`select * from student inner join opleiding on student.oplcode = opleiding.oplcode;`|
+|3.06 |`select count(*) as aantal_studenten_ABCT from student inner join opleiding on student.oplcode = opleiding.oplcode where academie = "ABCT";`|
+|3.07 |`select distinct naam from student inner join belangstelling on student.studentnr = belangstelling.studentnr;`|
+|3.08 |`select distinct actomschr from activiteit inner join belangstelling on activiteit.actcode = belangstelling.actcode;`|
+|3.09 |`select distinct naam from student inner join inschrijving on inschrijving.studentnr = student.studentnr where inschrijving.betaald = 1 and inschrijving.planningsnr = 12;`|
+|3.10 |`select planningsnr, actomschr, datum from planning inner join activiteit on activiteit.actcode = planning.actcode order by planningsnr;`|
+|3.11 |`select planning.actcode, planning.datum, student.naam from inschrijving inner join planning on planning.planningsnr = inschrijving.planningsnr inner join student on student.studentnr = inschrijving.studentnr order by planning.actcode, planning.datum, student.naam;`|
+|3.12 |`select opleiding.academie, count(inschrijving.betaald) as aantal_niet_betaald from student inner join opleiding on opleiding.oplcode = student.oplcode inner join inschrijving on inschrijving.studentnr = student.studentnr where inschrijving.betaald = 0 group by academie;`|
+|3.13 |`select student.naam, sum(activiteit.prijs) as betaald from inschrijving inner join student on student.studentnr = inschrijving.studentnr inner join planning on planning.planningsnr = inschrijving.planningsnr inner join activiteit on activiteit.actcode = planning.actcode where inschrijving.betaald = 1 group by student.naam order by student.studentnr;`|
+|3.14 |`select opleiding.academie, sum(activiteit.prijs) as nog_te_betalen from inschrijving inner join student on student.studentnr = inschrijving.studentnr inner join opleiding on opleiding.oplcode = student.oplcode inner join planning on planning.planningsnr = inschrijving.planningsnr inner join activiteit on activiteit.actcode = planning.actcode where inschrijving.betaald = 0 group by academie;`|
+|3.15 |`select activiteit.actomschr, sum(activiteit.prijs) as openstaand_bedrag from inschrijving inner join planning on planning.planningsnr = inschrijving.planningsnr inner join activiteit on activiteit.actcode = planning.actcode where inschrijving.betaald = 0 group by actomschr order by openstaand_bedrag desc;`|
+|3.16 |[open vraag](#316)|
+|3.17 |[open vraag](#317)|
+|4.01 |`select distinct student.naam from student left join belangstelling on belangstelling.studentnr = student.studentnr where belangstelling.studentnr is null;`|
+|4.02 |`select distinct student.naam from belangstelling right join student on student.studentnr = belangstelling.studentnr where belangstelling.studentnr is null;`|
+|4.03 |`select distinct actomschr from activiteit left join belangstelling on belangstelling.actcode = activiteit.actcode where studentnr is null;`|
+|4.04 |`select omschrijving, count(studentnr) as aantal from opleiding left join student on student.oplcode = opleiding.oplcode group by omschrijving;`|
+|4.05 |`select academie, count(belangstelling.studentnr) as aantal_inschrijvingen from opleiding left join student on student.oplcode = opleiding.oplcode left join belangstelling on belangstelling.studentnr = student.studentnr where opleiding.academie is not null group by academie;`|
+|4.06 |`select * from inschrijving left join beschikbaar on beschikbaar.datum = inschrijving.datum union all select * from inschrijving right join beschikbaar on beschikbaar.datum = inschrijving.datum;`|
+|4.07 |`select week(date("20120917"));`|
+|4.08 |`select datediff(max(datum), min(datum)) as aantal_dagen_ertussen, max(datum) as maximum_datum, min(datum) as minimum_datum from planning;`|
+|4.09 |`select to_char(now(), "DD-MM-YYYY") as NL_notatie;`|
+|4.10 |`select * from stuk where genrenaam = "klassiek" or jaartal > 1980;`|
+|4.11 |`select * from stuk where genrenaam = "pop" or (speelduur < 5 and niveaucode = "A");`|
+|4.12 |`select * from stuk where niveaucode in("A", "B") and genrenaam != "pop" and speelduur <= 8;`|
+|4.13 |`select stuknr, titel, genrenaam, niveaucode from stuk where (niveaucode in ("B", "C") or niveaucode is null) and genrenaam = "klassiek";`|
+|4.14 |`select stuknr, titel, genrenaam, niveaucode from stuk where niveaucode is not null order by niveaucode desc, genrenaam;`|
+|4.15 |`select count(distinct niveaucode) as aantal from stuk;`|
+|4.16 |`select genrenaam, count(genrenaam) as aantal from stuk where niveaucode in("A", "B") group by genrenaam having aantal > 1;`|
+|4.17 |`select genrenaam, count(genrenaam) as aantal from stuk where jaartal > 1900 group by genrenaam having aantal >= 3;`|
+|4.18 |`select genrenaam, count(genrenaam) as aantal, avg(speelduur) as gemiddelde from stuk where niveaucode is not null group by genrenaam;`|
+|4.19 |`select genrenaam, niveaucode, count(stuknr) as aantal from stuk where niveaucode in("A", "B") group by genrenaam, niveaucode having aantal > 1;`|
+|4.20 |`select naam, titel from stuk inner join componist on stuk.componistId = componist.componistId;`|
+|4.21 |`select stuknr, speelduur, omschrijving from stuk left join niveau on niveau.niveaucode = stuk.niveaucode where genrenaam = "klassiek";`|
+|4.22 |`select componist.naam, muziekschool.plaatsnaam from componist left join muziekschool on muziekschool.schoolId = componist.schoolId where year(geboortedatum) >= 1900;`|
+|4.23 |`select stuknr, titel, componist.naam, niveau.omschrijving from stuk left join componist on stuk.componistId = componist.componistId left join niveau on niveau.niveaucode = stuk.niveaucode where omschrijving is not null;`|
+|4.24 |`select niveau.omschrijving, stuk.niveaucode, count(stuknr) from stuk left join niveau on niveau.niveaucode = stuk.niveaucode group by niveaucode having niveaucode is not null;`|
+|4.25 |`select instrument.instrumentnaam, instrument.toonhoogte from instrument left join stukinstrument on (stukinstrument.instrumentnaam = instrument.instrumentnaam and stukinstrument.toonhoogte = instrument.toonhoogte) where stuknr is null;`|
+|5.01 |`select distinct reis.reisnr, vertrekdatum, reisduur from reis left join bezoek on bezoek.reisnr = reis.reisnr where bezoek.verblijfsduur >= 1 and bezoek.objectnaam = "Mars" group by reisnr;`|
+|5.02 |`select reis.reisnr, naam, geboortedatum, prijs from reis left join deelname on deelname.reisnr = reis.reisnr left join klant on klant.klantnr = deelname.klantnr where naam is not null;`|
+|5.03 |`select hemelobject.objectnaam, count(bezoek.reisnr) as aantal_landingen from hemelobject left join bezoek on bezoek.objectnaam = hemelobject.objectnaam group by objectnaam order by objectnaam;`|
+|5.04 |`select reisnr, count(distinct objectnaam) as aantal_verschillende_objecten from bezoek group by reisnr;`|
+|5.05 |`select reis.reisnr, reis.vertrekdatum, reis.reisduur from hemelobject left join bezoek on bezoek.objectnaam = hemelobject.objectnaam left join reis on reis.reisnr = bezoek.reisnr where satellietVan = "Mars" group by reisnr;`|
+|5.06 |`select reisnr from bezoek group by reisnr having count(distinct objectnaam) = 1;`|
+|5.07 |`select reis.reisnr, count(deelname.reisnr) from reis left join deelname on deelname.reisnr = reis.reisnr group by reis.reisnr order by reis.vertrekdatum;`|
+|5.08 |`select reis.reisnr, vertrekdatum, reisduur, sum(verblijfsduur) as totale_verblijfsduur from bezoek left join reis on reis.reisnr = bezoek.reisnr group by reisnr having totale_verblijfsduur >= 14;`|
+|5.09 |`select klant.klantnr, naam, count(reisnr) as aantal_reizen from deelname left join klant on klant.klantnr = deelname.klantnr group by klantnr having aantal_reizen >= 3;`|
+|5.10 |`select reisnr, count(reisnr) as aantal_klanten from deelname left join klant on klant.klantnr = deelname.klantnr group by reisnr;`|
+|5.11 |`select naam from telefoon left join klant on klant.klantnr = telefoon.klantnr where naam is not null group by klant.klantnr having count(telefoon.telefoonnr) = 2;`|
+|5.12 |`select telefoonnr from telefoon where klantnr is null;`|
+|5.13 |`select naam, telefoonnr from klant left join telefoon on telefoon.klantnr = klant.klantnr order by naam;`|
+|5.14 |[open vraag](#514)|
+|5.15 |[open vraag](#515)|
+|5.16 |[open vraag](#516)|
+|5.17 |[open vraag](#517)|
+|5.18 |[open vraag](#518)|
+|5.19 |[open vraag](#519)|
+|5.20 |[open vraag](#520)|
+|5.21 |[open vraag](#521)|
+|6.01 |`select * from activiteit left join activiteit as goedkoper on 1 where activiteit.prijs > goedkoper.prijs order by activiteit.prijs desc, goedkoper.prijs asc;`|
+|6.02 |`select activiteit.actomschr, sum(goedkoper.prijs) from activiteit left join activiteit as goedkoper on 1 where activiteit.prijs > goedkoper.prijs group by activiteit.actomschr order by activiteit.actomschr;`|
+|6.03 |`select stuk.componistId, stuk.titel from stuk left join stuk as _stuk on stuk.stuknrOrigineel = _stuk.stuknr where stuk.stuknrOrigineel is not null and _stuk.genrenaam = "klassiek" order by _stuk.stuknr;`|
+|6.04 |`select stuk.stuknr, stuk.genrenaam as genrebewerking, _stuk.genrenaam as genreorigineel from stuk left join stuk as _stuk on stuk.stuknrOrigineel = _stuk.stuknr where stuk.genrenaam != _stuk.genrenaam;`|
+|6.05 |`select hemelobject.objectnaam, hemelobject.satellietVan as atelliet_van, subhemelobject.satellietVan as satelliet_van_satelliet_van from hemelobject left join hemelobject as subhemelobject on hemelobject.satellietVan = subhemelobject.objectnaam;`|
+|6.06 |`select actomschr, prijs from activiteit where prijs > (select avg(prijs) from activiteit) order by prijs desc;`|
+|6.07 |`select actcode from planning where datum > (select max(datum) from planning where actcode = "KLS");`|
+|6.08 |`select oplcode, count(studentnr) as aantal from student where (select oplcode like "%I%") group by oplcode;`|
+|6.09 |`select actcode, count(studentnr) as aantal_ingeschreven, sum(case when betaald = 0 then 1 else 0 end) as nog_betalen from inschrijving left join planning on planning.planningsnr = inschrijving.planningsnr group by actcode having (select 1);`|
+|6.10 |`select instrument.instrumentnaam, instrument.toonhoogte from instrument left join stukinstrument on (stukinstrument.instrumentnaam = instrument.instrumentnaam and stukinstrument.toonhoogte = instrument.toonhoogte) where stuknr is null and (select 1);`|
+|6.11 |`select reis.reisnr, reis.vertrekdatum, reis.reisduur from hemelobject left join bezoek on bezoek.objectnaam = hemelobject.objectnaam left join reis on reis.reisnr = bezoek.reisnr where satellietVan = "Mars" group by reisnr having (select 1);`|
+|6.12 |`select reisnr from bezoek group by reisnr having count(distinct objectnaam) = 1 and (select 1);`|
+|6.13 |[open vraag](#613)|
+|6.14 |[open vraag](#614)|
+|6.15 |[open vraag](#615)|
+|6.16 |[open vraag](#616)|
+|6.17 |[open vraag](#617)|
+|6.18 |[open vraag](#618)|
+|6.19 |[open vraag](#619)|
+|6.20 |[open vraag](#620)|
+|6.21 |[open vraag](#621)|
+|6.22 |[open vraag](#622)|
+|6.23 |[open vraag](#623)|
+|6.24 |[open vraag](#624)|
+|6.25 |[open vraag](#625)|
+|6.26 |[open vraag](#626)|
+|6.27 |[open vraag](#627)|
+|6.28 |[open vraag](#628)|
+|6.29 |[open vraag](#629)|
+|6.30 |[open vraag](#630)|
+
+## 1.07
+
+```
+MariaDB [mysql]> select distinct * from opleiding;
++---------+--------------------------+----------+
+| oplcode | omschrijving | academie |
++---------+--------------------------+----------+
+| BK | Bouwkunde | ABCT |
+| CT | Civiele Techniek | ABCT |
+| ET | Electrotechniek | AII |
+| IN | Informatica | AII |
+| TBK | Technische Bedrijfskunde | AII |
+| TI | Technische Informatica | AII |
+| VS | Virtueel Studeren | NULL |
+| WTB | Werktuigbouw | AII |
++---------+--------------------------+----------+
+8 rows in set (0.000 sec)
+
+MariaDB [mysql]>
+```
+
+Dit commando pakt de distincte resultaten uit de primary key kolom (oplcode),
+en weergeeft ook alle andere kolommen voor elk resultaat.
+
+## 1.08
+
+```
+MariaDB [mysql]> select distinct academie from opleiding;
++----------+
+| academie |
++----------+
+| ABCT |
+| AII |
+| NULL |
++----------+
+3 rows in set (0.000 sec)
+
+```
+
+Dit commando laat alleen de distincte resultaten uit de `academie` kolom van de
+`opleiding` tabel zien.
+
+## 1.09
+
+```
+MariaDB [mysql]> select distinct academie,oplcode from opleiding;
++----------+---------+
+| academie | oplcode |
++----------+---------+
+| ABCT | BK |
+| ABCT | CT |
+| AII | ET |
+| AII | IN |
+| AII | TBK |
+| AII | TI |
+| NULL | VS |
+| AII | WTB |
++----------+---------+
+8 rows in set (0.001 sec)
+
+MariaDB [mysql]>
+```
+
+Dit commando pakt de distincte resultaten uit de primary key kolom (oplcode), en
+weergeeft ook de `academie` kolom voor elk resultaat.
+
+## 1.15
+
+```
+MariaDB [mysql]> select * order by actcode from planning;
+ERROR 1064 (42000): You have an error in your SQL syntax;
+check the manual that corresponds to your MariaDB server version for the right
+syntax to use near 'from planning' at line 1
+MariaDB [mysql]>
+```
+
+Dit commando geeft een foutmelding, maar werkt normaal wanneer het `order by
+actcode` gedeelte na het `from planning` gedeelte komt. Dus zijn de volgorde
+van SQL statements belangrijk.
+
+## 2.20
+
+```
+MariaDB [mysql]> select count(*) from opleiding;
++----------+
+| count(*) |
++----------+
+| 8 |
++----------+
+1 row in set (0.000 sec)
+
+MariaDB [mysql]> select count(academie) from opleiding;
++-----------------+
+| count(academie) |
++-----------------+
+| 7 |
++-----------------+
+1 row in set (0.000 sec)
+
+MariaDB [mysql]>
+```
+
+De `count()` functie telt het aantal rijen met een "truthy" waarde. Omdat bij
+`count(*)` elke rij minstens een kolom heeft met een gedefinieerde waarde krijg
+je 8, terwijl in de 'academie' kolom een keer NULL voorkomt.
+
+## 3.03
+
+```
+MariaDB [mysql]> select count(*) from student cross join opleiding;
++----------+
+| count(*) |
++----------+
+| 144 |
++----------+
+1 row in set (0.000 sec)
+
+MariaDB [mysql]>
+```
+
+Het rijenaantal is de hoeveelheid rijen van de eerste tabel vermenigvuldigd met
+de hoeveelheid rijen in de tweede tabel (in dit geval 8 * 18 = 144).
+
+## 3.04
+
+`cross join` maakt elke combinatie van rijen.
+
+## 3.16
+
+```
+MariaDB [mysql]> select omschrijving, count(studentnr) as aantal_studenten from student as s join opleiding as o on s.oplcode = o.oplcode group by omschrijving having count(studentnr) > 2;
++------------------------+------------------+
+| omschrijving | aantal_studenten |
++------------------------+------------------+
+| Informatica | 5 |
+| Technische Informatica | 4 |
++------------------------+------------------+
+2 rows in set (0.000 sec)
+
+MariaDB [mysql]>
+```
+
+Deze query laat voor elke opleiding met meer dan 2 studenten de naam en het
+studentenaantal zien.
+
+## 3.17
+
+1. Tabel maken met omschrijving en unieke studentnummers
+ ```
+ MariaDB [mysql]> select omschrijving, studentnr from student join opleiding on student.oplcode = opleiding.oplcode;
+ +--------------------------+-----------+
+ | omschrijving | studentnr |
+ +--------------------------+-----------+
+ | Bouwkunde | 16 |
+ | Civiele Techniek | 17 |
+ | Civiele Techniek | 18 |
+ | Electrotechniek | 5 |
+ | Electrotechniek | 9 |
+ | Informatica | 1 |
+ | Informatica | 2 |
+ | Informatica | 6 |
+ | Informatica | 7 |
+ | Informatica | 10 |
+ | Technische Bedrijfskunde | 14 |
+ | Technische Bedrijfskunde | 15 |
+ | Technische Informatica | 3 |
+ | Technische Informatica | 4 |
+ | Technische Informatica | 8 |
+ | Technische Informatica | 11 |
+ | Werktuigbouw | 12 |
+ | Werktuigbouw | 13 |
+ +--------------------------+-----------+
+ 18 rows in set (0.000 sec)
+ ```
+2. Studentnummers tellen en groeperen per opleiding
+ ```
+ MariaDB [mysql]> select omschrijving, count(studentnr) from student join opleiding on student.oplcode = opleiding.oplcode group by omschrijving;
+ +--------------------------+------------------+
+ | omschrijving | count(studentnr) |
+ +--------------------------+------------------+
+ | Bouwkunde | 1 |
+ | Civiele Techniek | 2 |
+ | Electrotechniek | 2 |
+ | Informatica | 5 |
+ | Technische Bedrijfskunde | 2 |
+ | Technische Informatica | 4 |
+ | Werktuigbouw | 2 |
+ +--------------------------+------------------+
+ 7 rows in set (0.000 sec)
+ ```
+3. Verberg alle opleidingen met 2 of minder studenten
+ ```
+ MariaDB [mysql]> select omschrijving, count(studentnr) from student join opleiding on student.oplcode = opleiding.oplcode group by omschrijving having count(studentnr) > 2;
+ +------------------------+------------------+
+ | omschrijving | count(studentnr) |
+ +------------------------+------------------+
+ | Informatica | 5 |
+ | Technische Informatica | 4 |
+ +------------------------+------------------+
+ 2 rows in set (0.000 sec)
+ ```
+4. Kolomnamen en tabelaliasen toevoegen
+ ```
+ MariaDB [mysql]> select omschrijving, count(studentnr) as aantal_studenten from student as s join opleiding as o on s.oplcode = o.oplcode group by omschrijving having count(studentnr) > 2;
+ +------------------------+------------------+
+ | omschrijving | aantal_studenten |
+ +------------------------+------------------+
+ | Informatica | 5 |
+ | Technische Informatica | 4 |
+ +------------------------+------------------+
+ 2 rows in set (0.000 sec)
+ ```
+
+## 5.14
+
+```
+MariaDB [mysql]> describe bezoek;
++---------------+--------------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++---------------+--------------+------+-----+---------+-------+
+| reisnr | decimal(4,0) | NO | PRI | NULL | |
+| objectnaam | varchar(10) | NO | MUL | NULL | |
+| volgnr | decimal(2,0) | NO | PRI | NULL | |
+| verblijfsduur | decimal(4,0) | NO | | NULL | |
++---------------+--------------+------+-----+---------+-------+
+4 rows in set (0.001 sec)
+
+```
+
+De tabel `bezoek` heeft de kolommen `reisnr` en `volgnr` beide als primary key
+ingesteld, dus 2.
+
+## 5.15
+
+De sleutels hoeven niet direct onder elkaar te staan, in dit geval zit de
+`objectnaam` kolom er nog tussen.
+
+## 5.16
+
+De rode gevulde ruit staat voor een kolom die een key is, en `not null` is.
+
+## 5.17
+
+Een of meer beide kanten op, want een klant kan meerdere reizen maken, en een
+reis kan meerdere klanten bevatten.
+
+## 5.18
+
+Nee, op deze manier is twee keer dezelfde reis ingevuld (reisnr 31 met klantnr
+121).
+
+## 5.19
+
+Volgens het schema die MySQL Workbench tekent zou elke klant minimaal één
+telefoonnummer moeten hebben, maar in realiteit is dit nul of meer.
+
+## 5.20
+
+```
+MariaDB [mysql]> describe telefoon;
++------------+---------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++------------+---------+------+-----+---------+-------+
+| telefoonnr | int(11) | NO | PRI | NULL | |
+| klantnr | int(11) | YES | MUL | NULL | |
++------------+---------+------+-----+---------+-------+
+2 rows in set (0.001 sec)
+
+```
+
+Dit kan, omdat de `klantnr` kolom null mag zijn.
+
+## 5.21
+
+Elk bezoek gaat naar precies één hemelobject.
+
+## 6.13
+
+```
+MariaDB [mysql]> describe instrument;
++----------------+-------------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++----------------+-------------+------+-----+---------+-------+
+| instrumentnaam | varchar(14) | NO | PRI | NULL | |
+| toonhoogte | varchar(7) | NO | PRI | NULL | |
++----------------+-------------+------+-----+---------+-------+
+2 rows in set (0.001 sec)
+
+```
+
+Twee.
+
+## 6.14
+
+Nee, allebei de kolommen van de tabel zijn primary keys, en moeten daarom uniek
+zijn.
+
+## 6.15
+
+Elk stuk kan één of meerdere instrumenten bevatten, en elk instrument wordt
+gebruikt door één of meerdere stukken.
+
+## 6.16
+
+Dat geen enkele rij in een kolom met de `not null` constraint een `null` waarde
+mag bevatten.
+
+## 6.17
+
+```
+MariaDB [mysql]> describe stukinstrument;
++----------------+--------------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++----------------+--------------+------+-----+---------+-------+
+| stuknr | decimal(5,0) | NO | PRI | NULL | |
+| instrumentnaam | varchar(14) | NO | PRI | NULL | |
+| toonhoogte | varchar(7) | NO | PRI | NULL | |
+| aantal | decimal(2,0) | NO | | NULL | |
++----------------+--------------+------+-----+---------+-------+
+4 rows in set (0.001 sec)
+
+```
+
+Alle kolommen moeten verplicht ingevuld zijn, omdat ze allemaal de `not null`
+constraint hebben.
+
+## 6.18
+
+Een foreign key is een key die verwijst naar een key uit een andere tabel.
+
+## 6.19
+
+```
+MariaDB [mysql]> describe stukinstrument;
++----------------+--------------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++----------------+--------------+------+-----+---------+-------+
+| stuknr | decimal(5,0) | NO | PRI | NULL | |
+| instrumentnaam | varchar(14) | NO | PRI | NULL | |
+| toonhoogte | varchar(7) | NO | PRI | NULL | |
+| aantal | decimal(2,0) | NO | | NULL | |
++----------------+--------------+------+-----+---------+-------+
+4 rows in set (0.001 sec)
+
+```
+
+Deze tabel bevat alleen normale en primary key kolommen, dus geen foreign keys
+(zie key kolom van de stukinstrument schema).
+
+## 6.20
+
+`varchar(n)` is een datatype die een variabele lengte string kan opslaan met
+een maximale lengte van `n` tekens.
+
+## 6.21
+
+`decimal(5, 2)` is een datatype die een fixed-point getal kan opslaan. Deze
+slaan een exacte decimale waarde op in tegenstelling tot een nauwkeurige
+benadering zoals een floating-point. Het eerste getal in de definitie van een
+decimal datatype duidt het aantal cijfers voor de komma aan, en het tweede
+getal het aantal cijfers na de komma.
+
+Het grootste getal dat `decimal(5, 2)` kan opslaan is 99999.99, en het kleinste
+getal is -99999.99.
+
+## 6.22
+
+`datetime` slaat een datum en tijdstip in een kolom op. deze heeft een bereik
+van 01-01-1000 00:00:00 tot 31-12-9999 23:59:59.
+
+## 6.23
+
+```
+MariaDB [mysql]> describe stuk;
++-----------------+--------------+------+-----+---------+-------+
+| Field | Type | Null | Key | Default | Extra |
++-----------------+--------------+------+-----+---------+-------+
+| stuknr | decimal(5,0) | NO | PRI | NULL | |
+| componistId | decimal(4,0) | NO | MUL | NULL | |
+| titel | varchar(20) | NO | | NULL | |
+| stuknrOrigineel | decimal(5,0) | YES | MUL | NULL | |
+| genrenaam | varchar(10) | NO | MUL | NULL | |
+| niveaucode | char(1) | YES | MUL | NULL | |
+| speelduur | decimal(3,1) | YES | | NULL | |
+| jaartal | decimal(4,0) | NO | | NULL | |
++-----------------+--------------+------+-----+---------+-------+
+8 rows in set (0.001 sec)
+
+```
+
+De kolommen `stuknr`, `componistId`, `titel`, `genrenaam` en `jaartal` zijn
+verplicht in te vullen.
+
+## 6.24
+
+`not null`
+
+## 6.25
+
+Er staan twee parallelle strepen aan de kant van de genre tabel op de lijn die
+de stuk en genre tabellen verbinden.
+
+## 6.26
+
+Elk stuk heeft in dit geval maar één componist, maar componisten kunnen wel
+één of meerdere stukken geschreven hebben.
+
+## 6.27
+
+Elke muziekschool heeft één of meerdere componisten geschoold, maar elke
+componist kan maar naar één muziekschool gegaan zijn.
+
+## 6.28
+
+Elk stuk heeft één of geen niveaucode, en meerdere stukken kunnen dezelfde
+niveaucode hebben (niveaucode kan gebruikt worden door één of meerdere
+stukken).
+
+## 6.29
+
+`schoolId` is een niet verplichte foreign key.
+
+## 6.30
+
+In een tabel waar een kolom een foreign key is, mogen meerdere rijen dezelfde
+foreign key hebben, maar in de foreign tabel mogen nog steeds niet meerdere
+rijen dezelfde primary key hebben.
+