Il linguaggio SQL: DDL

SQL: caratteristiche generali
  • SQL (Structured Query Language) è il linguaggio standard de facto per DBMS relazionali, che riunisce in sé funzionalità di DDL, DML e DCL
  • SQL è un linguaggio dichiarativo (non-procedurale), ovvero non specifica la sequenza di operazioni da compiere per ottenere il risultato
  • SQL è “relazionalmente completo”, nel senso che ogni espressione dell’algebra relazionale può essere tradotta in SQL

    …inoltre SQL fa molte altre cose…


    • Il modello dei dati di SQL è basato su tabelle anziché relazioni:
      • Possono essere presenti righe (tuple) duplicate
      • In alcuni casi l’ordine delle colonne (attributi) ha rilevanza
    • …il motivo è pragmatico (ossia legato a considerazioni sull’efficienza)
    • SQL adotta la logica a 3 valori introdotta con l’Algebra Relazionale
SQL: standard e dialetti
  • Il processo di standardizzazione di SQL è iniziato nel 1986
  • Nel 1992 è stato definito lo standard SQL-2 (o SQL-92) da parte dell’ISO (International Standards Organization), e dell’ANSI (American National Standards Institute), rispettivamente descritti nei documenti ISO/IEC 9075:1992 e ANSI X3.135-1992 (identici!)  
  • Del 1999 è lo standard SQL:1999, che rende SQL un linguaggio computazionalmente completo (e quindi con istruzioni di controllo!) per il supporto di oggetti persistenti…
  • Allo stato attuale ogni sistema ha ancora un suo dialetto:
    • supporta (in larga parte) SQL-2
    • ha già elementi di SQL:1999
    • ha anche costrutti non standard
  • Quello che vediamo è la parte più “diffusa”
Data Definition Language (DDL)
  • Il DDL di SQL permette di definire schemi di relazioni (o “table”, tabelle), modificarli ed eliminarli
  • Permette di inoltre di specificare vincoli, sia a livello di tupla (o “riga”) che a livello di tabella
  • Permette di definire nuovi domini, oltre a quelli predefiniti
    • Per vincoli e domini si può anche fare uso del DML (quindi inizialmente non si trattano completamente)
  • Inoltre si possono definire viste (“view”), ovvero tabelle virtuali, e indici, per accedere efficientemente ai dati (questi ultimi li vedremo in SI L-B)
Creazione ed eliminazione di tabelle
  • Mediante l’istruzione CREATE TABLE si definisce lo schema di una tabella e se ne crea un’istanza vuota
  • Per ogni attributo va specificato il dominio,un eventuale valore di default e eventuali vincoli
  • Infine possono essere espressi altri vincoli a livello di tabella
  • Mediante l’istruzione DROP TABLE è possibile eliminare lo schema di una tabella (e conseguentemente la corrispondente istanza)

DROP TABLE Imp

Definizione di tabelle: esempio
Valori nulli e valori di default
  • Per vietare la presenza di valori nulli, è sufficiente imporre il vincolo NOT NULL

CF         chr(16)      NOT NULL

  • Per ogni attributo è inoltre possibile specificare un valore di default, che verrà usato se all’atto dell’inserimento di una tupla non viene fornito esplicitamente un valore per l’attributo relativo

Ruolo     char(20)     Default       "Programmatore"

 

Chiavi
  • La definizione di una chiave avviene esprimendo un vincolo UNIQUE, che si può specificare in linea, se la chiave consiste di un singolo attributo

CF      chr(16)     UNIQUE

o dopo aver dichiarato tutti gli attributi, se la chiave consiste di uno o più attributi:

UNIQUE(Cognome, Nome)

  • Ovviamente, specificare

UNIQUE(Cognome)

UNIQUE(Nome)

sarebbe molto più restrittivo

Chiavi primarie
  • La definizione della chiave primaria di una tabella avviene specificando un vincolo PRIMARY KEY, o in linea o come vincolo di tabella

CodImp         chr(4)      Primary Key

Primary Key(Codprog, Citta)

  • Va osservato che:
      • La specifica di una chiave primaria non è obbligatoria
      • Si può specificare al massimo una chiave primaria per tabella
      • Non è necessario specificare NOT NULL per gli attributi della primary key
In DB2 è necessario specificare il vincolo NOT NULL sia per definire chiavi sia per definire chiavi primarie!
Chiavi esterne (“foreign key”)
  • La definizione di una foreign key avviene specificando un vincolo FOREIGN KEY, e indicando quale chiave viene referenziata

Sede         chr(3)      References Sedi(SEDE)

  • Ovvero

Foreign Key (Sede) References Sedi(SEDE)

  • Nell’esempio, Imp è detta tabella di riferimento e Sedi tabella di destinazione (analoga terminologia per gli attributi coinvolti)
  • Le colonne di destinazione devono essere una chiave della tabella destinazione (non necessariamente la chiave primaria)
  • Se si omettono gli attributi destinazione, vengono assunti quelli della chiave primaria

Sede        chr(3)      References Sedi

Vincoli generici (“check constraint”)
  • Mediante la clausola CHECK è possibile esprimere vincoli di tupla arbitrari, sfruttando tutto il potere espressivo di SQL
  • La sintassi è: CHECK  (<condizione>)
  • Il vincolo è violato se esiste almeno una tupla che rende falsa la <condizione>. Pertanto

Stipendio int         CHECKT(Stipendio > 0)

non permette tuple con stipendio negativo, ma ammette valori nulli per l’attributo Stipendio

  • Se CHECK viene espresso a livello di tabella (anziché nella definizione dell’attributo) è possibile fare riferimento a più attributi della tabella stessa

CHECK(ImportoLordo = netto + Ritenute)

In DB2 il CHECK può usare solo condizioni valutabili sulla singola tupla

Vincoli con nomi
  • A fini diagnostici (e di documentazione) è spesso utile sapere quale vincolo è stato violato a seguito di un’azione sul DB
  • A tale scopo è possibile associare dei nomi ai vincoli, ad esempio:

Stipendio int  CONSTRAINT StipendioPositivo
                       CHECK(Stipendio>0) 

CONSTRAINT ForeignKeySedi
Foreign Key(Sedi) REFERENCEST Sedi

Modifica di tabelle
  • Mediante l’istruzione ALTER TABLE è possibile modificare lo schema di una tabella, in particolare:
    • Aggiungendo attributi
    • Aggiungendo o rimuovendo vincoli

      Alter Table Imp

      ADD Column Sesso chr(1) CHECK(Sesso in ('M', 'F'))
      ADD Constraint StipendioMax CHECK(Stipendio < 4000)
      DROP Constraint StipendioPositivo
      DROP UNIQUE(Cognome, Nome);

  • Se si aggiunge un attributo con vincolo NOT NULL, bisogna prevedere un valore di default, che il sistema assegnerà automaticamente a tutte le tuple già presenti

ADD ColumnT Istruzione chr(10) NOT NULL Default 'Laurea'

tratto da DIPLOMA UNIVERSITARIO A DISTANZA IN INGEGNERIA LOGISTICA E DELLA PRODUZIONE - Sistemi Informativi Aziendali