Skip to content

DDL — Data Definition Language

1. SQL Overzicht

Categorie Statements Doel
DDL CREATE, ALTER, DROP Structuur van database-objecten
DQL SELECT Data opvragen
DML INSERT, UPDATE, DELETE Data manipuleren
DCL GRANT, REVOKE Rechten beheren

2. Tabellen Aanmaken

Schema & dbo

  • Schema = namespace voor database-objecten
  • dbo = default schema (database owner)
  • Notatie: schema.tabel bv. dbo.Customers

Tijdelijke tabellen

Type Syntax Zichtbaar voor
Lokaal #tabelnaam Huidige sessie
Globaal ##tabelnaam Alle sessies

Object Explorer → database → Tables → rechtermuisklik → New Table

USE ClassicModels;
GO

CREATE TABLE dbo.Customers (
    customerNumber INT           NOT NULL,
    customerName   VARCHAR(50)   NOT NULL,
    contactName    VARCHAR(50)   NOT NULL,
    city           VARCHAR(50),
    country        VARCHAR(50),
    creditLimit    DECIMAL(10,2)
);
GO

3. Tabellen Wijzigen

Object Explorer → tabel → rechtermuisklik → Design

-- Kolom toevoegen
ALTER TABLE dbo.Customers
ADD postalCode VARCHAR(15);

-- Kolom wijzigen (datatype/lengte)
ALTER TABLE dbo.Customers
ALTER COLUMN customerName VARCHAR(100) NOT NULL;

-- Kolom verwijderen
ALTER TABLE dbo.Customers
DROP COLUMN postalCode;

4. Tabellen Verwijderen

DROP TABLE dbo.Customers;

Warning

Een tabel verwijderen met een FK-constraint geeft een fout. Verwijder eerst de child table of de constraint.


5. Tabel Info Opvragen

-- Overzicht kolommen, constraints, keys
EXEC sp_help 'dbo.Customers';

-- Overzicht indexen
EXEC sp_helpindex 'dbo.Customers';

Via SSMS: rechtermuisklik op tabel → Script Table asCREATE To


6. Data Types

Type Omschrijving
CHAR(n) Vaste lengte tekst — ongebruikte ruimte wordt gevuld met spaties
VARCHAR(n) Variabele lengte tekst — max n karakters
TEXT Lange tekst
TINYINT 0 – 255
SMALLINT -32,768 – 32,767
INT -2,147,483,648 – 2,147,483,647
BIGINT Zeer groot geheel getal
DECIMAL(p,s) Decimaal getal — p = totaal cijfers, s = na komma
DATE Datum (YYYY-MM-DD)
DATETIME Datum + tijd
TIMESTAMP Automatisch tijdstempel

Eigen datatypes aanmaken

-- Eigen type gebaseerd op bestaand type
CREATE TYPE PostalCode FROM VARCHAR(10) NOT NULL;

7. NULL Waarden

  • NULL = onbekend — niet hetzelfde als 0 of lege string
  • NULL + 1 = NULL — elke berekening met NULL geeft NULL
  • NULL = NULL is FALSE — gebruik altijd IS NULL
-- Zoeken op NULL
SELECT * FROM customers WHERE creditLimit IS NULL;

-- NULL vervangen door een standaardwaarde
SELECT customerName, COALESCE(creditLimit, 0) AS creditLimit
FROM customers;

8. Data Integriteit

Type Omschrijving
Declaratief Constraints (PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL)
Procedureel Triggers — code die automatisch uitvoert bij INSERT/UPDATE/DELETE

9. Declarative Integrity Constraints

Primary Key

  • Identificeert elk record uniek via 1 of meerdere kolommen
  • Enkel unieke, niet-NULL waarden
  • Elke tabel heeft max. 1 primary key
-- Inline
CREATE TABLE Persons (
    ID        INT          NOT NULL PRIMARY KEY,
    LastName  VARCHAR(255) NOT NULL,
    FirstName VARCHAR(255),
    Age       INT
);

-- Als named constraint
CREATE TABLE Person (
    ID        INT          NOT NULL,
    LastName  VARCHAR(255) NOT NULL,
    FirstName VARCHAR(255),
    Age       INT,
    CONSTRAINT PK_Person PRIMARY KEY (ID)
);

Unique Constraint

  • Vergelijkbaar met PK maar meerdere per tabel mogelijk
  • NULL-waarden zijn wel toegestaan (in tegenstelling tot PK)
-- Inline
CREATE TABLE Persons (
    ID       INT          NOT NULL UNIQUE,
    LastName VARCHAR(255) NOT NULL
);

-- Als named constraint
CREATE TABLE Persons (
    ID       INT NOT NULL,
    LastName VARCHAR(255) NOT NULL,
    CONSTRAINT UC_Person UNIQUE (ID)
);

Check Constraint

  • Beperkt de mogelijke waarden — record wordt niet toegevoegd als niet voldaan
-- Enkelvoudig
CREATE TABLE Persons (
    Age INT CHECK (Age >= 18)
);

-- Meervoudig als named constraint
CREATE TABLE Persons (
    Age  INT,
    City VARCHAR(255),
    CONSTRAINT CHK_Person CHECK (Age >= 18 AND City = 'Antwerp')
);

Foreign Key

  • Verwijst naar de PK van een andere tabel
  • Tabel met FK = child table
  • Tabel met de PK = parent table / referenced table
-- Inline
CREATE TABLE Orders (
    OrderID     INT NOT NULL PRIMARY KEY,
    OrderNumber INT NOT NULL,
    PersonID    INT FOREIGN KEY REFERENCES Persons(PersonID)
);

-- Als named constraint
CREATE TABLE Orders (
    OrderID     INT NOT NULL,
    OrderNumber INT NOT NULL,
    PersonID    INT,
    PRIMARY KEY (OrderID),
    CONSTRAINT FK_PersonOrder FOREIGN KEY REFERENCES Persons(PersonID)
);

Referentiële Integriteit

Bij INSERT of UPDATE met FK die niet bestaat → foutmelding:

UPDATE statement conflicted with COLUMN FOREIGN KEY constraint 'FKemployee'.
The conflict occurred in database 'sample', table 'employee', column 'dept_no'.

4 opties voor gedrag bij wijziging/verwijdering in parent table:

Optie Gedrag
NO ACTION Enkel wijzigingen in parent table die geen invloed hebben op child — anders fout
CASCADE Wijziging/verwijdering in parent table → automatisch doorgevoerd in child table
SET NULL Wijziging/verwijdering in parent → FK in child wordt NULL gezet
SET DEFAULT Wijziging/verwijdering in parent → FK in child wordt op default waarde gezet
CONSTRAINT FK_PersonOrder
    FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
    ON DELETE CASCADE
    ON UPDATE SET NULL

10. Hernoemen van Database Objecten

USE ClassicModels;
GO

-- Tabel hernoemen
EXEC sp_rename @objname = 'Offices', @newname = 'Department';

-- Kolom hernoemen
EXEC sp_rename @objname = 'Employees.jobTitle', @newname = 'title';

Werkt ook voor: database, view, stored procedure.