FAQ
Questa sezione contiene le risposte ai dubbi e alle domande inserite come feedback all'interno dei quiz associati alle videolezioni.
VL01 – Modello relazionale
Qual’è la differenza fra vincolo di dominio e vincolo di tupla?
Il vincolo di dominio esprime condizioni sul valore di un singolo attributo (e.g. Voto > 0 AND Voto <= 30), il vincolo di tupla esprime condizioni sul valore assunto dalle singole tuple di una relazione, in modo indipendente dalle altre tuple (e.g. Prezzo = Costo + PercIVA*Costo)
Cos’è il vincolo di chiave?
Il vincolo di chiave, o più precisamente il “vincolo di chiave primaria” definisce che ogni relazione deve avere una “chiave primaria”, cioè un insieme di attributi che identifica in modo univoco le tuple della relazione (in altre parole, non esistono due tuple che hanno lo stesso valore della chiave primaria). Una chiave primaria è univoca (cioè una relazione non deve contenere due tuple con lo stesso valore della chiave primaria), minimale (cioè non devono esistere sottoinsiemi di attributi della chiave che hanno la proprietà di univocità) e “non nullabile” (cioè non accetta il valore NULL).
I vincoli di chiave (primaria) sono i vincoli di unicità?
No, non sono la stessa cosa. La definizione di vincolo di chiave primaria include il vincolo di unicità (una chiave primaria ha la proprietà di univocità) ma è possibile definire il vincolo di unicità anche per altri attributi (o insiemi di attributi): in questo caso non possono esserci valori duplicati di tali attributi (o di tale combinazione di attributi) ma è possibile che vengano assegnati valori NULL (anche più di uno).
Cosa significa che NULL è compatibile con tutti i domini ma non appartiene a nessuno di questi?
Il valore NULL (che rappresenta un valore non conosciuto, o non rilevante) è compatibile con tutti i domini, nel senso che può essere assegnato ad un attributo di qualunque dominio (numero intero, stringa, data, …). È un valore che però non fa parte di nessun dominio (cioè non è una stringa o un numero intero, …)
Qual’è la differenza fra vincolo di chiave primaria e vincolo di chiave esterna?
Il vincolo di chiave primaria definisce che ogni relazione deve avere una “chiave primaria”, cioè un insieme di attributi che identifica in modo univoco le tuple della relazione (e.g. l’attributo CodP della relazione P). Il vincolo di chiave esterna (o “foreign key”) è invece relativo ad un vincolo di integrità referenziale, e definisce chiave esterna un insieme di attributi (della relazione referenziante) che fa riferimento ad un insieme di attributi della relazione referenziata (e.g. l’attributo CodP della relazione FP è una chiave esterna e fa riferimento all’attributo CodP della relazione P).
Cos’è il vincolo di integrità referenziale?
Nel modello relazionale (modello logico con i riferimenti basati sui valori degli attributi) il vincolo di integrità referenziale è fondamentale per garantire la correttezza dei riferimenti fra le relazioni. Il vincolo garantisce che i valori assunti dagli attributi della relazione referenziante (e.g. i valori assunti da CodP nella relazione FP) siano effettivamente presenti nella relazione referenziata (e.g. i valori assunti da CodP nella relazione P).
Qual’è la differenza fra relazione referenziante e relazione referenziata?
La relazione referenziante è quella che fa riferimento alla relazione referenziata attraverso i valori di un sottoinsieme dei suoi attributi, che devono contenere valori presenti nella relazione referenziata. Non esistono “regole” per distinguere qual’è la relazione referenziata e quella referenziante, ma si può capire guardando lo schema e riflettendo sui legami fra le relazioni: le relazioni che rappresentano classi di oggetti (e.g. i prodotti, i corsi, gli studenti, …) solitamente sono relazioni referenziate, mentre quelli che riguardano dei legami fra le classi di oggetti (e.g. le forniture, che legano prodotti e fornitori, gli esami che legano studenti e corsi, …) solitamente sono relazioni referenzianti. Questo aspetto sarà approfondito nella parte di progettazione delle basi dati.
VL02 – Istruzione SELECT: struttura base
Il carattere ‘%’ nella stringa che segue il LIKE può indicare anche "nessun carattere"?
Sì, la stringa che segue l’operatore LIKE può contenere due caratteri speciali: “_” indica uno e un solo carattere, e “%” indica una stringa composta da un numero di caratteri qualunque, compresa la stringa vuota (0 caratteri).
Se volessi scrivere come condizione che la quinta lettera di NomeP deve essere una 'e', è corretto scrivere WHERE NomeP LIKE '_ _ _ _e%' ?
Sì, è corretto: ci sono 4 caratteri qualunque, una ‘e’ in quinta posizione, e nel seguito qualunque altra sottostringa.
Nella query “SELECT DISTINCT Cognome FROM IMPIEGATO WHERE CodDip <> 'D06'” se ci sono due Bruni, con quale criterio ne scelgo uno al posto dell'altro? (in caso ci fosse anche Nome nella SELECT)
In questo caso nella SELECT non c’è Nome, per cui viene visualizzata solo una riga con cognome ‘Bruni’. Se ci fosse anche Nome comparirebbero tutte le combinazioni diverse di Cognome e Nome (e.g. ad esempio Bruni Margherita e Bruni Renato).
VL03 – Istruzione SELECT: join fra tabelle
Come si usa il join?
Il join di due relazioni A e B genera tutte le coppie formate da una tupla di A e una tupla di B “semanticamente legate”, cioè in cui è vera una condizione, detta “condizione di join” che lega un attributo di A ad un attributo di B. Nella sintassi SQL il join si realizza elencando le tabelle nella clausola FROM e indicando le condizioni di join nella clausola WHERE.
Cos`è il “legame semantico” fra due attributi?
Il legame semantico fra due attributi, ciascuno dei quali appartiene ad una tabella diversa, è il legame su cui si basa la condizione di join, che verifica (attraverso la clausola WHERE) che una data condizione “di legame” sia vera. Il termine “semantico” in questo caso viene utilizzato per mettere in evidenza il fatto che il legame fra le tabelle ha un significato per le tabelle che vengono “unite”, ad esempio il legame che lega il valore di CodP nella tabella P con il valore di CodP della tabella FP. Il legame semantico spesso coinvolge la chiave esterna di una tabella e l’attributo della tabella referenziata a cui la chiave esterna fa riferimento.
Il join si fa tra due tabelle o tra due istanze? Cosa significa “2 istanze” di una tabella?
Si può fare il join fra due tabelle diverse o fra due “istanze” della stessa tabella, cioè fra due copie della stessa tabella.
Come si fa il join fra più di due relazioni?
Il join è un operatore binario, ma nella sintassi SQL è possibile indicare il join fra più tabelle, intendendo che queste vengono “legate semanticamente” a coppie, come definito all’interno della clausola WHERE dalle condizioni di join, che nel caso di N tabelle devono essere almeno N-1. Ad esempio scrivere “FROM F, FP, P” significa che viene eseguito il join fra la tabella P e la tabella FP, e viene poi eseguito il join fra la tabella risultante e la tabella P. Si noti che l’ordine in cui sono eseguiti i join è scelto dall’ottimizzatore SQL in modo trasparente all’utente, che deve indicare semplicemente tutte le tabelle che desidera “unire” specificando tutte le condizioni di join.
VL04 – Istruzione SELECT: funzioni aggregate e GROUP BY
Quali attributi si mettono dopo la GROUP BY? Cosa significa aggiungere un attributo oltre alla chiave primaria?
L’attributo inserito nella clausola GROUP BY è quello che definisce i gruppi che devono essere creati, in modo che ogni gruppo abbia un valore diverso per quell’attributo. Aggiungere un attributo oltre alla chiave primaria non ha nessun effetto per la definizione dei gruppi, perché ad ogni valore della chiave primaria corrisponde sempre un solo valore di ogni altro attributo (ad esempio, ogni matricola ha un solo cognome associato). L’aggiunta di tale attributo è un artificio sintattico, per permettere di visualizzarlo, dato che nella SELECT è possibile indicare solo funzioni aggregate o attributi presenti nella GROUP BY.