Lezione Precedente Elenco Lezioni Lezione Successiva

Laboratorio di Sistemi Informativi

Introduzione a MySQL

Il monitor di MySQL

Come abbiamo detto in precedenza, MySQL è un DBMS con architettura client/server.

Architettura Client-Server

Il vero e proprio DBMS è il programma server, che gestisce i database ed esegue i comandi SQL. Pe collegarsi al server e impartire ad esso dei comandi, è necessario un programma client.  Il più semplice di tutti è il monitor di MySQL.

Per far partire il monitor, entrare in una finestra terminale e lanciare il programma mysql.

In aula informatizzata bisogna dare il comando mysql -h goemon -u <username> -p, dove al posto di <username> va il nome utente che avete scelto per il vostro account sul server MySQL. Il parametro -h <nomeserver> consente di specificare su quale macchina risiede il server (goemon nel nostro caso). L'opzione -u <username> specifica con quale nome utente volete collegarvi e l'opzione -p serve a specificare che ci si vuole connettere utilizzano una password (che vi verrà richiesta dal sistema). Se l'account è privo di password, NON usare l'opzione -p.

Nel caso l'username che avete scelto per MySQL corrisponda al vostro username per l'accesso ai computer, allora basterà il comando mysql -h goemon -p.

Il sistema risponde con qualcosa del tipo

amato@sci138$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 5.0.24a-Debian_9-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> 

e attende l'immissione dei comandi. I comandi devono esseri comandi SQL validi (riconosciuti da MySQL) e terminati da un punto e virgola. Anche se premete il tasto <Enter>, il sistema non esegue alcun comando finché non inserite anche un punto e virgola.

Vediamo alcuni comandi SQL di esempio:

Sono ovviamente supportati tutti (o quasi) i comandi SQL che avete studiato nel corso di Basi di Dati: SELECT, INSERT, DELETE, UPDATE, CREATE TABLE. Daremo per scontata la loro conoscenza per cui si consiglia caldamente, prima di affrontare le prossime lezioni, di fare un breve ripasso.

In aula informatizzata è possibile fare subito esperimenti col comando SELECT utilizzando lo schema mancolista. Ad esempio:
mysql> USE mancolista
mysql> select * from categorie;
+----+---------+
| id | nome    |
+----+---------+
|  1 | Fumetti | 
|  2 | DVD     | 
+----+---------+
2 rows in set (0.01 sec)
Non è possibile modificare in alcun modo il contenuto di questo schema.

Ricordate che mysql> è il prompt di MySQL! Non confondetelo con il prompt della shell! Dalla shell si possono invocare altri programmi e dare comandi al sistema operativo. Dal prompt di MySQL, invece, si possono inserire dei comandi in SQL che vengono eseguiti dal server. Se provate un comando come ls il sistema risponde con

mysql> ls;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'ls' 
at line 1
Questo è un messaggio di errore standard di MySQL. C'è un numero che identifica il tipo di errore seguito dalla sua descrizione. Il primo numero (subito dopo ERROR) è un codice di errore specifico di MySQL, mentre il valore tra parentesi è un codice di errore standard definito dello standard SQL.
Attenzione. Se non si termina il comando con un punto e virgola, il monitor di MySQL risponde con il prompt

->

e richiede di completare il comando. Questo perché, per MySQL, un comando non è finito finché non appare il punto e virgola! In realtà, ci sono delle eccezioni. Ad esempio USE funziona anche senza punto e virgola finale. La differenza è che USE viene interpretato dal monitor di MySQL, mentre gli altri comandi sono interpretati dal server di MySQL. Onde evitare problemi, basta mettere sempre il punto e virgola alla fine.

Una sessione di lavoro col il monitor di MySQL

Vedremo in seguito che è possibile creare nuovi schemi, ma per il momento lavoriamo all'interno di test. Uno schema è fondamentalmente un insieme di tabelle. All'inizio lo schema test è vuoto, non contiene neanche una tabella, il che non lo rende particolarmente utile... è il momento di iniziare a crearne qualcuna. Il comando SQL che fa a caso nostro è CREATE TABLE. Creiamo quindi una tabella per i dipendenti di un ufficio. Prima di tutto dobbiamo entrare in uno schema, altrimenti il comando fallisce. Visto che l'unico schema esistente è test, entriamo lì dentro con il comando

USE test;

e successivamente:

CREATE TABLE dipendenti (
    codfiscale    char(16) primary key,
    nome          char(30),
    cognome       char(30),
    datanascita   date,
    anniserv      int default 0
);

In aula informatizzata utilizzare USE <username> invece di USE test, in quanto lo schema test non è accessibile.

Il modo più comodo di inserire questi comandi è col "taglia e incolla". Il taglia è incolla in Linux si può usare in due modi distinti:

  1. alla Windows: selezionare il testo da copiare sul browser, col tasto destro del mouse cliccare su Copy, poi spostarli sulla finestra e premere di nuovo il tasto destro del mouse: cliccare quindi su Paste.
  2. in maniera abbreviata: selezionare col mouse il testo da copiare, spostarsi sulla finestra della shell e premere il tasto centrale del mouse.

Attenzione. I comandi di MySQL possono essere digitati sia in maiuscolo che in minuscolo, e anche nel corso di queste lezioni verranno scritti ora in un modo ora nell'altro. Attenzione però che i nomi delle tabelle, degli schemi, dei campi nelle tabelle, etc.. vanno scritti esattamente con la giusta combinazione di maiuscole e minuscole con cui sono stati creati. Ad esempio, per entrare nello schema test si può utilizzare use test o USE test ma non use Test.

È possibile inserire valori nella tabella con

INSERT INTO dipendenti VALUES ('codfisc1','mario','rossi','1960-12-3',1);

Quando si inseriscono i valori in una tabella con il comando insert, dopo la parola chiave values vanno specificati tanti parametri quanti sono i campi nella tabella che si vuole modificare. Così, un comando del tipo

INSERT INTO dipendenti VALUES ('codfisc2','mario','bianchi');


termina con il messaggio di errore

ERROR 1136 (21S01): Column count doesn't match value count at row 1

Se non si vogliono specificare tutti i campi, ma solo alcuni di essi, è possibile usare un comando del tipo

INSERT INTO dipendenti(codfiscale,nome,cognome) VALUES ('codfisc2','mario','bianchi');

dove si indica, dopo il nome della tabella, i nomi dei campi che si vogliono specificare. Al solito, dopo values bisognerà specificare tanti elementi quanti sono i campi indicati dopo il nome della tabella. I campi che non sono indicati verranno riempiti con valori di default.

Possiamo vedere quello che abbiamo inserito con il comando select.  Ad esempio:

mysql> SELECT * FROM dipendenti;
+------------+-------+---------+-------------+----------+
| codfiscale | nome  | cognome | datanascita | anniserv |
+------------+-------+---------+-------------+----------+
| codfisc1   | mario | rossi   | 1960-12-03  |        1 |
| codfisc2   | mario | bianchi | NULL        |        0 |
+------------+-------+---------+-------------+----------+
2 rows in set (0.00 sec)

Notare i valori di default per i campi datanascita e anniserv.


Attenzione. Un altro prompt che talvolta compare è

  '>


Questo vuol dire che nella riga precedente avete aperto degli apici, per inserire una stringa, senza poi chiuderli. Finché non inserite un altro apice, il sistema continuerà a riprovorvi questo prompt, e tutto quello che digitate (compresi i caratteri di "andata a capo") verrà a far parte della stringa. Nella maggior parte dei casi, quando vi trovate in questa situazione, avete sbagliato qualcosa. La soluzione migliore, allora, è premere prima un apice (per chiudere la stringa) e poi terminare il comando con \c invece che con il punto e virgola. Se un comando termina con \c esso non viene eseguito.

Talvolta è interessante vedere non il contenuto della tabella, ma la descrizione dei campi che la compongono. Si possono allora usare i seguenti comandi:
Ad esempio, DESCRIBE dipendenti restituisce il seguente risultato:
+-------------+------------+------+-----+---------+-------+
| Field       | Type       | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| codfiscale  | char(16)   | NO   | PRI | NULL    |       |
| nome        | char(30)   | YES  |     | NULL    |       |
| cognome     | char(30)   | YES  |     | NULL    |       |
| datanascita | date       | YES  |     | NULL    |       |
| anniserv    | int(11)    | YES  |     | 0       |       |
+-------------+------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
I campi field e type sono autoesplicativi.  Il campo Null indica se il corrispondente attributo può assumere valori nulli oppure no, il campo Key specifica qual è la chiave primaria della tabella, e il campo Default indica i valori di default dei vari attributi. Vedremo in futuro il significato del campo Extra.

Per quanto riguarda l'output del comando SHOW CREATE TABLE dipendenti, ci sono da notare due cose:
  1. l'output è "sporcato" dalla presenza di vari caratteri che dovrebbero costituire l'intelaiatura di una tabella (come in DESCRIBE <nometabella>) ma che, a causa della dimensione eccessiva di quest'ultima, si trasformano solo in fonte di confusione; lo stesso inconveniente si verifica anche con il comando SELECT quando si vuole visualizzare un tabella dotata di troppe colonne;
  2. il comando visualizzato non è lo stesso di quello che è stato dato per creare la tabella, perché vengono visualizzati anche i parametri opzionali (come default) che avevamo omesso.
Per quanto riguarda il primo problema, è possibile risolverlo sostituendo al punto e virgola finale la combinazione \G. Questa indica al monitor MySQL di visualizzare il risultato del comando in un altro formato, più adatto nel caso di tabelle particolarmente "larghe". Ad esempio, confrontare l'output normale di SELECT * FROM dipendenti con quello qui di seguito:
mysql> SELECT * FROM dipendenti\G
*************************** 1. row ***************************
 codfiscale: codfisc1
       nome: mario
    cognome: rossi
datanascita: 1960-12-03
   anniserv: 1
*************************** 2. row ***************************
 codfiscale: codfisc2
       nome: mario
    cognome: bianchi
datanascita: NULL
   anniserv: 0
2 rows in set (0.00 sec)

Errori e Warnings

Se a MySQL viene fornito un comando non valido, si verifica un errore che viene visualizzato sullo schermo. Ad esempio, questo è quello che succede se diamo un comando inesistente come ls o prxy. Talvolta si verifica nella esecuzione di un comando una condizione anomala ma non critica, per cui il comando viene eseguito lo stesso ma vengono generati dei warning (avvertimenti). Ad esempio, il comando

INSERT INTO dipendenti VALUES ('codfisc3','mario','rossi','1960-2-31',2);

genera un warning, causato dal fatto che non esiste il 31 febbraio 1960. I warning non vengono visualizzati automaticamente, ma solo la loro presenza e il loro numero viene segnalato.

Due utili comandi per operare con errori e warning sono:

Ad esempio:

mysql> INSERT INTO dipendenti VALUES ('codfisc3','mario','rossi','1960-2-31',2);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------------+
| Level   | Code | Message                                          |
+---------+------+--------------------------------------------------+
| Warning | 1265 | Data truncated for column 'datanascita' at row 1 |
+---------+------+--------------------------------------------------+
1 row in set (0.00 sec)

In alternativa, il comando WARNINGS (o il sinonimo \W) dice al monitor di MySQL di visualizzare automaticamente i warnings quando si verificano. Il contrario è NOWARNING (o il sinonimo \w), che ripristina il comportamento di default.

Il comando HELP

Su MySQL è diponibile un comodo comando di aiuto: HELP. Esistono vari modi per utilizzarlo:

Interfacce utente grafiche

Oltre al programma monitor, esistono altre interfacce utente per MySQL, alcune delle quali sviluppate dalla stessa MySQL AB. Queste interfacce, spesso di tipo grafico, facilitano il lavoro con MySQL, consentendo di effettuare gran parte delle operazioni di amministrazione da un ambiente più confortevole che non la linea di comando.

Tra queste interfacce grafiche, quelle installate in aula informatizzata sono:

Ovviamente, come nel caso del monitor di MySQL, è possibile collegarsi a un server remoto: basta specificare il nome del computer a cui collegarsi, nome utente e password (se necessaria) da usare per il collegamento.

In realtà queste applicazioni sono state dismesse e sostituite con una applicazione molto più versatile denominata MySQL Workbench.

Infine, un'applicazione molto utilizzata per accedere ai server MySQL è phpMyAdmin. Si tratta di una applicazione web, da utilizzare con un browser, e quindi richiede la presenza sul computer di un software che faccia da server web. A causa di ciò l'installazione di phpMyAdmin potrebbe non essere tra le più semplici (ma io non lo uso, quindi non so darvi informazioni precise).

Lezione Precedente Elenco Lezioni Lezione Successiva

Valid HTML 4.01 Transitional Valid CSS!