Skip to content

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
SELECT *
FROM a
    JOIN b ON a.aID = b.aID

INNER JOIN — keten van 1:N relaties

SELECT *
FROM a
    JOIN b ON a.aID = b.aID
    JOIN c ON c.bID = b.bID

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)