DQL — Data Query Language
1. SELECT Statement
SELECT is de basis van alles. De volgorde van de clauses is altijd dezelfde:
SELECT ….…. AS …, … -- welke kolommen? (tabel.kolom)
-- SUM(...), COUNT(*) bij GROUP BY
FROM … -- eerste tabel (volgorde niet belangrijk)
JOIN … ON ….…. = ….…. -- als PK en FK niet dezelfde naam hebben: tabel.kolom
… -- zoveel tabellen joinen als je wil
WHERE … -- filteren: =, <>, LIKE, AND, OR, ...
GROUP BY …,… -- records groeperen op basis van gelijke kolomwaarden
HAVING … -- filteren na groepering
ORDER BY …,… -- sorteren op kolommen
Tabelnaam
De tabelnaam is verplicht als er naamverwarring mogelijk is. Gebruik tabelnaam.kolomnaam of een alias voor de tabelnaam.
Voorbeeld
SELECT customers.customerName AS klant,
orderDate,
SUM(quantityOrdered * priceEach) AS bedrag
FROM orderdetails
JOIN orders
ON orders.orderNumber = orderdetails.OrderNumber
JOIN customers
ON customers.customerNumber = orders.customerNumber
WHERE orders.status = 'Shipped'
AND shippedDate > '2004-01-01'
GROUP BY orders.orderNumber, orderDate, customers.customerName
HAVING SUM(quantityOrdered * priceEach) < 10000
ORDER BY bedrag DESC;
2. JOIN Types
INNER JOIN — 1-N relatie
Meest voorkomend. Geeft enkel rijen terug die een match hebben in beide tabellen.
- 1-N: A heeft N B's (0, 1 of meer) — B heeft precies 1 A
- Bvb: een klant heeft 0 of meer bestellingen, elke bestelling hoort bij 1 klant
INNER JOIN — keten van 1:N relaties
INNER JOIN — M-N relatie
Een many-to-many relatie vereist een mapping table met foreign keys naar beide tabellen.
-- persoon_boek is de mapping table
SELECT *
FROM persoon_boek
JOIN persoon ON persoon.id = persoon_boek.persoon_id
JOIN boek ON boek_id = persoon_boek.boek_id
3. Andere JOIN Types
| Type | Resultaat |
|---|---|
| INNER JOIN | Enkel rijen met match in beide tabellen |
| LEFT JOIN | Alle rijen van linkertabel + matches van rechter (NULL als geen match) |
| OUTER JOIN | Alle rijen van beide tabellen (inclusief niet-gematchte) |
| CROSS JOIN | Cartesisch product — elke rij van A gekoppeld aan elke rij van B |
| UNION | Resultaten van twee queries samenvoegen (verwijdert duplicaten) |