Data Definition Language: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti.
 
(80 versioni intermedie di 52 utenti non mostrate)
Riga 1:
{{F|linguaggi di programmazione|ottobre 2012}}
'''DDL''' è l'acronimo inglese di '''D'''ata '''D'''efinition '''L'''anguage, ovvero un linguaggio che permette di creare, modificare o eliminare gli oggetti in un database.
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 [[query language|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).
Il linguaggio DDL compone una parte del linguaggio [[SQL]].
Sono i comandi DDL a definire la struttura del database e quindi dei dati ivi contenuti. Ma non fornisce gli strumenti per modificare i dati stessi: per tale scopo di usa il [[DML]]. L'utente deve avere i permessi necessari per agire sulla struttura del database e questi permessi vengono assegnati tramite il [[DCL]].
 
=== CreateDomini ___domain===
=== Create Domain ===
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.
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.
 
==== Sintassi del comando createCreate Domain ___domain====
<syntaxhighlight lang="sql">
create ___domain NomeDominio as Tipo [ ValoreImpostato ] [ Vincolo ] { DefSchema }
CREATE DOMAIN nome_dominio AS tipo [ ValoreImpostato ] [ Vincolo ] { DefSchema }
</syntaxhighlight>
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.
 
=== Drop Domain ===
Si crea un tipo di nome " NomeDominio " 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.
 
==== Sintassi del comando Drop Domain ====
<syntaxhighlight lang="sql">
DROP DOMAIN nome_dominio [CASCADE|RESTRICT]
</syntaxhighlight>
Se si specifica {{code|CASCADE}}, tutte le colonne delle tabelle che appartengono a tale dominio verranno cancellate con esso. Se si specifica {{code|RESTRICT}}, che è il valore predefinito, questa operazione non verrà eseguita.
 
===Create schema=Schemi ==
=== Create schema ===
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.
 
==== Sintassi del comando create schema ====
Lo schema è una collezione di tutti gli oggetti che faranno parte della base di dati, cioè domini, tabelle, viste, privilegi, asserzioni.E' 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.
<syntaxhighlight lang="sql">
CREATE SCHEMA [ NomeSchema ] [ [ autorization ] Autorizzazione ] { DefElementoSchema }
</syntaxhighlight>
''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]].
 
====Sintassi delDrop comandoSchema create schema====
Cancella uno schema già definito.
create schema [ NomeSchema ] [ [ autorization ] Autorizzazione ] { DefElementoSchema }
 
==== Sintassi del comando Drop Schema ====
Autorizzazione è il nome dell' utente propietario 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 propietario.Per ogni utente ci sono delle Autorizzazioni cioè possiamo imporre certi limiti a chi interroga la nostra [[Base di dati]].
<syntaxhighlight lang="sql">
DROP SCHEMA nome_schema [CASCADE|RESTRICT]
</syntaxhighlight>
Se si specifica {{code|CASCADE}}, tutti gli oggetti che fanno parte dello schema verranno cancellati. Se si specifica {{code|RESTRICT}}, che è il valore predefinito, gli oggetti che fanno parte dello schema verranno preservati.
 
===Create database=Database ==
=== Create database ===
Il comando ''create database'' serve a creare un nuovo database, che potrà contenere tabelle, viste, stored procedure, trigger o altri tipi di oggetti.
Il comando {{code|CREATE DATABASE}} serve a creare un nuovo database, che potrà contenere tabelle, viste, [[stored procedure]], trigger o altri tipi di oggetti.
 
==== Sintassi del comando create database ====
La [[sintassi]] è la seguente:
<syntaxhighlight lang="sql">
 
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_namenome_database
[create_specification [, create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
| [DEFAULT] COLLATE collation_name
</syntaxhighlight>
Se nell'esecuzione del comando si specifica {{code|[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 {{code|CHARACTER SET}} si inserisce il set di caratteri supportato nel database. Tramite {{code|COLLATE}} si possono definire i dati di default del database.
 
=== Alter database ===
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.
Il comando {{code|ALTER DATABASE}} serve a modificare un database esistente. Non esiste nello standard SQL, ma la maggior parte dei DBMS lo implementa.
 
===Alter= Sintassi del comando alter database ====
La sintassi è la seguente:
Il comando ''alter database'' serve a modificare un database esistente.
<syntaxhighlight lang="sql">
ALTER {DATABASE | SCHEMA} [nome_database]
====Sintassi del comando alter database====
[DEFAULT] CHARACTER SET charset_name
La sintassi è la seguente:
| [DEFAULT] COLLATE collation_name
</syntaxhighlight>
 
=== Drop database ===
ALTER {DATABASE | SCHEMA} [db_name]
Il comando {{code|DROP DATABASE}} serve a cancellare un database. Tale comando non esiste nello standard SQL, ma tutti i DBMS lo implementano.
COLLATE collation_name
 
===Drop= Sintassi del comando drop database ====
Il comando ''drop database'' serve a cancellare un database.
 
====Sintassi del comando drop database====
La sintassi è la seguente:
<syntaxhighlight lang="sql">
DROP DATABASE nome_database
DROP DATABASE nome_database
</syntaxhighlight>
 
===Create table=Tabelle ==
=== Create table ===
Il comando ''create table'' ha la funzione di creare una nuova [[tabella (Database)|tabella]] (o tavola).
Il comando {{code|CREATE TABLE}} ha la funzione di creare una nuova [[tabella (basi di dati)|tabella]] (o tavola).
<br>
<br />
Il nome della tabella può essere scritto indifferentemente in MAIUSCOLO o in minuscolo, in ogni caso, però, è necessario che rispetti le seguenti regole:
#* Può essere formato da lettere e numeri, ma il primo carattere deve sempre essere una lettera;
#* Non può superare i 30 caratteri di lunghezza;
#* Non può avere lo stesso nome di una tabella o [[vista (Databasebasi di dati)|vista]] già esistente sullo stesso [[utente (databasebasi di dati)|utente]] di database.
Oltre a definire gli attributi di una tabella è possibile definire dei vincoli.
<br />
La tabella può essere creata vuota (vedi la create table semplice) oppure può essere creata e riempita di dati (vedi la create table mediante [[SQL#Select|select]]): nel secondo caso la struttura della tabella è definita implicitamente dal numero di [[colonna (Databasebasi di dati)|colonne]] (o campi) estratti dalla select, dal [[tipo di dato (Databasebasi di dati)|tipo di dato]] di ciascuna colonna e dai nomi delle rispettive colonne estratte dalla select (o dagli [[alias (Databasebasi di dati)|alias]] ad esse applicati).
Nel caso in cui la tabella venga popolata in fase di creazione, la [[DMLSQL#laLa transazione|transazione]] viene automaticamente conclusa da un comando di [[DMLSQL#Commit|COMMITcommit]].
 
==== Vincoli d'integrità ====
ImplementarePer iimplementare i [[Vincolivincoli di integrità]] con l'[[SQL]] esistono delle parole riservate.
 
===== Vincoli Intrarelazionaliintrarelazionali =====
* Not{{code|NOT NullNULL}}: Il vincolo not null inidicaindica che il valore nullo non è ammesso come valore dell'attributo; in tal caso l'attributo deve sempre essere specificato tipicamente in fase di inserimento. Se all'attributo è però associato un valore di default diverso dal valore nullo, allora diventa possibile effettuare l'inserimento anche senza fornire un valore dell'attributo, in quanto all'attributo viene automaticamente assegnato il valore di default.
* Unique{{code|UNIQUE}}: Un vincolo unique si applica ad un attributo o un insieme di attributi di una tabella e impone che i valori dell'attributo (o le ennuple di valori sull'insieme di attributi) siano una (super) chiave, cioè righe differenti della tabella non possano comparire su diverse righe senza violare il vincolo in quanto si assume che i valori nulli siano tutti diversi tra loro.
* Primary{{code|PRIMARY KeyKEY}}: Nella definizione di una tabella è necessario specificare per ogni relazione la [[chiave primaria]], il più importante tra gli identificatori della relazione. [[SQL]] permette così di specificare il vincolo primary key una sola volta per ogni tabella. Il vincolo primary key può essere definito direttamente su un singolo attributo, oppure essere definito elencando più attributi che costituiscono l'identificatore.
=====Vincoli Interrazionali=====
Per la gestione di questo tipo di vincoli si utilizza il foreign key (ovvero chiave esterna).
Questo vincolo crea un legame tra i valori di un attributo della tabella corrente e i volaro di un attributi di un'altra tabella che in relazione. Il vincolo impone che per ogni riga della tabella il balore dell'attributo specificato se diverso dal valore nullo si a presente delle righe della tabella esterna tra i valori corrispondenti dell'attributo.
 
====Sintassi= delVincoli comandointerrelazionali create table=====
Per la gestione di questo tipo di vincoli si utilizza la {{code|FOREIGN KEY}} (ovvero [[chiave esterna]]).
* Create table semplice:
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.
CREATE TABLE ''nome_tabella''(<br>
''nome_colonna1'' ''tipo di dato'' ''[[constraint (Database)|constraint]]'' (opzionale),
''nome_colonna2'' ''tipo di dato'' ''constraint'' (opzionale),
''nome_colonna3'' ''tipo di dato'' ''constraint'' (opzionale),
...
''nome_colonnaN'' ''tipo di dato'' ''constraint'' (opzionale) );
 
==== Sintassi del comando create table ====
* Create table mediante select:
* Creazione semplice (l'aggiunta di una {{code|CONSTRAINT}} è opzionale):
CREATE TABLE ''nome_tabella'' <br>
<syntaxhighlight lang="sql">
AS <br>
CREATE TABLE nome_tabella(
SELECT ...;
nome_colonna1 tipo di dato CONSTRAINT,
nome_colonna2 tipo di dato CONSTRAINT,
nome_colonna3 tipo di dato CONSTRAINT,
...
nome_colonnaN tipo di dato CONSTRAINT);
</syntaxhighlight>
* Creazione mediante select:
<syntaxhighlight lang="sql">
CREATE TABLE nome_tabella
AS
SELECT...;
</syntaxhighlight>
 
=== Alter table ===
* Il comando ''alter{{code|ALTER table''TABLE}} ha la funzione di modificare la struttura della tabella.
* L'operatore {{code|ADD}} consente di inserire una nuova colonna su una tabella esistente oppure di aggiungere delle constraint alle colonne della tabella.
<br>
* L'operatore ''ADD''{{code|MODIFY}} consente di inserirecambiare unail nuovatipo colonnadi sudato unae/o tabellala esistenteconstraint oppurepropri di aggiungereogni dellecolonna constraintdi alle colonne dellauna tabella.
* L'operatore {{code|DROP}} consente di eliminare la constraint dalla colonna.
<br>
L'operatore ''MODIFY'' consente di cambiare il tipo di dato e/o la constraint propri di ogni colonna di una tabella.
<br>
L'operatore ''DROP'' consente di eliminare la constraint dalla colonna.
 
==== Sintassi del comando alter table ====
===== Operatore add =====
* Inserimento di una nuova colonna:
<syntaxhighlight lang="sql">
ALTER TABLE ''nome_tabella'' <br>
ALTER TABLE nome_tabella
ADD ''nome_colonna_nuova tipo di dato constraint'';
ADD nome_colonna_nuova tipo_di_dato CONSTRAINT;
</syntaxhighlight>
* Aggiunta di una chiave primaria (primary key):
<syntaxhighlight lang="sql">
ALTER TABLE ''nome_tabella'' <br>
ALTER TABLE nome_tabella
ADD CONSTRAINT ''nome_tabella_pk''
ADD CONSTRAINT nome_tabella_pk
PRIMARY KEY (''nome_colonna'' che funge da chiave primaria);
PRIMARY KEY (nome_colonna)); /*che funge da chiave primaria*/
</syntaxhighlight>
* Aggiunta di un indice:
<syntaxhighlight lang="sql">
ALTER TABLE nome_tabella
ADD CONSTRAINT nome_tabella_pk
ADD INDEX nome_indice (nome_colonna)
</syntaxhighlight>
* Aggiunta di una chiave esterna (foreign key) ereditata da un'altra tabella:
<syntaxhighlight lang="sql">
ALTER TABLE ''nome_tabella_figlia'' <br>
ALTER TABLE nome_tabella_figlia
ADD CONSTRAINT ''nome_tabella_figlia_fk''
ADD CONSTRAINT nome_tabella_figlia_fk
FOREIGN KEY (''nome_colonna'' che funge da chiave esterna sulla tabella figlia)
REFERENCESFOREIGN ''nome_tabella_padre''KEY (''nome_colonna'') /*che funge da chiave primariaesterna sulla tabella padre);figlia*/
REFERENCES nome_tabella_padre (nome_colonna)); /*che funge da chiave primaria sulla tabella padre*/
=====Operatore modify=====
</syntaxhighlight>
 
===== Operatore modify =====
* Modifica del tipo di dato di una colonna:
<syntaxhighlight lang="sql">
ALTER TABLE ''nome_tabella'' <br>
ALTER TABLE nome_tabella
MODIFY ''nome_colonna tipo di dato nuovo'';
MODIFY nome_colonna tipo di dato nuovo; /*il tipo di dato nuovo deve essere compatibile*/
</syntaxhighlight>
* Modifica della constraint di una colonna:
<syntaxhighlight lang="sql">
ALTER TABLE ''nome_tabella'' <br>
ALTER TABLE nome_tabella
MODIFY ''nome_colonna constraint nuova'';
MODIFY nome_colonna CONSTRAINT nuova;
=====Operatore drop=====
</syntaxhighlight>
 
===== Operatore drop =====
* Eliminazione della chiave primaria:
<syntaxhighlight lang="sql">
ALTER TABLE ''nome_tabella'' <br>
ALTER TABLE nome_tabella
DROP PRIMARY KEY;
</syntaxhighlight>
* Eliminazione della chiave esterna:
<syntaxhighlight lang="sql">
ALTER TABLE ''nome_tabella_figlia'' <br>
ALTER TABLE nome_tabella_figlia
DROP CONSTRAINT ''nome_tabella_figlia_fk'';
DROP CONSTRAINT nome_tabella_figlia_fk;
</syntaxhighlight>
 
=== Drop table ===
Il comando {{code|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.
 
==== Sintassi del comando Drop table ====
<syntaxhighlight lang="sql">
DROP TABLE nome_tabella [CASCADE|RESTRICT]
</syntaxhighlight>
 
=== Rename ===
Il comando {{code|RENAME}} consente di rinominare i nomi degli attributi di una tabella. Nello standard SQL non esiste, ma molti Dbms lo implementano ad esempio postgres.
 
==== Sintassi del comando Rename ====
<syntaxhighlight lang="sql">
RENAME nome_tabella TO nuovo_nome_tabella;
</syntaxhighlight>
 
== Indici ==
=== Create Index ===
È una scorciatoia per evitare alter table complessi. Aggiunge un indice a una tabella.
 
==== Sintassi del comando Create Index ====
===Drop table===
<syntaxhighlight lang="sql">
Il comando ''drop table'' consente di distruggere una tabella, eliminandola fisicamente dal database.
CREATE [UNIQUE] INDEX nome_indice
<br>
ON nome_tabella (nome_colonna [ASC|DESC])
Come tutti i comandi DDL è un'operazione irreversibile, e provoca la perdita di tutti i dati contenuti nella tabellla.
</syntaxhighlight>
Se si specifica {{code|UNIQUE}}, l'indice è unico, cioè i valori al suo interno non possono essere duplicati.<br />
Se si specifica {{code|ASC}} i valori all'interno dell'indice saranno in ordine ascendente, se si specifica {{code|DESC}} saranno in ordine discendente; il valore predefinito è il primo.
 
====Sintassi delDrop comandoIndex alter table====
È una scorciatoia per evitare alter table complessi. Elimina un indice da una tabella.
DROP TABLE ''nome_tabella'';
 
==== Sintassi del comando Drop index ====
===Rename===
<syntaxhighlight lang="sql">
Il comando ''rename'' consente di rinominare una tabella.
DROP INDEX nome_indice
ON nome_tabella
</syntaxhighlight>
 
== Strumenti per la gestione ==
====Sintassi del comando rename====
* PL/SQL Developer - Distribuito da AllRoundAutomations
RENAME ''nome_tabella'' TO ''nuovo_nome_tabella'';
* SQL Server Management Studio - Distribuito da Microsoft
* SQL Manager Studio - Distribuito da Stevtech
 
== Voci correlate ==
* [[SQL]]
* [[Data Manipulation Language]] (DML)
* [[Data Control Language]] (DCL)
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC}}
 
{{Portale|Informatica}}
[[Categoria:Acronimi]]
[[Categoria:Database]]
[[Categoria:Linguaggi di programmazione]]
 
[[Categoria:SQL]]
[[de:Data Definition Language]]
[[en:Data Definition Language]]
[[fr:Langage de définition de donnée]]