Skip to content

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 customers
SET    creditLimit = 10000
WHERE  customerNumber = 103;

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 EmployeeName,
       CASE
           WHEN Salary >= 80000 AND Salary <= 100000 THEN 'Director'
           WHEN Salary >= 50000 AND Salary <  80000  THEN 'Senior Consultant'
           ELSE 'Medewerker'
       END AS Functie
FROM Employee;
SELECT EmployeeName, Gender, Salary
FROM   Employee
ORDER BY
    CASE Gender WHEN 'F' THEN Salary END DESC,
    CASE WHEN Gender = 'M' THEN Salary END;
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;
UPDATE employee
SET StateCode = CASE StateCode
    WHEN 'Ar' THEN 'FL'
    WHEN 'GE' THEN 'AL'
    ELSE 'IN'
END;
INSERT INTO employee
VALUES (
    @EmployeeName,
    CASE @Gender WHEN 0 THEN 'M' WHEN 1 THEN 'F' END,
    @Statecode,
    @salary
);

9. WHILE Loop

SQL Server heeft één lusstructuur: de WHILE-lus.

WHILE {conditie}
BEGIN
    -- instructies
END;
DECLARE @i INT;
SET @i = 1;

WHILE @i <= 10
BEGIN
    PRINT CONCAT('Pass...', @i);
    SET @i = @i + 1;
END;

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

Cursor vervangen door JOIN

UPDATE employee
SET salary = CASE
    WHEN dep_name = 'Sales' THEN (salary * 1.1)
    WHEN dep_name = 'HR'    THEN (salary * 1.2)
    WHEN dep_name = 'IT'    THEN (salary * 1.5)
END
FROM   employee
INNER JOIN department ON department.id = employee.dep_id
WHERE  dep_name IN ('Sales', 'HR', 'IT');