The most important thing in the programming language is the name. A language will not succeed without a good name. I have recently invented a very good name and now I am looking for a suitable language.
—Donald Knuth

De LIMIT clause

In dit hoofdstuk bekijken we hoe je het aantal getoonde resultaatrijen beperkt tot de eerste zoveel rijen. Terloops geeft dit klein stukje een goede aanleiding om het even over (SQL)standaarden te hebben.

Je kan de query's nog steeds uitvoeren op de tabel ‘opleidingsonderdeel’ in het schema ‘uclloket’ van de databank ‘df’ of in je eigen versie hiervan.

LIMIT

Vaak wil je als resultaat van een opvraging alleen de eerste 3, 5, 10, … resultaten zien. De volgende query toont de top twee van de OPO’s met het grootste aantal studiepunten:

SELECT opocode, naam, studiepunten
FROM opleidingsonderdeel
ORDER BY studiepunten DESC
LIMIT 2

Het is logisch dat je dit enkel zinvol kan doen als er ook een ORDER BY clause aanwezig is. Dit is het resultaat:

Beperk de lijst tot de bovenste twee

OFFSET

Stel dat je niet nummer 1 en 2 wilt zien zoals hierboven, maar wel de twee volgende (dus nummer 3 en 4 in de gesorteerde lijst). Dat kan eenvoudig als volgt:

SELECT opocode, naam, studiepunten
FROM opleidingsonderdeel
ORDER BY studiepunten DESC
LIMIT 2 OFFSET 2

Standaard SQL

Misschien maak je bij de vorige query de bedenking dat er wel meer OPO’s 6 SP hebben. Het systeem toont er – zoals gevraagd – effectief maar twee. We kunnen ons situaties voorstellen waarbij we toch wel graag ook die andere OPO’s van 6 SP zouden willen zien (de ‘ex aequo’s’ noemen we die dan vaak).

Er is trouwens nog iets interessants: LIMIT en OFFSET zijn eigenlijk geen standaard SQL. Al heel lang bestond de behoefte om het aantal rijen te beperken tot de bovenste zoveel rijen. De SQL standaard had hier geen oplossing voor en dus is elke databankmaker zelf aan de slag gegaan. Een aantal DBMS (o.a MySQL, PostgreSQL, …) bedachten de LIMIT syntaxis. Pas in 2008 kwam er een manier in standaard SQL om dit te doen: FETCH FIRST ... ROWS (ONLY of WITH TIES). De vorige query volgens standaard SQL zou er als volgt kunnen uitzien (eveneens ondersteund door PostgreSQL):

SELECT opocode, naam, studiepunten
FROM opleidingsonderdeel
ORDER BY studiepunten DESC
OFFSET 2
FETCH FIRST 2 ROWS ONLY

Het resultaat is identiek aan de LIMIT / OFFSET query: resultaten 3 en 4 worden getoond van de gesorteerde lijst (dalend aantal SP).

Bovendien heeft deze syntax een elegante oplossing voor het probleem van ‘ex aequo’s’: WITH TIES. Volgende query toont de nummers 3 en 4 van de lijst, tenzij er nog OPO’s zijn met hetzelfde aantal SP als nummer 4. In dat geval gaat de lijst verder, zoals de figuur onder de code laat zien:

SELECT opocode, naam, studiepunten
FROM opleidingsonderdeel
ORDER BY studiepunten DESC
OFFSET 2
FETCH FIRST 2 ROWS WITH TIES

extra rijen met dezelfde waarden worden ook getoond

Oefeningen

Hoeveel studiepunten coördineert elke coördinator? Geef alle coördinatoren die het vierde meeste studiepunten coördineren.

SELECT coordinator, SUM(studiepunten) AS AANTAL_STUDIEPUNTEN_GECOORDINEERD
FROM opleidingsonderdeel
GROUP BY coordinator
ORDER BY SUM(studiepunten) DESC
OFFSET 3
FETCH FIRST 1 ROW WITH TIES