Skip to content

MySQL Cheatsheet

Johan Beysen — AP Hogeschool


Tips

Lees dit voor je begint

  • Altijd type opgevenNOT NULL daar waar mogelijk
  • Gebruik INT UNSIGNED als je geen negatieve getallen nodig hebt
  • Sorteren is ORDER BY — niet sort by
  • Komma's tussen waarden in SELECT
  • Meerdere voorwaarden in WHERE: gebruik WHERE kolom IN ('optie1','optie2','optie3')

Uitvoervolgorde SELECT

De logische volgorde waarin MySQL een query verwerkt:

FROM
WHERE
GROUP BY
HAVING
ORDER BY
SELECT

Datatypes

Getallen

Type Bereik (signed) Bereik (unsigned)
TINYINT -128 tot 127 0 tot 255
SMALLINT -32,768 tot 32,767 0 tot 65,535
MEDIUMINT -8,388,608 tot 8,388,607 0 tot 16,777,215
INT -2,147,483,648 tot 2,147,483,647 0 tot 4,294,967,295
BIGINT -9,223,372,036,854,775,808 tot … 0 tot 18,446,744,073,709,551,615
DECIMAL(m,d) m = totaal cijfers, d = na komma
FLOAT Zwevendekommagetal
DOUBLE Dubbele precisie zwevendekommagetal

Tekst & Overig

Type Omschrijving
VARCHAR(n) Variabele lengte tekst, max n karakters
TEXT Lange tekst
DATE Datum (YYYY-MM-DD)
DATETIME Datum en tijd (YYYY-MM-DD HH:MM:SS)
BOOLEAN Waar/onwaar waarde

Constraints

Constraint Omschrijving
NOT NULL Kolom mag geen NULL-waarde bevatten
UNIQUE Alle waarden in de kolom moeten uniek zijn
CHECK Voorwaarde die moet worden voldaan voor de waarde in de kolom
DEFAULT Standaardwaarde als er geen waarde wordt opgegeven
PRIMARY KEY Unieke identifier voor een rij
FOREIGN KEY Verwijzing naar een kolom in een andere tabel
AUTO_INCREMENT Automatisch ophogend getal

DDL — Data Definition Language

CREATE TABLE

-- Basis
CREATE TABLE tabel_naam (
    kolom1 datatype constraint,
    kolom2 datatype constraint,
    ...
);
-- Met PRIMARY KEY, NOT NULL, UNIQUE
CREATE TABLE studenten (
    student_id    INT          AUTO_INCREMENT PRIMARY KEY,
    naam          VARCHAR(100) NOT NULL,
    geboortedatum DATE,
    email         VARCHAR(100) UNIQUE
);
-- Met FOREIGN KEY
CREATE TABLE inschrijvingen (
    inschrijving_id INT  AUTO_INCREMENT PRIMARY KEY,
    student_id      INT,
    cursus_id       INT,
    inschrijfdatum  DATE,
    FOREIGN KEY (student_id) REFERENCES studenten(student_id),
    FOREIGN KEY (cursus_id)  REFERENCES cursussen(cursus_id)
);
-- Met CHECK
CREATE TABLE producten (
    product_id INT            AUTO_INCREMENT PRIMARY KEY,
    naam       VARCHAR(100)   NOT NULL,
    prijs      DECIMAL(10, 2) CHECK (prijs > 0)
);
-- Met DEFAULT
CREATE TABLE bestellingen (
    bestelling_id INT      AUTO_INCREMENT PRIMARY KEY,
    klant_id      INT,
    bestel_datum  DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Met UNIQUE
CREATE TABLE gebruikers (
    gebruiker_id   INT          AUTO_INCREMENT PRIMARY KEY,
    gebruikersnaam VARCHAR(50)  UNIQUE,
    wachtwoord     VARCHAR(255) NOT NULL
);

DROP TABLE

DROP TABLE IF EXISTS tabel_naam;

ALTER TABLE

-- Kolom toevoegen
ALTER TABLE tabel_naam ADD COLUMN kolom_naam datatype constraint;

-- Kolom verwijderen
ALTER TABLE tabel_naam DROP COLUMN kolom_naam;

-- Kolom wijzigen (naam, type én constraint)
ALTER TABLE tabel_naam CHANGE COLUMN oude_naam nieuwe_naam datatype constraint;

-- Tabel hernoemen
RENAME TABLE oude_naam TO nieuwe_naam;

DML — Data Manipulation Language

INSERT

-- Basis
INSERT INTO tabel_naam (kolom1, kolom2, ...)
VALUES ('string_waarde', 'datum_waarde', getal_waarde);

-- Meerdere rijen
INSERT INTO studenten (naam, geboortedatum, email)
VALUES
    ('Piet Pietersen', '1992-02-02', 'piet.pietersen@example.com'),
    ('Klaas Klaassen', '1994-03-03', 'klaas.klaassen@example.com');

-- Met SELECT
INSERT INTO nieuwe_tabel (kolom1, kolom2)
SELECT kolom1, kolom2 FROM bestaande_tabel WHERE conditie;

UPDATE

-- Basis
UPDATE tabel_naam
SET kolom1 = 'waarde1', kolom2 = 'waarde2'
WHERE conditie;

-- Met subquery
UPDATE Studenten
SET Status = 'Uitblinker'
WHERE IQ > (
    SELECT AVG(IQ) FROM Studenten
);

DELETE

-- Specifieke rij
DELETE FROM studenten WHERE student_id = 1;

-- Met meerdere voorwaarden
DELETE FROM studenten
WHERE geboortedatum < '2000-01-01' AND email LIKE '%@example.com';

-- Alle rijen
DELETE FROM studenten;

-- Met subquery
DELETE FROM studenten
WHERE student_id IN (
    SELECT student_id FROM inschrijvingen WHERE cursus_id = 2
);

DQL — SELECT

Basis

SELECT kolom1, kolom2 FROM tabel_naam;
SELECT kolom1 AS alias1, kolom2 AS alias2 FROM tabel_naam;
SELECT kolom1, kolom2 FROM tabel_naam WHERE conditie;
SELECT kolom1, kolom2 FROM tabel_naam WHERE c1 AND c2;
SELECT kolom1, kolom2 FROM tabel_naam WHERE c1 OR  c2;
SELECT kolom1, kolom2 FROM tabel_naam ORDER BY kolom1 ASC|DESC;
SELECT kolom1, kolom2 FROM tabel_naam LIMIT aantal;
SELECT kolom1, kolom2 FROM tabel_naam LIMIT aantal OFFSET start;
SELECT DISTINCT kolom1  FROM tabel_naam;

WHERE Clausules

-- IN
SELECT kolom1, kolom2 FROM tabel_naam
WHERE kolom1 IN (waarde1, waarde2, ...);

-- BETWEEN
SELECT kolom1, kolom2 FROM tabel_naam
WHERE kolom1 BETWEEN waarde1 AND waarde2;

-- LIKE
SELECT kolom1 FROM tabel_naam WHERE kolom1 LIKE 'voor%';  -- begint met 'voor'
SELECT kolom1 FROM tabel_naam WHERE kolom1 LIKE '%beeld'; -- eindigt met 'beeld'
SELECT kolom1 FROM tabel_naam WHERE kolom1 LIKE '%oor%';  -- bevat 'oor'

-- IS NULL / IS NOT NULL
SELECT kolom1, kolom2 FROM tabel_naam WHERE kolom1 IS NULL;
SELECT kolom1, kolom2 FROM tabel_naam WHERE kolom1 IS NOT NULL;
Jokerteken Betekenis
% Nul of meer karakters
_ Exact één karakter

JOIN

-- INNER JOIN (alleen matches in beide tabellen)
SELECT l.Naam, kl.KlasNaam
FROM Leerlingen l
JOIN Klassen kl ON l.KlasID = kl.ID;

-- LEFT JOIN (alle van linkertabel, ook zonder match)
SELECT l.Naam, kl.KlasNaam
FROM Leerlingen l
LEFT JOIN Klassen kl ON l.KlasID = kl.ID;

-- LEFT JOIN: alleen rijen zonder match in rechtertabel
SELECT l.Naam
FROM Leerlingen l
LEFT JOIN Klassen kl ON l.KlasID = kl.ID
WHERE kl.ID IS NULL;

-- JOIN met filter
SELECT l.Naam, kl.KlasNaam
FROM Leerlingen l
JOIN Klassen kl ON l.KlasID = kl.ID
WHERE kl.Graad = 3;

-- JOIN met 3 tabellen
SELECT l.Naam, kl.KlasNaam, s.Naam AS SchoolNaam
FROM Leerlingen l
JOIN Klassen kl ON l.KlasID = kl.ID
JOIN Scholen  s  ON kl.SchoolID = s.ID;

-- Multi-table zonder JOIN keyword
SELECT village.name
FROM village, inhabitant
WHERE village.villageid = inhabitant.villageid
AND   inhabitant.name = 'Dirty Dieter';

GROUP BY & HAVING

-- GROUP BY
SELECT kolom1, COUNT(*) AS aantal
FROM tabel_naam
GROUP BY kolom1;

-- HAVING
SELECT kolom1, COUNT(*) AS aantal
FROM tabel_naam
GROUP BY kolom1
HAVING COUNT(*) > 10;

SELECT kolom1, SUM(kolom2) AS totaal
FROM tabel_naam
GROUP BY kolom1
HAVING SUM(kolom2) > 1000;

Aggregatiefuncties

Functie Omschrijving
COUNT(*) Aantal rijen
SUM(kolom) Som
AVG(kolom) Gemiddelde
MIN(kolom) Minimumwaarde
MAX(kolom) Maximumwaarde
SELECT COUNT(*) AS totaal          FROM tabel_naam;
SELECT SUM(kolom)  AS totaal       FROM tabel_naam;
SELECT AVG(kolom)  AS gemiddelde   FROM tabel_naam;
SELECT MIN(kolom)  AS minimum      FROM tabel_naam;
SELECT MAX(kolom)  AS maximum      FROM tabel_naam;

-- Met GROUP BY
SELECT kolom1, COUNT(*)    AS aantal    FROM tabel_naam GROUP BY kolom1;
SELECT kolom1, SUM(kolom2) AS totaal    FROM tabel_naam GROUP BY kolom1;
SELECT kolom1, AVG(kolom2) AS gemiddelde FROM tabel_naam GROUP BY kolom1;

-- Meerdere aggregaties in één query (scalaire subqueries)
SELECT
    (SELECT COUNT(*) FROM Liedjes2)                                AS Aantal_Liedjes,
    (SELECT Duurtijd FROM Liedjes2 ORDER BY Duurtijd DESC LIMIT 1) AS Langste_Liedje,
    (SELECT SUM(Duurtijd) FROM Liedjes2 WHERE Artiest = 'U2')      AS totale_Tijd;

Stringfuncties & Opmaak

Stringfuncties

Functie Omschrijving Resultaat
LENGTH(str) Lengte van een string LENGTH('voorbeeld')9
CONCAT(s1,s2,...) Strings samenvoegen CONCAT('voor','beeld')'voorbeeld'
SUBSTRING(str,pos,len) Deel van een string SUBSTRING('voorbeeld',1,4)'voor'
UPPER(str) Naar hoofdletters UPPER('voorbeeld')'VOORBEELD'
LOWER(str) Naar kleine letters LOWER('VOORBEELD')'voorbeeld'
TRIM(str) Spaties trimmen TRIM(' voorbeeld ')'voorbeeld'
REPLACE(str,van,naar) Deel vervangen REPLACE('voor-beeld','-','')'voorbeeld'
INSTR(str,sub) Positie van substring INSTR('voorbeeld','oor')2
LEFT(str,n) n tekens vanaf begin LEFT('voorbeeld',4)'voor'
RIGHT(str,n) n tekens vanaf einde RIGHT('voorbeeld',4)'eld'
SELECT naam, LENGTH(naam) AS naam_lengte FROM studenten;
SELECT CONCAT(voornaam, ' ', achternaam) AS volledige_naam FROM studenten;
SELECT email FROM studenten WHERE email LIKE '%@example.com';
SELECT REPLACE(product_naam, '-', ' ') AS product_naam FROM producten;
SELECT LEFT(naam, 3) AS voorletters FROM studenten;
SELECT RIGHT(email, 10) AS domein    FROM studenten;

Afronden & Formatteren

Functie Output Afronding Gebruik
ROUND(n, d) Numeriek Ja Berekeningen
TRUNCATE(n, d) Numeriek Nee Financieel (exact afkappen)
FORMAT(n, d) String Ja Weergave in rapporten
SELECT ROUND(1234.56789, 2);             -- 1234.57
SELECT ROUND(AVG(Score), 1) AS AfgerondGemiddelde FROM Inschrijvingen;

SELECT TRUNCATE(1234.56789, 2);          -- 1234.56
SELECT TRUNCATE(SUM(Bedrag), 0) AS TotBedrag FROM Facturen;

SELECT FORMAT(1234.56789, 2);            -- '1,234.57' (string!)
SELECT FORMAT(SUM(Prijs), 2) AS TotaalBedrag FROM Aankopen;

Subqueries

-- In WHERE met IN
SELECT Naam FROM Studenten
WHERE ID NOT IN (
    SELECT StudentID FROM Inschrijvingen
);

-- In WHERE met EXISTS
SELECT v.Naam FROM Vakken v
WHERE EXISTS (
    SELECT 1 FROM Inschrijvingen i
    WHERE i.VakID = v.ID AND i.Score > 90
);

-- Gecorreleerde subquery: student met hoogste IQ per klas
SELECT s.Naam, k.Naam AS Klas, s.IQ
FROM Studenten s
JOIN Klassen k ON s.KlasID = k.ID
WHERE s.IQ = (
    SELECT MAX(s2.IQ) FROM Studenten s2
    WHERE s2.KlasID = s.KlasID
);

-- HAVING met subquery: vakken onder het algemeen gemiddelde
SELECT v.Naam, AVG(i.Score) AS GemiddeldeScore
FROM Vakken v
JOIN Inschrijvingen i ON v.ID = i.VakID
GROUP BY v.ID
HAVING AVG(i.Score) < (
    SELECT AVG(Score) FROM Inschrijvingen
);

-- SELECT in SELECT: hoogste IQ in de klas met de meeste studenten
SELECT Naam, IQ
FROM Studenten
WHERE KlasID = (
    SELECT KlasID FROM Studenten
    GROUP BY KlasID
    ORDER BY COUNT(*) DESC
    LIMIT 1
)
AND IQ = (
    SELECT MAX(IQ) FROM Studenten
    WHERE KlasID = (
        SELECT KlasID FROM Studenten
        GROUP BY KlasID
        ORDER BY COUNT(*) DESC
        LIMIT 1
    )
);

Relaties

Type Omschrijving
Primary Key Unieke identifier voor een rij
Foreign Key Verwijzing naar een kolom in een andere tabel
Many-to-Many Tussentabel met Foreign Keys naar beide tabellen