laboratorio2

Realizzazione di una base di dati

Si vuole creare una base di dati che memorizzi una collezione di persone e le informazioni relative alle relazioni genitori-figli esistenti.

1. Creare e cancellare tabelle
Definire la tabella Persone, con i seguenti attributi

    * Id (stringa di 2 caratteri, chiave primaria);
    * Nome (stringa di 20 caratteri), non può essere null;
    * Reddito (intero), in migliaia di euro, 0 per default;
    * Eta (intero < 200);
    * Sesso ('M' oppure 'F');

e la tabella Genitori, con i seguenti attributi, ambedue parte della chiave primaria:

    * Figlio (stringa di 2 caratteri, chiave esterna su Persone);
    * Genitore (stringa di 2 caratteri, chiave esterna su Persone).

Nella definizione delle chiavi esterne si tenga conto dei fatti seguenti:

    * Quando si cancella una persona devono essere eliminati i corrispondenti rapporti di parentela nella tabella Genitori.
    * Non è previsto che l'identificatore di una persona cambi.

Le tabelle devono essere di tipo InnoDB (in modo da supportare la gestione delle chiavi esterne).


Visualizzazione di informazioni sulle tabelle

Per verificare di aver effettivamente creato le tabelle, eseguite l'interrogazione:

    show tables;

che mostra le tabelle esistenti nel database.

Mediante

    describe table_name;

potete vedere gli attributi della tabella e con

    show create table table name;

potete vedere informazioni più dettagliate.


Popolare la base di dati

Popolare la base di dati di modo che contenga le ennuple indicate in nei file Persone.txt e Genitori.txt (usare il cut-and-paste per costruire le query e tabelle usate per il popolamento).

Provare a caricare la tabella Persone con il comando

    INSERT INTO tabella VALUES ....

mentre per la tabella Genitori usare il comando

    LOAD DATA LOCAL INFILE 'GenTable.txt' INTO TABLE Genitori
    FIELDS TERMINATED BY ',';

dove GenTable.txt è un file preventivamente creato che contiene le ennuple da inserire in Genitori, campi separati da ','. (Nota: Per poter usare tale comando occorre aver avviato il client con il flag '--local-infile=1')

3. Effettuare interrogazioni
Fornire le interrogazioni SQL per rispondere alle seguenti domande. Ogni query è accompagnata dal risultato che si otterrebbe rispetto alla popolazione indicata sopra.

   1. Trovare id, nome e reddito delle donne con meno di 35 anni. [output]
   2. Trovare id, nome e reddito dei genitori di Antonino (Id='A3'). [output]
   3. Restituire per ogni persona, il nome della persona e quello dei nonni. [output]
   4. Trovare il reddito minimo, medio e massimo di donne e uomini [output]
   5. Trovare il reddito medio dei padri per età. [output]
   6. Fornire le coppie di fratelli (due persone sono fratelli se hanno un genitore in comune), indicandone i nomi. [output]

   7. Nomi di tutti i fratelli delle persone di nome Aldo [output] 
   8. Nomi delle persone che sono genitori di almeno 2 figli. [output] 
 9. Mostrare per ciascun figlio i rispettivi genitori (Madre, Padre, Figlio), indicando, per ciascuno, il nome. [output] 
  10. Modificare la query precedente in modo da riportare tutte le persone, con campo NULL per padre o madre quando questi siano assenti. [output] 
  11. Trovare l'elenco dei genitori i cui figli guadagnano tutti più di 20000 euro. Mostrare identificatore e nome, ordinando la lista per nome. [output] 
  12. Definire una vista EtaMediaFigli che restituisce per ogni persona (id, nome) l'età media dei suoi figli. Visualizzare il contenuto della vista.  [output] 
  13. Utilizzare la vista EtaMediaFigli per trovare tra tutti i genitori quelli i cui figli hanno la massima età media. [output] 
  14. Cancellare le Persone con reddito maggiore di 50000 euro. Mostrare le tabelle Persone e Genitori risultanti. [output] 
  15. Aumentare del 20% tutti i redditi inferiori a 30000 euro. Mostrare la tabella Persone risultante.  [output] 
  


Per scrivere ed eseguire le istruzioni SQL relative alle interrogazioni si può procedere come al punto precedente, creando un file query_n.sql per ciascuna query ed eseguendolo

    * con source query_n.sql, dal client MySQL
    * con mysql -t -h server -u login -ppwd db < query_n.sql, da shell

Dal client MySQL può essere anche utile utilizzare il comando

    \e

che permette di editare la query corrente (o quella appena eseguita) in un editor a vostra scelta, così come impostato nella variabile d'ambiente EDITOR. Qualora questa non fosse impostata, potete definirla inserendo nel file .bash_profile nella vostra home le righe

    EDITOR=emacs
    export EDITOR

Se il file non esistesse potete crearlo con il contenuto sopra indicato.


Genitori.txt
Persone.txt
[Query SQL per i punti precedenti]
[...ed alcune spiegate]