Alles uit de cursus op één pagina: van je eerste SELECT tot JOINs, window functions en het aanpassen van data. Elke voorbeeldquery werkt op de videotheek-dataset uit de lessen (films, leden en uitleningen).
Tip: druk deze pagina af of bewaar ze als pdf.
SELECT * FROM filmsSELECT titel, jaar FROM filmsSELECT titel AS film FROM filmsAS geeft een kolom een andere naam in het resultaat.SELECT titel, prijs_per_dag * 2 AS weekend FROM films+, -, * en /, per rij.SELECT titel FROM films LIMIT 5ORDER BY kiest de database welke.SELECT titel FROM films LIMIT 5 OFFSET 10OFFSET slaat eerst rijen over: handig om per pagina te tonen.SELECT titel FROM films WHERE genre = 'horror'= let op hoofdletters.SELECT titel FROM films WHERE duur_min >= 120=, <> (of !=), <, <=, >, >=. Getallen zonder aanhalingstekens.SELECT * FROM uitleningen WHERE uitgeleend_op > '2024-10-15''jaar-maand-dag', altijd tussen aanhalingstekens.SELECT titel FROM films WHERE (genre = 'drama' OR genre = 'komedie') AND jaar > 2000AND gaat voor OR: zet haakjes om wat bij elkaar hoort.SELECT titel FROM films WHERE NOT genre = 'animatie'NOT draait een voorwaarde om.SELECT naam FROM leden WHERE gemeente IN ('Leuven', 'Gent')IN is een korte OR. NOT IN is het omgekeerde.SELECT titel FROM films WHERE jaar BETWEEN 1990 AND 1999BETWEEN neemt beide grenzen mee. Kleinste waarde eerst.SELECT titel FROM films WHERE titel LIKE 'The %'% is nul of meer tekens, _ precies één. In SQLite negeert LIKE hoofdletters.SELECT naam FROM leden WHERE email IS NULLIS NULL of IS NOT NULL, nooit met = NULL.SELECT titel, score FROM films ORDER BY score DESCORDER BY sorteert, ASC oplopend (standaard), DESC aflopend.SELECT titel, jaar FROM films ORDER BY jaar DESC LIMIT 3SELECT genre, titel, score FROM films ORDER BY genre, score DESCNULL staat bij oplopend sorteren vooraan.SELECT DISTINCT genre FROM filmsDISTINCT haalt dubbele rijen weg. Bij meerdere kolommen telt de combinatie.SELECT COUNT(*) FROM filmsCOUNT(*) telt rijen. Je krijgt één rij met één getal.SELECT COUNT(score), COUNT(DISTINCT genre) FROM filmsCOUNT(kolom) slaat NULL over, COUNT(DISTINCT kolom) telt verschillende waarden.SELECT SUM(boete), AVG(boete) FROM uitleningenSUM telt op, AVG middelt. Beide slaan NULL over. Zonder rijen geeft SUM NULL, geen 0.SELECT MIN(jaar), MAX(jaar) FROM filmsSELECT ROUND(AVG(score), 1) FROM filmsROUND(getal, decimalen) rondt af. Let op: 7 / 2 geeft in SQLite 3, schrijf 7 * 1.0 / 2 voor 3.5.SELECT genre, COUNT(*) AS aantal FROM films GROUP BY genreSELECT staat in GROUP BY of in een functie als COUNT.SELECT genre, COUNT(*) FROM films GROUP BY genre HAVING COUNT(*) >= 4WHERE filtert rijen vóór het groeperen, HAVING filtert groepen erna.SELECT genre, AVG(score) AS gemiddeld FROM films WHERE jaar > 1990 GROUP BY genre ORDER BY gemiddeld DESCSELECT gemeente, abonnement, COUNT(*) FROM leden GROUP BY gemeente, abonnementDe tabel vóór JOIN is links, de tabel erna rechts. Het gekleurde deel blijft over.
SELECT f.titel, u.uitgeleend_op FROM uitleningen u JOIN films f ON u.film_id = f.idJOIN (of INNER JOIN): alleen rijen met een partner aan beide kanten. u en f zijn aliassen.SELECT f.titel, u.id FROM films f LEFT JOIN uitleningen u ON u.film_id = f.idLEFT JOIN: elke rij van links, ook zonder partner. Rechts staat dan NULL.SELECT f.titel, u.id FROM uitleningen u RIGHT JOIN films f ON u.film_id = f.idRIGHT JOIN: elke rij van rechts. Hetzelfde als een LEFT JOIN met de tabellen omgewisseld.SELECT l.naam, u.id FROM leden l FULL JOIN uitleningen u ON u.lid_id = l.idFULL JOIN: alle rijen van beide kanten, met NULL waar een partner ontbreekt.SELECT f.titel FROM films f LEFT JOIN uitleningen u ON u.film_id = f.id WHERE u.id IS NULLLEFT JOIN en dan IS NULL op de rechterkant. Hier: films die nooit verhuurd werden.SELECT l.naam, f.titel FROM uitleningen u JOIN leden l ON u.lid_id = l.id JOIN films f ON u.film_id = f.idJOIN's achter elkaar, elk met een eigen ON.SELECT a.naam, b.naam FROM leden a JOIN leden b ON a.gemeente = b.gemeente AND a.id < b.idSELECT titel, CASE WHEN score >= 8 THEN 'topper' WHEN score >= 7 THEN 'goed' ELSE 'matig' END AS oordeel FROM filmsCASE kiest per rij een waarde, zoals een als-dan. ELSE vangt de rest op, ook NULL.SELECT titel FROM films WHERE score > (SELECT AVG(score) FROM films)SELECT naam FROM leden WHERE id IN (SELECT lid_id FROM uitleningen WHERE boete > 0)IN geeft een lijst. Hier de leden die ooit een boete kregen.WITH populair AS (SELECT film_id, COUNT(*) AS keer FROM uitleningen GROUP BY film_id) SELECT f.titel, p.keer FROM populair p JOIN films f ON p.film_id = f.idWITH (een CTE) geeft een tussenresultaat een naam, zodat je query leesbaar blijft.SELECT naam FROM leden WHERE gemeente = 'Gent' UNION SELECT naam FROM leden WHERE abonnement = 'premium'UNION zet resultaten onder elkaar en haalt dubbels weg. UNION ALL houdt ze.SELECT UPPER(titel), LOWER(genre), LENGTH(titel) FROM filmsSELECT naam || ' (' || gemeente || ')' AS lid FROM leden|| plakt tekst aan elkaar.SELECT SUBSTR(titel, 1, 3), REPLACE(titel, ' ', '_'), TRIM(' ja ') FROM filmsSELECT titel FROM films WHERE LOWER(genre) = 'horror'SELECT uitgeleend_op, strftime('%Y', uitgeleend_op) AS jaar, date(uitgeleend_op, '+7 days') AS terug FROM uitleningenstrftime haalt een deel uit een datum, date(..., '+7 days') rekent ermee. date('now') is vandaag.SELECT julianday(teruggebracht_op) - julianday(uitgeleend_op) AS dagen FROM uitleningenSELECT naam, COALESCE(email, 'geen e-mail') FROM ledenCOALESCE geeft de eerste waarde die geen NULL is: handig als reservewaarde.Rekenen over meerdere rijen, zonder ze samen te voegen tot één rij zoals GROUP BY doet.
SELECT titel, score, ROW_NUMBER() OVER (ORDER BY score DESC) AS plaats FROM filmsROW_NUMBER() nummert de rijen in de volgorde van OVER (ORDER BY ...).SELECT titel, genre, score, RANK() OVER (PARTITION BY genre ORDER BY score DESC) AS plaats FROM filmsPARTITION BY begint per genre opnieuw. RANK() geeft gelijke scores dezelfde plaats.SELECT uitgeleend_op, boete, SUM(boete) OVER (ORDER BY uitgeleend_op) AS totaal FROM uitleningenIn Lurndo oefen je zonder risico. Na elke query zet de database zich terug.
INSERT INTO leden (naam, gemeente, geboortejaar, lid_sinds, abonnement) VALUES ('Ann Peeters', 'Lier', 1985, '2025-10-01', 'basis')NULL (of hun standaardwaarde).UPDATE films SET prijs_per_dag = prijs_per_dag + 0.5 WHERE jaar >= 2020DELETE FROM uitleningen WHERE teruggebracht_op IS NOT NULL AND boete = 0BEGIN; UPDATE leden SET abonnement = 'premium' WHERE id = 1; COMMIT;COMMIT bewaart, ROLLBACK maakt alles ongedaan.CREATE TABLE reserveringen (id INTEGER PRIMARY KEY, film_id INTEGER NOT NULL REFERENCES films (id), naam TEXT NOT NULL, datum TEXT DEFAULT (date('now')))INTEGER, REAL, TEXT, BLOB. PRIMARY KEY, NOT NULL, DEFAULT en REFERENCES (vreemde sleutel) bewaken je data.ALTER TABLE leden ADD COLUMN telefoon TEXTDROP TABLE uitleningenCREATE INDEX idx_films_genre ON films (genre)CREATE VIEW recente_films AS SELECT titel, jaar FROM films WHERE jaar >= 2020; SELECT * FROM recente_filmsSELECT genre, COUNT(*) AS aantal FROM films WHERE jaar >= 2000 GROUP BY genre HAVING COUNT(*) > 1 ORDER BY aantal DESC LIMIT 3SELECT, FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT. De database werkt in een andere volgorde: eerst FROM en JOIN, dan WHERE, GROUP BY, HAVING, daarna SELECT, en pas op het einde ORDER BY en LIMIT. Daarom mag een alias wel in ORDER BY, maar niet in WHERE.