DML — Data Manipulation Language
1. INSERT
-- Basis
INSERT INTO tabel (kolom1, kolom2, ...)
VALUES (waarde1, waarde2, ...);
-- Voorbeeld
INSERT INTO payments (customerNumber, checkNumber, paymentDate, amount)
VALUES (103, 'HQ336336', '2021-10-19', 6066.78);
INSERT SELECT
INSERT INTO #belgischeKlanten (customerName, city)
SELECT customerName, city
FROM customers
WHERE country = 'Belgium';
2. UPDATE
UPDATE met JOIN
UPDATE e
SET e.salary = e.salary * 1.1
FROM employee e
JOIN department d ON d.id = e.dep_id
WHERE d.dep_name = 'Sales';
3. DELETE
-- Specifieke rij
DELETE FROM customers WHERE customerNumber = 103;
-- Alle rijen
DELETE FROM customers;
Danger
DELETE FROM tabel zonder WHERE verwijdert alle rijen.
4. T-SQL Functies
| Functie | Omschrijving |
|---|---|
CONCAT('hallo', 'tokio') |
Strings samenvoegen |
SUBSTR('12345', 2, 3) → '234' |
Deel van string opvragen |
COALESCE(NULL, NULL, 'a', 'b') → 'a' |
Eerste niet-NULL waarde |
GETDATE() |
Huidige datum en uur |
COUNT(*) |
Aantal records |
SUM() |
Som |
AVG() |
Gemiddelde |
5. Nuttige Operatoren
| Operator | Omschrijving |
|---|---|
= < > <> >= <= |
Vergelijken |
LIKE '%hallo%' |
% = 0+ tekens, _ = 1 teken |
IS NULL |
Nooit = NULL gebruiken |
AND / OR / NOT |
Logische operatoren |
IN (a, b, c) |
Is één van deze waarden |
6. Session Variabelen
DECLARE @variabele datatype;
SET @variabele = waarde;
-- of via SELECT
SELECT @variabele = kolom FROM tabel;
SELECT @variabele;
USE ClassicModels;
GO
DECLARE @numberCustomers INT;
SELECT @numberCustomers = COUNT(customerName) FROM Customers;
SELECT @numberCustomers;
DECLARE @numberEmployees INT = 0;
SET @numberEmployees = (SELECT COUNT(*) FROM Employees);
SELECT @numberEmployees;
7. IF – ELSE
IF (@num1 > @num2)
PRINT '1ste getal is groter.'
ELSE IF (@num2 > @num1)
PRINT '2e getal is groter.'
ELSE
PRINT 'De getallen zijn gelijk.';
Geneste IF – ELSE
IF (@num1 > @num2)
BEGIN
PRINT '1ste getal is groter.';
IF (@num1 > 75)
PRINT '1ste getal is groter dan 75.';
ELSE IF (@num1 > 50)
PRINT '1ste getal is groter dan 50.';
ELSE
PRINT '1ste getal is kleiner dan of gelijk aan 50.';
END
ELSE IF (@num2 > @num1)
PRINT '2e getal is groter.'
ELSE
PRINT 'De getallen zijn gelijk.';
8. CASE Statement
Retourneert een waarde obv een voorwaarde. Bruikbaar in SELECT, WHERE, ORDER BY, GROUP BY, UPDATE en INSERT.
SELECT CASE
WHEN Salary >= 80000 AND Salary <= 100000 THEN 'Director'
WHEN Salary >= 50000 AND Salary < 80000 THEN 'Senior Consultant'
ELSE 'Medewerker'
END AS Functie,
MIN(Salary) AS 'Minimum Salaris',
MAX(Salary) AS 'Maximum Salaris'
FROM Employee
GROUP BY
CASE
WHEN Salary >= 80000 AND Salary <= 100000 THEN 'Director'
WHEN Salary >= 50000 AND Salary < 80000 THEN 'Senior Consultant'
ELSE 'Medewerker'
END;
9. WHILE Loop
SQL Server heeft één lusstructuur: de WHILE-lus.
BREAK en CONTINUE
| Keyword | Gedrag |
|---|---|
BREAK |
Verlaat de lus onmiddellijk |
CONTINUE |
Slaat resterende instructies over en gaat door met volgende iteratie |
Warning
CONTINUE kan een oneindige lus veroorzaken als de teller-update erna staat.
10. Transactions & Rollbacks
Wat is een transactie?
Een reeks SQL-instructies die als één geheel worden uitgevoerd — volledig geslaagd of volledig teruggedraaid.
Soorten transacties
| Type | Beschrijving |
|---|---|
| Autocommit | Standaard — elke instructie is een eigen transactie |
| Implicit | SQL Server start automatisch een transactie bij elke DML — afsluiten met COMMIT of ROLLBACK |
| Explicit | Jij bepaalt begin en einde |
Impliciete transactie
SET IMPLICIT_TRANSACTIONS ON;
-- ... instructies ...
COMMIT TRANSACTION; -- of ROLLBACK TRANSACTION
SELECT @@TRANCOUNT AS 'open transaction(s)';
Expliciete transactie
BEGIN TRANSACTION; -- of: BEGIN TRANSACTION updatePerson;
-- ... instructies ...
COMMIT TRANSACTION; -- of: ROLLBACK TRANSACTION;
Save Points
Deel van een transactie terugdraaien:
BEGIN TRANSACTION;
INSERT INTO [Person] VALUES ('Mouse', 'Micky', '500 South Buena Vista Street', 'California', 43);
SAVE TRANSACTION InsertStatement;
DELETE Person WHERE PersonId = 3;
ROLLBACK TRANSACTION InsertStatement; -- enkel DELETE ongedaan
COMMIT;
Auto Rollback
Als één instructie in een transactie een fout geeft → alle wijzigingen in die transactie worden teruggedraaid.
Marked Transacties
BEGIN TRAN DeletePerson WITH MARK 'MarkedTransactionDescription';
DELETE Person WHERE PersonID BETWEEN 3 AND 4;
COMMIT TRAN DeletePerson;
-- Raadplegen
USE [msdb];
SELECT * FROM msdb.dbo.logmarkhistory;
11. Cursors
Een cursor verwerkt query-resultaten rij per rij in plaats van als set.
Cursors zijn traag
Zolang een cursor open is, wordt de tabel vergrendeld voor andere gebruikers. Vervang cursors waar mogelijk door JOINs.
5 Stappen
-- 1. Declareren
DECLARE EmpCursor CURSOR FOR
SELECT id, name FROM employee;
-- 2. Openen
OPEN EmpCursor;
-- 3. Eerste rij ophalen
FETCH NEXT FROM EmpCursor INTO @EmpId, @EmpName;
-- 4. Verwerken
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT 'Employee Id = ' + CAST(@EmpId AS NVARCHAR(10)) + ' | Name = ' + @EmpName;
FETCH NEXT FROM EmpCursor INTO @EmpId, @EmpName;
END;
-- 5. Sluiten en vrijgeven
CLOSE EmpCursor;
DEALLOCATE EmpCursor;
@@FETCH_STATUS
| Waarde | Betekenis |
|---|---|
0 |
FETCH geslaagd |
-1 |
FETCH mislukt of rij buiten resultatenset |
-2 |
Opgehaalde rij ontbreekt |
-9 |
Cursor voert geen FETCH uit |