Laboratorio di
“Basi di dati”
Venerdì 6 Dicembre 2002
Venerdì 20 Dicembre 2002
Vaccaro Valerio
[email protected]
http://web.tiscali.it/Vaccaro
Pag.1
Indice generale
0. Introduzione a MySQL.....................................................................................................................3
1. Ambiente Client-Server....................................................................................................................4
1.1. Avvio del server........................................................................................................................4
1.2. Avvio del client.........................................................................................................................4
2. Creazione di un database..................................................................................................................5
2.1. Creiamo il nostro db.................................................................................................................5
2.2 Aggiungiamo le tabelle..............................................................................................................6
2.3 Popolazione delle tabelle...........................................................................................................6
3. Interrogazione del database..............................................................................................................8
3.1. Interrogazioni complesse..........................................................................................................8
4. Dumping del database....................................................................................................................14
4.1. Ridirezione dell'input e dell'output.........................................................................................15
5. Interfacce grafiche..........................................................................................................................15
Bibliografia e software.......................................................................................................................18
Pag.2
0. Introduzione a MySQL
MySQL è un database di grande successo e multipiattaforma infatti, come descritto nel manuale
ufficiale, è disponibile per le seguenti piattaforme:
AIX 4.x with native threads.
Amiga.
BSDI 2.x with the included MIT-pthreads package.
BSDI 3.0, 3.1 and 4.x with native threads.
DEC Unix 4.x with native threads.
FreeBSD 2.x with the included MIT-pthreads package.
FreeBSD 3.x and 4.x with native threads.
HP-UX 10.20 with the included MIT-pthreads package.
HP-UX 11.x with the native threads.
Linux 2.0+ with LinuxThreads 0.7.1+ or glibc 2.0.7+.
Mac OS X Server.
NetBSD 1.3/1.4 Intel and NetBSD 1.3 Alpha (Requires GNU make).
OpenBSD > 2.5 with native therads. OpenBSD < 2.5 with the included MIT-pthreads package.
OS/2 Warp 3, FixPack 29 and OS/2 Warp 4, FixPack 4.
SGI Irix 6.x with native threads.
Solaris 2.5 and above with native threads on SPARC and x86. S
SunOS 4.x with the included MIT-pthreads package.
SCO OpenServer with a recent port of the FSU Pthreads package.
SCO UnixWare 7.0.1.
Tru64 Unix
Win95, Win98, NT, and Win2000.
La licenza a cui MySQL si attiene e la GPL dunque nulla è richiesto oltre al rispetto della licenza
per usarlo su tutti i computers che si hanno a disposizione, un bel vantaggio rispetto ai prodotti
commerciali! MySQL si attiene alle specifiche di SQL '92 (SQL 2) tuttavia è ancora un prodotto in
via di sviluppo e miglioramento quindi nulla vieta che prossime versioni supporteranno
completamente SQL 2 e magari anche dettagli di SQL 3.
Le doti principali di MySQL sono la leggerezza e la semplicità d'uso. La leggerezza si tramuta in
velocità di esecuzione ecco perché spesso tale DB è usato in internet, per la realizzazione di portali,
siti dinamici, cataloghi on-line in accoppiata con linguaggi server-side quali php. La semplicità
d'uso riguarda invece l'opera monumentale di software, manuali, interfacce che è possibile trovare
in internet (e anche nei CD della vostra distribuzione preferita). Volete realizzare un portale in
pochi minuti? Volete un'interfaccia che vi colleghi al vostro DB? Volete creare un sito dinamico da
cui accedere ai dati del vostro DB? O magari vi volete collegare solo per amministrarlo? Tutto
questo con MySQL è di una rapidità sconcertante e vi lascia molto tempo per progettare il vostro
spazio, la grafica ed anche per giocare a “frozen bubble” o a “pingus”. E' ovvio che tutta questa
velocità bisogna pagarla in qualche modo.
Attualmente MySQL NON supporta:
• le query annidate (e chi le sopporta ...)
• le transazioni
• l'integrità referenziale
• altri costrutti di SQL2
Sono in corso vari progetti per dotare MySQLdi tutto ciò ed in particolare dovrebbe attualmente
essere possibile esprimere l'integrità referenziale e le transazioni tuttavia per ciò che ci
aggiungiamo a fare ingnoreremo le transazioni e scriveremo comunque l'integrità referenziale che
eventualmente sarà ignorata da MySQL.
La versione utilizzata per gli esempi descritti successivamente è la 3.23.52-MAX distribuita
assieme alla distribuzione Mandrake 9.0, tuttavia la generalità degli esercizi consente l'uso di
qualsiasi altra release e di qualsiasi sistema operativo supportato.
Pag.3
1. Ambiente Client-Server
MySQL è stato sviluppato sotto sistemi GNU/Linux dunque è ovvio aspettarsi anche in questo
prodotto due caratteristiche che sono onnipresenti nel mondo Linux:
1. L'integrazione con la rete.
MySQL possiede infatti numerose caratteristiche atte all'uso in rete ed in particolare ben si
accorda con php e apache creando in pochi click un sistema web server affidabile, sicuro e
gratuito.
2. La scissione client-server.
MySQL si compone infatti di:
un demone o server cioè il sistema di database e un client o interfaccia che può essere di vari
tipi e principalmente viene classificata in base al tipo di interfaccia che può essere grafica o a
caratteri mentre tutte supportano il collegamento a database locali cioè sulla medesima macchina
oppure remoti cioè su una macchina diversa dalla propria e connessa mediante un tipo di rete che
supporti il protocollo TCP o UDP.
In particolare la soluzione client-server rappresenta un interessante alternativa anche a i cosiddetti
database personali che, per quanto semplici o complessi, non godono della pulizia di un sistema che
separi l'interfaccia di lavoro (client) dal servizio database vero e proprio (server).
1.1. Avvio del server
La prima operazione è ovviamente installare i pacchetti di MySQL, si valuti la possibilità di
installare la documentazione che risiede in un pacchetto a parte. Se si possiedono i pacchetti di
sorgenti occorre anche compilare MySQL per il proprio hardware altrimenti scaricate i pacchetti
compilati per il processore in vostro possesso e per la distribuzione che è installate sul vostro
computer. Fatto ciò occorre creare l'ambiente a MySQl, per far ciò aprire un terminale e digitare :
mysql_install_db
Tale comando crea i file necessari a MySQL e ricorda di settare la password per l'amministratore
della base di dati oltre a dare preziosi spunti su come testare il database installato. Ora siete pronti a
digitare come utente di root:
safe_mysqld &
e quindi pronti a far partire il server. Ovviamente c'è il modo per automatizzare l'avvio del demone
di MySQL, basta aggiungere uno script che richiami tale comando nel runlevel utilizzato.
Utenti Win, non disperate, la vostra versione non necessita inizializzazione e il demone può essere
fatto partire mediante un'icona posta nella cartella /bin all'interno della cartella predefinita di
MySQL. Io preferisco la soluzione offerta da Linux che, sebbene più complessa, è più flessibile ed
adattabile ai proprio gusti.
1.2. Avvio del client
Il primo e forse il meno intuitivo client che analizziamo è mysql che è a caratteri e possiamo
avviare dal terminale semplicemente digitando:
mysql
da cui otteniamo una scarna interfaccia totalmente rivolta alla comunicazione con il database
mediante i comandi di SQL.
Ora si può digitare qualsiasi comando SQL ricordandosi che il programma interpreterà concluso il
comando quando si digiterà il carattere terminatore ; seguito da un invio.
E' anche possibile connettersi a host remoti mediante il parametro -h <indirizzo IP del server>,
occorre però assicurarsi di avere i permessi necessari presso il server che si intende contattare
altrimenti è possibile che ci venga cortesemente ricordato che non siamo bene accetti su quella
Pag.4
particolare macchina. Questa è la potenza che muove il modello client-server, non occorre essere
fisicamente davanti alla macchina per programmarne il funzionamento, aggiungere dati, sapere
situazioni aggiornate da qualsiasi parte del mondo. Insomma datemi un nodo di acceso e vi
programmerò il mondo (a patto di averne i diritti di accesso e magari di root).
2. Creazione di un database
Il database su cui ci concentreremo per gli esempi di questo capitolo è rappresentato dal seguente
schema:
STUDENTE(matr, nome, cognome)
ESAME(matr, codicecorso, data, voto)
CORSO(codice, docentecorso, nome)
dove sono sottolineate le chiavi primarie della tabella e scritti in corsivo i termini più deboli dei due
vincoli di integrità referenziale che il buon senso suggerisce tra le tabelle.
2.1. Creiamo il nostro db
Apriamo un terminale ed avviata l'interfaccia di mysql digitiamo:
create database labdb;
ciò equivale a predisporre nel sistema un nuovo database.
Attenzione ci potrebbe venire risposto che non disponiamo delle autorizzazioni per creare il
database e quindi la nostra azione verrà rifiutata. Appena installato infatti MySQL conosce un solo
utente, il root o amministratore delle base di dati la cui password e per default nulla. Occorre quindi
specificare una password se si considera di esporre il DB a potenziali attacchi e creare i nuovi
utenti. Si consideri che richiamare l'interfaccia mysql senza specificare il parametro –-user=<nome
utente> corrisponde ad accedere al database con un utente del tipo <nome utente loggato>@<nome
dell'host da cui parte la richiesta> ad esempio se mi connetto sul mio computer di casa da una
finestra dello stesso sarò riconosciuto dal database come valerio@localhost. Occorre dunque dare
al mio utente i permessi di utilizzo del database, in particolare nel mio caso setterò tutti i privilegi
su tutti i database cioè setterò l'utente valerio@localhost come un utente amministratore del
database. Incominciamo a connetterci al database mysql (database di gestione del sistema)come
root con:
mysql --user=root --password mysql
e digitando l'eventuale password. A tale punto un comando \
GRANT ALL PRIVILEGES ON *.* TO valerio@localhost WITH GRANT OPTION;
assicura permessi su tutto il Db anche a valerio@localhost.
Siamo ora pronti per creare lo schema del database, possiamo fare ciò interattivamente all'interno
della stessa finestra di mysql che questa volta richiameremo senza specificare il nome ed avendo
l'accortezza di creare il database se non presente. Una lista dei database presenti si ottiene da
qualsiasi terminale con il comando
mysqlshow
con cui otterremo nel terminale lista dei database presenti.
[valerio@sirio valerio]$ mysqlshow
+------------+
| Databases |
+------------+
| labdb
|
| mysql
|
| test
|
+------------+
Pag.5
Occorre ora discutere sulla notazione da usare con le tabelle infatti MySQL accetta il formato
pèuntato del tipo <nome database>.<nome tabella> come pure il formato <nome tabella> a patto di
aver specificato il database da usare all'aperuta dell'interfaccia. Per MySQL è indifferente mentre
per alcuni di noi la notazione puntata è più chiara mentre per altri è solo più faticosa da scrivere.
Lascio a voi capire quale sia la mia soluzione... Dopo aver digitato:
use labdb;
siamo pronti a dichiarare lo schema delle tabelle.
2.2 Aggiungiamo le tabelle
Assicuriamoci di lavorare sul database giusto e incominciamo a dichiarare prima lo schema delle
tabelle che non contengano vincoli di integrità referenziale in quanto la dichiarazione di vincoli su
tabelle inesistenti è rifiutata dal sistema. Cominciamo con la tabella studente:
create table studente(
matr char(6) not null,
nome varchar(50) not null,
cognome varchar(50) not null,
primary key (matr)
);
Aggiungiamo poi la tabella corso
create table corso(
codice varchar(10) not null,
docentecorso varchar(22) not null,
nome varchar(30) not null,
primary key (codice)
);
E quindi la tabella esame
create table esame(
matr char(6) not null,
codicecorso varchar(10) not null,
data varchar(10),
voto enum('18', '19','20','21','22','23','24','25','26','27','28','29','30'),
lode integer default 0,
primary key (matr, codicecorso),
foreign key (matr) references studente,
foreign key (codicecorso) references corso(codice)
);
dove il voto è confinato in un dominio mediante una enumerazione che non poteva essere altrimenti
espresso visto che le check non sono riconosciute da MySQL e così pure per i domini espliciti che
non sono ancora contemplati nella struttura di MySQL. Si ponga attenzione al fatto che sono stati
espressi i vincoli di integrità ma il database ignorerà tali comandi, la loro presenza consente
compatibilità dello schema con SQL 2 e portabilità sotto altri DB che supportino i vincoli di
integrità referenziale.
2.3 Popolazione delle tabelle
Occorre ora aggiungere i dati alle tabelle cioè popolare le stesse con dati significativi per poter poi
effettuare una sessione di testing del database stesso. L'operazione da utilizzare è ovviamente la
insert.
Incominciamo inserendo due studenti:
Pag.6
insert into studente values ('000001','Ciccio','Riccio');
insert into studente values ('000002','Fabio','Rossi');
effettuiamo un rapido controllo la banale query
select * from studenti;
che restituirà
mysql> select * from studente;
+-----------+-------+------------+
| matr
| nome | cognome |
+-----------+-------+------------+
| 000001 | Ciccio | Riccio
|
| 000002 | Fabio | Rossi
|
+-----------+--------+-----------+
2 rows in set (0.01 sec)
Inseriamo ora due corsi:
insert into corso values ('0A001-02','Franco Talponi','Matemastica');
insert into corso values ('0A002-02','Guglielmo Cancelli','Deformatica');
effettuiamo un rapido controllo la banale query
select * from corso;
che restituirà
mysql> select * from corso;
+-------------+-----------------------+---------------+
| codice
| docentecorso
| nome
|
+-------------+-----------------------+---------------+
| 0A001-02 | Franco Talponi
| Matemastica |
| 0A002-02 | Guglielmo Cancelli | Deformatica |
+-------------+-----------------------+---------------+
2 rows in set (0.00 sec)
Siamo ora pronti per inserire tre esami di test :
insert into esame values ('000001','0A001-02','07/12/02','30',1);
insert into esame values ('000001','0A002-02','08/12/02','25',0);
insert into esame values ('000002','0A001-02','07/12/02','18',0);
effettuiamo un rapido controllo la banale query
select * from esame;
che restituirà
mysql> select * from esame;
+-----------+-----------------+-------------+------+------+
| matr
| codicecorso | data
| voto | lode |
+-----------+-----------------+-------------+------+------+
| 000001 | 0A001-02 | 07/12/02 | 30 | 1 |
| 000002 | 0A001-02 | 07/12/02 | 18 | 0 |
| 000001 | 0A002-02 | 08/12/02 | 25 | 0 |
+-----------+-----------------+-------------+------+------+
3 rows in set (0.00 sec)
che forse è poco significativo ma ci segnala la correttezza dei nostri inserimenti e quindi conviene
farlo almeno una volta nelle vita.
Pag.7
3. Interrogazione del database
Avete presente quel bel linguaggio che avete studiato per il corso di basi di dati ed in particolare la
parte di DML (data manipulation language) ??? E' ora di rispolverarla con una semplice query che
ci dia la certezza di non aver costruito un database per niente. Cerchiamo quindi la tabella che
descriva tutti gli esami con un minimo di chiarezza ordinati per nome e cognome dello studente.
mysql> select s.cognome,s.nome,c.nome as titolo,c.docentecorso,e.data,e.voto,e.lode
-> from studente s, corso c, esame e
-> where e.matr=s.matr
-> and e.codicecorso=c.codice
-> order by s.cognome,s.nome;
+-----------+----------+-------------+----------------------+-------------+-------+------+
| cognome | nome | tito lo
| docentecorso
| data
| voto | lode |
+-----------+----------+-------------+-----------------------+------------+-------+------+
| Riccio
| Ciccio | Deformatica | Guglielmo Cancelli | 08/12/02 | 25 | 0 |
| Riccio
| Ciccio | Matemastica | Franco Talponi | 07/12/02 | 30 | 1 |
| Rossi
| Fabio | Matemastica | Franco Talponi | 07/12/02 | 18 | 0 |
+-----------+----------+-------------+-----------------------+------------+-------+------+
3 rows in set (0.04 sec)
3.1. Interrogazioni complesse
Per lavorare con qualche query interessante introduciamo un nuovo database, tale database è
contenuto nel file di dump f1.sql e contiene lo schema e le istanze di un database inerente ai
campionati di formula uno.
Per creare sul vostro computer lo stesso database è necessario leggere il capitolo 4 che spiega come
ricreare l'ambiente per provare le query. Se i concetti di dumping dei database vi sono già chiari
oppure vi basta provare il database, digitate:
[valerio@sirio valerio]$ mysql < f1.sql
Questa istruzione crea il database contenente tutti i dati necessari a provare le query. Per assicuraci
che il database sia stato creato digitiamo:
[valerio@sirio valerio]$ mysqlshow
+------------+
| Databases |
+------------+
| f1
|
| labdb
|
| mysql
|
| test
|
+------------+
[valerio@sirio valerio]$ mysqlshow f1
Database: f1
+--------------+
| Tables
|
+--------------+
| Campionato |
| GranPremio |
| Motore
|
| Pilota
|
| Scuderia |
+--------------+
Pag.8
Ora siamo pronti per effettuare qualche query, apriamo mysql e digitalmo use f1; per suser il
database corrispondente.
• Visualizzare tutti i piloti di nazionalità italiana che hanno corso per una scuderia italiana.
mysql> select Pilota.Nome
-> from Pilota, Scuderia
-> where Scuderia.Nome=Pilota.Scuderia
-> and Pilota.Nazione='Italia'
-> and Scuderia.Nazione='Italia';
+----------------------+
| Nome
|
+----------------------+
| Luca Badoer
|
| Pierluigi Martini
|
+----------------------+
2 rows in set (0.04 sec)
•
•
•
Visualizzare tutti i piloti che corrono per scuderie italiane.
mysql> select Pilota.Nome
-> from Pilota, Scuderia
-> where Scuderia.Nome=Pilota.Scuderia
-> and Scuderia.Nazione='Italia';
+----------------------+
| Nome
|
+----------------------+
| Gerhard Berger |
| Jean Alesi
|
| Luca Badoer
|
| Pedro Diniz
|
| Pedro Lamy
|
| Pierluigi Martini
|
| Roberto Moreno |
+----------------------+
7 rows in set (0.00 sec)
Visualizzare le scuderie che hanno sede nella stessa nazione dove si è disputato un gran premio.
mysql> select Scuderia.Nome
-> from Campionato, Scuderia
-> where Scuderia.Sede=Campionato.Citta;
+----------+
| Nome |
+----------+
| Ligier |
+----------+
1 row in set (0.00 sec)
Visualizzare la classifica dei motori in base al numero di ritiri.
mysql> select Scuderia.Motore, count(*) as num
-> from GranPremio,Pilota, Scuderia
-> where GranPremio.Pilota=Pilota.Nome
-> and Scuderia.Nome=Pilota.Scuderia
-> group by Scuderia.Nome
Pag.9
-> order by num desc;
+-----------+------+
| Motore | num |
+-----------+------+
| Hart
| 34 |
| Ford
| 34 |
| Peugeot | 34 |
| Ford
| 34 |
| Ford
| 34 |
| Ferrari | 34 |
| Renault | 34 |
| Ford
| 34 |
| Renault | 34 |
| Mercedes | 33 |
| Yamaha | 33 |
| Mugen | 33 |
| Ford
| 10 |
+-----------+------+
13 rows in set (0.01 sec)
•
Visualizzare i motivi di ritiro da un gran premio più frequenti.
mysql> select GranPremio.MotivoRitiro, count(GranPremio.MotivoRitiro) as somma
-> from GranPremio
-> where GranPremio.Ritirato=1
-> group by GranPremio.MotivoRitiro
-> order by somma desc;
+----------------------------+----------+
| MotivoRitiro
| somma |
+----------------------------+----------+
| Cambio
| 37 |
| Testacoda
| 32 |
| Motore
| 31 |
| Incidente
| 29 |
| Uscita di pista
| 10 |
| Impianto elettrico
|
6|
| Non partito
|
6 |
| Collisione
|
5 |
| Freni
|
4 |
| Pressione benzina
|
4 |
| Incendio
|
3 |
| Sospensione
|
3 |
| Batteria
|
2 |
| Perdita olio
|
2|
| Non classificato
|
2 |
| Acceleratore
|
2 |
| Trasmissione
|
2 |
| Elettronica
|
2|
| Problemi elettrici
|
1|
| Radiatore olio
|
1|
| Cuscinetto ruota
|
1|
| Tenuta di strada
|
1|
Pag.10
| Bandiera nera
|
1|
| Cerchio ruota
|
1|
| Distacco ruota
|
1|
| Rottura semiasse
|
1|
| Leva cambio
|
1|
| Incendio al rifornimento |
1|
| Cuscinetto semiasse
|
1|
| Foratura
|
1|
| Differenziale
|
1|
| Impianto Idraulico
|
1|
| Problemi fisici (crampi) |
1|
| Fine benzina
|
1|
| Semiasse e freni
|
1|
| Semiasse
|
1|
| Alimentazione
|
1|
| Cuscinetto
|
1|
| Cedimento fisico
|
1|
+----------------------------+--------+
39 rows in set (0.04 sec)
•
Visualizzare la classifica dei piloti in base al numero di ritiri.
mysql> select Pilota.Nome, count(*) as somma
-> from Pilota, GranPremio
-> where Pilota.Nome=GranPremio.Pilota
-> and GranPremio.Ritirato=1
-> group by Pilota.Nome
-> order by somma desc;
+----------------------------+---------+
| Nome
| somma |
+----------------------------+---------+
| Andrea Montermini
| 14 |
| Taki Inoue
| 12 |
| Roberto Moreno
| 12 |
| Ukyo Katayama
| 11 |
| Mika Hakkinen
|
9|
| Bertrand Gachot
|
9|
| Rubens Barrichello
|
9|
| Pedro Diniz
|
8|
| David Coulthard
|
8|
| Jean Alesi
|
8|
| Luca Badoer
|
8|
| Damon Hill
|
7|
| Gerhard Berger
|
7|
| Eddie Irvine
|
7|
| Martin Brundle
|
6|
| Olivier Panis
|
6|
| Mark Blundell
|
5|
| Pierluigi Martini
|
5|
| Massimiliano Papis
|
5|
| Mika Salo
|
5|
| Heinz Harald Frentzen |
5|
Pag.11
| Johnny Herbert
|
4|
| Michael Schumacher
|
4|
| Jos Verstappen
|
4|
| Jean Christophe Boullion |
4|
| Karl Wendlinger
|
4|
| Gianni Morbidelli
|
4|
| Giovanni Lavaggi
|
4|
| Mimmo Schiattarella
|
3|
| Pedro Lamy
|
2|
| Aguri Suzuki
|
2|
| Jean Denis Deletraz
|
1|
| Nigel Mansell
|
1|
+----------------------------+-------+
33 rows in set (0.01 sec)
•
•
Elencare i motori in base alla potenza unitaria (potenza per cilindro)
mysql> select Motore.CasaProduttrice,(Motore.Potenza/Motore.NCilindri) as potun
-> from Motore
-> order by potun desc;
+-------------------+-------+
| CasaProduttrice | potun |
+-------------------+-------+
| Ford
| 86.25 |
| Hart
| 82.50 |
| Renault
| 71.00 |
| Mercedes
| 69.50 |
| Peugeot
| 69.00 |
| Mugen
| 67.50 |
| Yamaha
| 63.00 |
| Ferrari
| 60.83 |
+------------------+-------+
8 rows in set (0.00 sec)
Elencare i gran premi con motori a 12 cilindri in pole position.
mysql> select distinct Campionato.Nome_Circuito
-> from GranPremio, Pilota, Scuderia, Motore, Campionato
-> where Campionato.Numero=GranPremio.NumGP
-> and GranPremio.Pilota=Pilota.Nome
-> and Pilota.Scuderia=Scuderia.Nome
-> and Motore.NCilindri=12
-> and GranPremio.PosGriglia=1;
+----------------------+
| Nome_Circuito
|
+----------------------+
| Interlagos
|
| Oscar A. Galvez |
| Enzo e Dino Ferrari|
| Catalunya
|
| Monaco
|
| Gilles Villeneuve |
| Magny Cours
|
Pag.12
| Silverstone
|
| Hockenheim
|
| Hungaroring
|
| Spa-Francorchamps|
| Monza
|
| Estoril
|
| Nurburgring
|
| Aida
|
| Suzuka
|
| Adelaide
|
+---------------------+
17 rows in set (0.00 sec)
•
•
Elencare i GP in cui si sono ritirati piloti mentre stavano conducendo la gara
mysql> select Campionato.Nome_Circuito, Pilota.Nome
-> from GranPremio, Pilota, Campionato
-> where Campionato.Numero=GranPremio.NumGP
-> and GranPremio.Pilota=Pilota.Nome
-> and GranPremio.PosRitiro=1;
+----------------------+-------------------------+
| Nome_Circuito
| Nome
|
+----------------------+-------------------------+
| Interlagos
| Damon Hill
|
| Silverstone
| Michael Schumacher |
| Hockenheim
| Damon Hill
|
| Hockenheim
| Jean Alesi
|
| Spa-Francorchamps| David Coulthard
|
| Monza
| David Coulthard
|
| Monza
| Jean Alesi
|
| Adelaide
| David Coulthard
|
+----------------------+------------------------+
8 rows in set (0.01 sec)
Classifica campionato piloti eliminando chi non ha preso nemmeno un punto
mysql> select GranPremio.Pilota, sum(GranPremio.Punti) as tot
-> from GranPremio
-> group by GranPremio.Pilota
-> having tot>0
-> order by tot desc;
+-----------------------------+-------+
| Pilota
| tot |
+-----------------------------+-------+
| Michael Schumacher
| 102 |
| Damon Hill
| 69 |
| David Coulthard
| 49 |
| Johnny Herbert
| 45 |
| Jean Alesi
| 42 |
| Gerhard Berger
| 31 |
| Mika Hakkinen
| 17 |
| Olivier Panis
| 16 |
| Heinz Harald Frentzen | 15 |
Pag.13
| Mark Blundell
| 13 |
| Rubens Barrichello
| 11 |
| Eddie Irvine
| 10 |
| Martin Brundle
| 7|
| Gianni Morbidelli
| 5|
| Mika Salo
| 5|
| Jean Christophe Boullion | 3 |
| Pedro Lamy
| 1|
| Aguri Suzuki
| 1|
+----------------------------+-------+
18 rows in set (0.00 sec)
•
Lunghezza in chilometri dei gran premi.
mysql> select distinct Campionato.Nome_GP,(Campionato.Lunghezza*NumGiri/1000) as lung
-> from Campionato
-> order by lung desc;
+------------------+----------+
| Nome_GP
| lung |
+------------------+----------+
| Giappone
| 310.792 |
| Portogallo
| 309.56 |
| Gran Bretagna | 308.477 |
| San Marino | 308.385 |
| Pacifico
| 307.349 |
| Brasile
| 307.075 |
| Spagna
| 307.06 |
| Germania
| 307.035 |
| Belgio
| 306.856 |
| Argentina
| 306.648 |
| Australia
| 306.18 |
| Francia
|
306 |
| Italia
| 305.81 |
| Canada
| 305.67 |
| Ungheria
| 305.536 |
| Europa
| 305.252 |
| Monaco
| 259.584 |
+---------------.+-----------+
17 rows in set (0.00 sec)
4. Dumping del database
Qualora dopo aver giocato con MySQL ed aver creato il database labdb il nostro migliore amico ci
viene a supplicare di dargli una mano e di caricargli il nostro DB sulla sua sessione di MySQL,
oltretutto ingiunge di non avere i permessi di lettura sulla nostra sessione e quindi di non poter
vedere il database da remoto (è consigliabile per l'esamino di laboratorio prendere confidenza con i
comandi di rete!!!), oppure qualora decidessimo di cambiare un database creandolo, aggiornandolo
e testandolo sulla nostra macchina e poi di esportarlo sul computer di lavoro o sul database server
aziendale o ancora qualora decidessimo di distribuire in qualsiasi forma il database da noi realizzato
come ci comporteremo? Escludiamo una copia brutale della directory dei dati che esporrebbe più
informazioni del dovuto e mancherebbe al requisito di portabilità INDISPENSABILE nei casi
precedentemente descritti, infatti non esisteranno mai due sistemi identici e la duplicazione del
Pag.14
database mediante copia delle directory dati potrebbe farci venire il mal di testa. Incredibile ma
vero la soluzione si trova nella shell ed in particolare nella ridirezione dell'input o dell'output verso
file di testo contenenti comandi SQL. Tale caratteristica è presente universalmente in tutte le
interfacce a caratteri dei sistemi operativi ma negli utenti Windows è sopita nello stanzino buio dei
Dos-ricordi.
4.1. Ridirezione dell'input e dell'output
La ridirezione dell'input e dell'output di un sistema avvine in shell mediante i caratteri > e <.
Facciamo subito un esempio, qualora volessimo utilizzare l'interfaccia mysql per creare un nuovo
database, delle tabelle e popolarlo di valori possiamo creare un file che io chiamerò labdb.sql che
contenga tutto l'SQL necessaio a definire lo schema del database e le istanze.
Appare subito evidente che se trovassimo un modo più veloce alla scrittura diretta del codice SQL
potremmo creare un database identico a quello descritto nel file in pochi secondi. Il modo c'è, basta
digitare in un terminale
mysql < labdb.sql
che autonomamente aprirà l'interfaccia di mysql e digiterà tutti i comandi contenuti in labdb.sql
come se fossero stati digitati direttamente dalla tastiera (ridirezione dell'input da tastiera a file).
Occorre ora analizzare come si può semplicemente esportare un database di MySQL in un file di
testo, per far ciò esiste una applicazione appositamente creata e chiamata mysqldump <nome
database>. Eseguendo
mysqldump labdb
si ottiene la descrizione in SQL del database labdb con tanto di commenti che il programma
assicura prima di ogni definizione. Noi però volevamo la stessa descrizione su file. Come fare ???
In questi casi ci viene in aiuto la ridirezione dell'output da terminale (standard output) verso un file.
Con grande fantasia il comando che consente tale operazione è
mysqldump labdb > labdb.sql
che creerà il file lab.sql nella directory attuale.
5. Interfacce grafiche
Parlando di interfacce grafiche analizzeremo tre tipi di interfacce dell'ambiente windows che spesso
accompagnano il pacchetto MySQL e i tools a corredo di tale pacchetto. Le interfacce per database
che supportano SQL sono comunque diffusissime e parecchi progetti stanno lavorando in questo
campo senza tuttavia affermare nessun prodotto in maniera efficace. Per gli utilizzatori di
PostgreSQL invece esistono interfacce molto belle e semplici da usare, pgaccess è probabilmente la
più bella e semplice per chi ha già conosciuto i programmi commerciali (non vi ricorda nulla il
nome ???).
Per la gestione del server MySQL esiste winmysqladmin che fornisce un ambiente grafico di
gestione e crea report sul funzionamento del server stesso.
Pag.15
Per la gestione dello schema esiste invece l'interfaccia mysqlmanager che tuttavia non offre molto
di più di ciò che già fa l'accoppiata mysql e mysqlshow. Accetta input solo in linguaggio SQL e non
dispone di un ambiente grafico attivo, anzi ci si può chiedere a cosa serva che questo tool sia
grafico (io non l'ho ancora capito)
Il terzo e ultimo ambiente grafico proposto per windows è mysqlfront, sicuramente più potente del
Pag.16
precedente gestisce anche il trasferimento di schemi ed istanze (tabelle e dati) tra i database più
diffusi mediante ODBC o tramite file di testo formattato opportunamente. Supporta anche la
connessione a host diversi dal proprio, la creazione di database,di tabelle, il popolamento di
quest'ultime e l'esecuzione di query SQL supportate da MySQL.
Per linux le interfacce grafiche sono molteplici e con molteplici caratteristiche tuttavia se avete
installato apache e php potrebbe essere una buona idea installare anche PhpMyAdmin una
interfaccia grafica centralizzata (risiede sul server) da cui gestire il proprio database.
Pag.17
Bibliografia e software.
Testi consultati e di utile consultazione:
Guida ufficiale di MySQL
“Appunti di informatica libera”
“Linux domande e risposte”
“Linux facile”
Atzeni, Ceri, Paraboschi,Torlone “Basi di dati” McGraw-Hill
Kevin Kline, Daniel Kline “SQL Guida di riferimento” Apogeo
Per la realizzazione di questo testo sono stati usati SOLAMENTE programmi open source
strettamente attinenti alla licenza GPL, l'impaginazione è stata effettuata mediante OpenOffice 1.0,
l'elaborazione delle immagine mediante GIMP ed il sistema di riferimento è la distribuzione
Mandrake 9.0.
Pag.18