Concetti Chiave
- Le tabelle in SQL sono create con il comando CREATE TABLE, specificando nome e attributi con i relativi tipi di dato e clausole come PRIMARY KEY e FOREIGN KEY.
- Le clausole UNIQUE e PRIMARY KEY garantiscono l'unicità dei dati e permettono di definire comportamenti specifici in caso di cancellazione o aggiornamento di righe correlate.
- La struttura delle tabelle può essere modificata usando il comando ALTER TABLE per aggiungere o rimuovere colonne, mentre il comando DROP elimina completamente una tabella.
- Il comando INSERT permette di aggiungere nuovi record, UPDATE consente di modificare valori esistenti e DELETE rimuove specifiche righe, mantenendo intatto lo schema della tabella.
- Le join in SQL possono essere esplicite o implicite, permettendo di combinare dati da più tabelle attraverso condizioni di congiunzione definite nelle clausole FROM o WHERE.
Che cosa è la creazione e definizione delle tabelle?
Le tabelle vengono definite con il comando CREATE TABLE, seguito dal nome della tabella e dall'elenco degli attributi. Per ogni attributo occorre specificare nome e tipo di dato. Gli attributi possono essere qualificati con diverse clausole.
Esempio:
Attr1 smallint primary key, //chiave primaria
Attr2 char(20) not null, //campo obbligatorio, non può restare vuoto
Attr3 char(20) default 'valore_di_default', //valore di default
Attr4 char(5) references tabella2(codice)); //chiave esterna
Clausole e chiavi nelle tabelle
Tra le altre clausole va ricordata UNIQUE che vieta la presenza di valori duplicati in una colonna o in un insieme di colonne. Per esempio, per indicare che non possono esserci due dipendenti con identico nome e cognome nello stesso dipartimento, si può sfruttare la clausola UNIQUE:
Anche le clausole PRIMARY KEY e REFERENCES possono essere inserite in righe isolate; questa caratteristica permette di dichiarare chiavi primarie o esterne formate da più campi. Assieme alla definizione di un chiave esterna è possibile dichiarare il tipo di comportamento (politiche di reazione) da tenere in caso di cancellazione di una riga nella tabella collegata o di variazione del valore.
Esempio:
Codice char(5),
Descrizione char(20) not null,
Sede char(20),
Manager smallint,
Primary Key (Codice), //chiave primaria
Unique (Descrizione),
Foreign Key (Manager) references Impiegati (ID) //Manager è chiave esterna
On Delete set null
On Update cascade);
On Delete set null significa che è permessa la cancellazione di una riga di Impiegati e i valori di Manager corrispondenti assumono valore nullo.
On Update cascade significa che l'aggiornamento di un ID associato a Manager si riflette a catena sui valori di Manager.
Le dichiarazioni On Delete no action e On Update no action impediscono di cancellare un record della tabella Impiegati correlato alla chiave esterna di Dipartimenti o di modificare il valore della chiave primaria di un dipendente che è un manager in qualche dipartimento.
Modifiche e eliminazioni delle tabelle
La struttura di una tabella può essere modificata in un secondo tempo con il comando ALTER TABLE, per aggiungere una nuova colonna (ADD) a quelle già esistenti, oppure per togliere una colonna (DROP). Per esempio, per inserire un nuovo attributo con la data di nascita del dipendente si usa il comando:
ADD Nascita date;
Utilizzando l'opzione DROP si può togliere dalla tabella impiegati l'attributo che si riferisce alla località di residenza:
DROP Residenza;
Una tabella può essere eliminata con il comando DROP, seguito dal nome della tabella, cancellando così tutte le istanze della tabella nonché lo schema:
Usando il comando DELETE invece, si eliminano le istanze della tabella ma lo schema resta immutato:
Comandi di inserimento e aggiornamento
Per inserire i valori di una nuova riga della tabella Impiegati, si usa il comando:
INSERT INTO Impiegati
(ID, Nome, Cognome, Residenza, Stipendio, Dipartimento) //nomi dei campi
VALUES (20,'Mario','Rossini','Caserta',31500,'Mag'); //valori
Per assegnare il dipendente con ID=20 al dipartimento Produzione, occorre il comando:
SET Dipartimento='Prod'
WHERE Matricola=20;
Per cancellare dalla tabella Impiegati i dati del dipendente con ID=20, si usa il comando:
DELETE FROM Impiegati
WHERE ID=20;
Comando select e predicati
Comando Select
Il comando SELECT specifica quali campi della tabella considerata si vogliono visualizzare, possiamo dire che è l'equivalente della proiezione nello pseudolinguaggio.
Esempio: visualizzare l'elenco con cognome, nome e residenza dei dipendenti del dipartimento di codice Prod.
FROM Impiegati
WHERE Dipartimento='Prod';
Esempio: visualizzare l'elenco dei dipendenti (con ID, Cognome, Nome) che lavorano alla produzione e risiedono a Torino.
SELECT ID, Nome, Cognome
FROM Impiegati
WHERE Dipartimento='Prod' AND Residenza='Torino';
Il comando Select possiede due predicati Con il predicato ALL si richiede che nel risultato dell'interrogazione siano incluse tutte le righe che soddisfano alle condizioni contenute nel comando.
Scrivere SELECT * equivale a scrivere SELECT ALL*
Se viene specificato il comando DISTINCT le righe duplicate nella tabella risultante sono ridotte a una. Per esempio se si desidera ottenere l'elenco di tutte le città di residenza dei dipendenti, senza duplicati, visto che è possibile che più dipendenti abitino nella stessa città, si deve usare la clausola DISTINCT prima dell'attributo:
SELECT DISTINCT Residenza
FROM Impiegati;
Tramite AS si possono rinominare tabelle e colonne:
FROM Impiegati;
Con il comando SELECT si può anche richiedere il calcolo di espressioni sugli attributi presenti nella tabella:
FROM Impiegati
WHERE Dipartimento='Mag'
Per controllare la presenza di valori nulli si deve fare uso del predicato IS NULL, mentre è errato scrivere =NULL.
Domini e tipi di dati
I domini sono in sostanza i tipi di dati che le informazioni possono assumere, ne esistono di due tipi:
- Elementari (predefiniti): tipi di dati "classici" singoli caratteri, stringhe, booleani, interi, ecc.
- Definiti dall'utente (semplici): si definiscono con CREATE DOMAIN
DEFAULT NULL
CHECK (value>=18 AND value
Durante la definizione di questi domini si possono anche stabilire valori di default e vincoli.
Join implicite ed esplicite
In SQL le congiunzioni (join) possono essere scritte in forma implicita o esplicita.
Le join esplicite riguardano tutti i tipi di join. La particolarità delle join implicite è che il tipo di congiunzione da costruire e la condizione di congiunzione sono espresse nella clausola FROM:
FROM Dipartimenti INNER JOIN Impiegati ON Dipartimenti.Codice=Impiegati.Dipartimento;
Le join implicite invece prevedono che la condizione di congiunzione venga scritta nella clausola WHERE:
FROM Impiegati,Dipartimenti
WHERE Impiegati.Dipartimento=Dipartimento.Codice
Questa sintassi è utilizzabile solo per gli INNER JOIN.
Domande da interrogazione
- Come si crea una tabella in SQL?
- Qual è la funzione della clausola UNIQUE nelle tabelle?
- Come si modifica la struttura di una tabella esistente?
- Qual è la differenza tra i comandi DELETE e DROP?
- Cosa sono i domini in SQL e come si definiscono?
Una tabella si crea utilizzando il comando CREATE TABLE, seguito dal nome della tabella e dall'elenco degli attributi, specificando per ciascuno nome e tipo di dato (esempio: CREATE TABLE nomeTabella (Attr1 smallint primary key, ...)).
La clausola UNIQUE impedisce la presenza di valori duplicati in una colonna o in un insieme di colonne, garantendo l'unicità dei dati (esempio: due dipendenti non possono avere lo stesso nome e cognome nello stesso dipartimento).
La struttura di una tabella può essere modificata con il comando ALTER TABLE, utilizzando ADD per aggiungere colonne o DROP per rimuoverle (esempio: ALTER TABLE Impiegati ADD Nascita date;).
Il comando DELETE rimuove le istanze di una tabella mantenendo lo schema, mentre DROP elimina completamente la tabella e il suo schema (esempio: DELETE FROM Impiegati; vs DROP TABLE Impiegati;).
I domini sono i tipi di dati che le informazioni possono assumere, e possono essere elementari o definiti dall'utente, quest'ultimi si definiscono con il comando CREATE DOMAIN (esempio: CREATE DOMAIN voto AS SMALLINT DEFAULT NULL CHECK (value>=18)).