MySQL Cheatsheet
Johan Beysen — AP Hogeschool
Tips
Lees dit voor je begint
- Altijd type opgeven —
NOT 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;
| 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 |