In informatica il Data Definition Language (DDL) è un linguaggio, parte del linguaggio SQL, che permette di creare, modificare o eliminare gli oggetti in un database ovvero agire sullo schema di database. Sono i comandi DDL a definire la struttura del database e quindi l'organizzazione logica dei dati in esso contenuti, ma non fornisce gli strumenti per modificare i valori assunti dai dati o per interrogare i dati stessi per il quale si usano rispettivamente il Data Manipulation Language e il Data Query Language. È utilizzato sia in fase di progettazione, sia in fase di ristrutturazione del database. Per agire sulla struttura del database l'utente deve avere i permessi necessari, assegnati tramite il Data Control Language (DCL).
Oltre ai tipi come integer, char, float, ... possiamo crearne altri: la creazione è simile ad una ridenominazione di un tipo fondamentale visto tra quelli sopra o di un tipo creato ex novo, ereditandone tutte le caratteristiche.
CREATE DOMAIN nome_dominio AS tipo [ ValoreImpostato ] [ Vincolo ] { DefSchema }
Si crea un tipo di nome nome_dominio partendo da un precedente tipo, impostando un opzionale valore di default ed un insieme di vincoli. Questa operazione permette di definire una ed una sola volta tutte le caratteristiche (vincoli) che possono essere associati ad un attributo, quando questo è utilizzato in più tabelle, evitando così ridondanze.
Elimina un dominio definito dall'utente.
DROP DOMAIN nome_dominio [CASCADE|RESTRICT]
Se si specifica CASCADE, tutte le colonne delle tabelle che appartengono a tale dominio verranno cancellate con esso. Se si specifica RESTRICT, che è il valore predefinito, questa operazione non verrà eseguita.
CASCADE
RESTRICT
Lo schema è una collezione di tutti gli oggetti che faranno parte della base di dati, cioè domini, tabelle, viste, privilegi, asserzioni. È un po' come la parte dichiarativa di un programma scritto con un linguaggio imperativo: prima creiamo i tipi, le funzioni e le procedure, poi le utilizziamo nel corpo.
CREATE SCHEMA [ NomeSchema ] [ [ autorization ] Autorizzazione ] { DefElementoSchema }
Autorizzazione è il nome dell'utente proprietario dello schema; se mancante si assume che sia l'utente che ha lanciato il comando. Il NomeSchema può essere omesso: in tal caso il nome sarà quello dell'utente proprietario. Per ogni utente ci sono delle Autorizzazioni cioè possiamo imporre certi limiti a chi interroga la nostra base di dati.
Cancella uno schema già definito.
DROP SCHEMA nome_schema [CASCADE|RESTRICT]
Se si specifica CASCADE, tutti gli oggetti che fanno parte dello schema verranno cancellati. Se si specifica RESTRICT, che è il valore predefinito, gli oggetti che fanno parte dello schema verranno preservati.
Il comando CREATE DATABASE serve a creare un nuovo database, che potrà contenere tabelle, viste, stored procedure, trigger o altri tipi di oggetti.
CREATE DATABASE
La sintassi è la seguente:
CREATE {DATABASE | SCHEMA} nome_database [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
Se nell'esecuzione del comando si specifica [IF NOT EXISTS] si crea il database solo se non esiste, in caso contrario non verrà restituito alcun errore. La stringa create_specification permette di inserire delle opzioni nella creazione del database. Tramite CHARACTER SET si inserisce il set di caratteri supportato nel database. Tramite COLLATE si possono definire i dati di default del database.
[IF NOT EXISTS]
CHARACTER SET
COLLATE
Il comando ALTER DATABASE serve a modificare un database esistente. Non esiste nello standard SQL, ma la maggior parte dei DBMS lo implementa.
ALTER DATABASE
ALTER {DATABASE | SCHEMA} [nome_database] [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
Il comando DROP DATABASE serve a cancellare un database. Tale comando non esiste nello standard SQL, ma tutti i DBMS lo implementano.
DROP DATABASE
DROP DATABASE nome_database
Il comando CREATE TABLE ha la funzione di creare una nuova tabella (o tavola). Il nome della tabella può essere scritto indifferentemente in MAIUSCOLO o in minuscolo, in ogni caso, però, è necessario che rispetti le seguenti regole:
CREATE TABLE
Oltre a definire gli attributi di una tabella è possibile definire dei vincoli. La tabella può essere creata vuota (vedi la create table semplice) oppure può essere creata e riempita di dati (vedi la create table mediante select): nel secondo caso la struttura della tabella è definita implicitamente dal numero di colonne (o campi) estratti dalla select, dal tipo di dato di ciascuna colonna e dai nomi delle rispettive colonne estratte dalla select (o dagli alias ad esse applicati). Nel caso in cui la tabella venga popolata in fase di creazione, la transazione viene automaticamente conclusa da un comando di commit.
Per implementare i vincoli di integrità con l'SQL esistono delle parole riservate.
NOT NULL
UNIQUE
PRIMARY KEY
Per la gestione di questo tipo di vincoli si utilizza la FOREIGN KEY (ovvero chiave esterna). Questo vincolo crea un legame tra i valori di un attributo della tabella corrente e i valori di un attributo di un'altra tabella che è in relazione alla tabella corrente stessa. Il vincolo impone che per ogni riga della tabella il valore dell'attributo specificato se diverso dal valore nullo sia presente nelle righe della tabella esterna tra i valori corrispondenti dell'attributo.
FOREIGN KEY
CONSTRAINT
CREATE TABLE nome_tabella( nome_colonna1 tipo di dato CONSTRAINT, nome_colonna2 tipo di dato CONSTRAINT, nome_colonna3 tipo di dato CONSTRAINT, ... nome_colonnaN tipo di dato CONSTRAINT);
CREATE TABLE nome_tabella AS SELECT...;
ALTER TABLE
ADD
MODIFY
DROP
ALTER TABLE nome_tabella ADD nome_colonna_nuova tipo_di_dato CONSTRAINT;
ALTER TABLE nome_tabella ADD CONSTRAINT nome_tabella_pk PRIMARY KEY (nome_colonna)); /*che funge da chiave primaria*/
ALTER TABLE nome_tabella ADD CONSTRAINT nome_tabella_pk ADD INDEX nome_indice (nome_colonna)
ALTER TABLE nome_tabella_figlia ADD CONSTRAINT nome_tabella_figlia_fk FOREIGN KEY (nome_colonna) /*che funge da chiave esterna sulla tabella figlia*/ REFERENCES nome_tabella_padre (nome_colonna)); /*che funge da chiave primaria sulla tabella padre*/
ALTER TABLE nome_tabella MODIFY nome_colonna tipo di dato nuovo; /*il tipo di dato nuovo deve essere compatibile*/
ALTER TABLE nome_tabella MODIFY nome_colonna CONSTRAINT nuova;
ALTER TABLE nome_tabella DROP PRIMARY KEY;
ALTER TABLE nome_tabella_figlia DROP CONSTRAINT nome_tabella_figlia_fk;
Il comando DROP TABLE consente di distruggere una tabella, eliminandola fisicamente dal database. Come tutti i comandi DDL è un'operazione irreversibile, e provoca la perdita di tutti i dati contenuti nella tabella.
DROP TABLE
DROP TABLE nome_tabella [CASCADE|RESTRICT]
Il comando RENAME consente di rinominare i nomi degli attributi di una tabella. Nello standard SQL non esiste, ma molti Dbms lo implementano ad esempio postgres.
RENAME
RENAME nome_tabella TO nuovo_nome_tabella;
È una scorciatoia per evitare alter table complessi. Aggiunge un indice a una tabella.
CREATE [UNIQUE] INDEX nome_indice ON nome_tabella (nome_colonna [ASC|DESC])
Se si specifica UNIQUE, l'indice è unico, cioè i valori al suo interno non possono essere duplicati. Se si specifica ASC i valori all'interno dell'indice saranno in ordine ascendente, se si specifica DESC saranno in ordine discendente; il valore predefinito è il primo.
ASC
DESC
È una scorciatoia per evitare alter table complessi. Elimina un indice da una tabella.
DROP INDEX nome_indice ON nome_tabella