Introduzione a MySQL Cinzia Cappiello Alessandro Raffio Politecnico di Milano Prima di iniziare qualche dettaglio su MySQL MySQL è un sistema di gestione di basi di dati relazionali (RDBMS) composto da un insieme di relazioni MySQL è stabile e veloce MySQL comprende tutte le caratteristiche considerate più importanti dalla comunità delle basi di dati, quali: Transazioni Vincoli a livello di record Chiavi esterne Interrogazioni annidate Ricerca testuale MySQL esiste sia in forma gratuita che in forma commerciale. Ultima versione è MySQL 5.0 scaricabile all indirizzo: www.mysql.org/ 2 1
Preparazione Accesso all area condivisa Start Programs MySQL Avvio Server MySQL Start Programs MySQL Start MySQL Server Avvio Client MySQL Start Programs MySQL MySQL Client 3 Schema database d esempiod DATILIBRO (ISBN, Titolo, AnnoPubblicazione, CasaEditrice, PrimoAutore, Genere, Consigliato) Libro (Collocazione, ISBN, DataArchiviazione) Prestito (Collocazione, CodiceUtente, DataPrestito, DataRestituzione) Utente (Codice, Cognome, Nome, Indirizzo, Telefono) Commento (CodiceUtente, ISBN, commento, giudizio) 4 2
Creazione di basi di dati e tabelle Creazione del database Per creare un database si usano le istruzioni: mysql> create database nome database; Nel nostro esempio digitare il comando: mysql> create database biblioteca; Si può controllare che il comando ha funzionato digitando: mysql> show databases; nella lista delle basi di dati presenti nel sistema dovreste vedere anche la base di dati biblioteca 6 3
Selezione di una base di dati Prima di creare le tabelle, o fare qualsiasi operazione sul database è opportuno segnalare a MySQL che si intende utilizzare la base di dati creata. E necessario digitare: mysql> use nome database; Nel nostro esempio digitare il comando: mysql> use biblioteca; In questo modo la base di dati risulta selezionata e tutto quello che si fa da questo momento andrà a cambiare la base di dati selezionata 7 Creazione di una tabella Sintassi completa comando: mysql> create [temporary] table [if not exist] nome tabella [(definizioni_create)] [opzioni tabella] [comandi di selezione] Definizioni create - sintassi: nome_campo TIPO [NOT NULL NULL][DEFAULT valore_standard][auto_increment][primary key][definizione di chiave esterna (references)], Opzioni tabella - sintassi: type = tipo tabella; Per verificare la creazione di una tabella si può usare l istruzione: mysql> show tables; 8 4
Creazione di tabelle- tipi di tabelle MyISAM: tipo di tabelle standard, supportano la compressione ma non gestiscono le transazioni InnoDB: sono transaction-safe (proprietà ACIDe), supportano le transazioni e i lock di riga BDB (Berkeley DB): motore di memorizzazione che supporta transazioni e lock a livello di pagina HEAP: tabelle che vengono salvate interamente in memoria locale e mai su disco, sono molto veloci ma hanno dimensione limitata e non possono essere recuperate in caso di guasto del sistema 9 Creazione di tabelle Tipi di colonne e di dati MySQL Tipi numerici: vengono usati per salvare numeri NUMERIC o DECIMAL (DEC)= tipi esatti a virgola mobile, vengono di solito usati per le valute. Hanno lo stesso intervallo di valori dei numeri a virgola mobile INTEGER (INT) = indica l intero standard a 4 byte con un intervallo di 2 32 valori possibili FLOAT = indica un numero reale a virgola mobile a precisione semplice. Rappresenta un numero tra 1.18 x10-38 e 3.40 x10 38 DOUBLE = indica un numero reale a virgola mobile e precisione doppia. Rappresenta un numero tra 2.23 x10-308 e 1.80 x10 308 Tipi string o text: supporta diversi tipi di stringa o testo CHAR=memorizza stringhe di lunghezza fissa. Il tipo char è sempre seguito dalla specifica della lungezza della stringa. Es. char(20) VARCHAR=memorizza stringhe a lunghezza variabile TEXT o BLOB= servono per memorizzare testi più lunghi. BLOB indica un oggetto binario di grandi dimensioni. Entrambi memorizzano fino a 65535 caratteri. BLOB dovrebbe memorizzare dati binari più che testi veri e propri. ENUM=tipo che permette di enumerare una lista di valori possibili. Es: Genere enum ( m, f ) SET= simile a ENUM eccetto nel fatto che le righe possono contenere un insieme di valori della lista specificata Tipi date e time: DATE= formato AAAA-MM-GG TIME=formato HH:MM:SS DATETIME=formato AAAA-MM-GG HH:MM:SS TIMESTAMP=se non si inserisce nulla in questa colonna viene automaticamente memorizzato il momento in cui la riga viene modificata o inserita nel database YEAR= esiste in due varianti YEAR(2) o YEAR (4) 10 5
Esempio tabella DATILIBRO Nel nostro esempio, creare la tabella DATILIBRO (ISBN, Titolo, AnnoPubblicazione, CasaEditrice, PrimoAutore, Genere, Consigliato) mysql> create table DATILIBRO( ISBN varchar (20) NOT NULL, Titolo varchar (40), AnnoPubblicazione Year(2), CasaEditrice varchar (30), PrimoAutore varchar(30), Genere varchar (30), Consigliato enum ( s, n ), PRIMARY KEY (ISBN) ) type = InnoDB; 11 Esempio tabelle LIBRO e PRESTITO Libro (Collocazione, ISBN, DataArchiviazione) mysql> create table LIBRO( Collocazione varchar (20) NOT NULL, ISBN varchar (20) not null, DataArchiviazione Date, PRIMARY KEY (Collocazione) ) type = InnoDB; Utente (Codice, Cognome, Nome, Indirizzo, Telefono) mysql> create table Utente( Codice int NOT NULL auto_increment primary key, Cognome varchar (30), Nome varchar (30), Indirizzo varchar (40), Telefono varchar (15) ) type = InnoDB; 12 6
Esempio Tabelle Utente e Commento Prestito (Collocazione, CodiceUtente, DataPrestito, DataRestituzione) mysql> create table PRESTITO( Collocazione varchar (20) NOT NULL, Codiceutente int NOT NULL references utente(codice), DataPrestito Date NOT NULL, DataRestituzione Date, PRIMARY KEY (Collocazione, CodiceUtente, DataPrestito) ) type = InnoDB; Commento (CodiceUtente, ISBN, commento, giudizio) mysql> create table Commento( CodiceUtente int NOT NULL references utente(codice), ISBN varchar (20) not null, commento text, giudizio enum ( p, n ), PRIMARY KEY (CodiceUtente, isbn) ) type = InnoDB; 13 Visualizzazione schema di una tabella Il comando per visualizzare lo schema di una tabella: mysql> describe nome_tabella; es. describe datilibro; Il comando per caricare una base di dati da file di script: mysql> source nome_file; 14 7
Eliminazione di basi di dati Eliminazione intera basi di dati mysql> drop database nome_database; Eliminazione tabella- sintassi generale: mysql> drop [temporary] table [if exists] nome_tabella[, nome_tabella2, ]; 15 Modificare struttura della tabella Rinominare la tabella: mysql> ALTER TABLE nomevecchio_tabella RENAME nome_nuovo tabella; Aggiungere un nuovo campo alla tabella mysql> ALTER TABLE nome_tabella ADD nome TIPO; Eliminare un campo della tabella mysql> ALTER TABLE nome_tabella DROP nome; Modificare un attributo della tabella mysql> ALTER TABLE nome_tabella MODIFY nome_campovecchio nome_nuovocampo TIPO; Aggiungere una chiave mysql> ALTER TABLE nome_tabella ADD PRIMARY KEY (campo); 16 8
Inserimento, cancellazione e modifica dei dati Inserimento dati Per inserire righe in una tabella si usa il comando INSERT Le tabelle vengono popolate inserendo uno alla volta i record (tuple) che le compongono con le seguenti istruzioni: mysql> INSERT INTO nome_tabella VALUES ( contenuto primo campo, contenuto secondo campo, ); I valori di tipo stringa e di tipo data vanno inseriti tra apici, i valori numerici non vanno inclusi tra apici 18 9
Esempio di inserimento mysql> INSERT INTO datilibro VALUES ( 88-386-6030-1, basi di dati, 2003, Mc-Graw Hill, Atzeni, Informatica, n ), ( 88 386 0762-1, elementi di fisica, 1998, Pearson, Villa, Fisica, s ); mysql> INSERT INTO Libro VALUES ( INF3, 88-386-6030-1, 2003/11/10 ), ( FIS1, 88 386 0762-1, 1999/04/01 ); 19 Inserimento dati Per verificare che i dati siano stati inseriti usare l operazione di SELECT mysql> SELECT * FROM nometabella; Risoluzione problemi di conflitti con chiave primaria si utilizza il costrutto Replace: funziona come INSERT ma qualora si verificasse un conflitto su una chiave, la nuova riga andrebbe a sostituire quella vecchia mysql> REPLACE INTO nome_tabella VALUES ( contenuto primo campo, contenuto secondo campo, ); 20 10
Cancellazione dati Eliminazione di uno o più record da una tabella. Comando per cancellare tutte le righe di una tabella: mysql> DELETE FROM nome_tabella; Oppure mysql> TRUNCATE TABLE nome_tabella; Si possono specificare quali righe eliminare con l ausilio di una condizione WHERE. esempio mysql> DELETE FROM nome_tabella WHERE (casaeditrice= Mc-Graw Hill ); 21 Modifica dei dati Per modificare dati all interno della base di dati si può utilizzare il comando UPDATE con la seguente sintassi: mysql> UPDATE nome_tabella SET nome_col1=espressione1 [, nome_col2=espressione2, ] [WHERE condizione]; Esempio: mysql> UPDATE PRESTITO SET dataresa= 2005/11/29 WHERE collocazione= INF1 AND codiceutente=15 and dataprestito= 2005/10/15 ; 22 11
Interrogazioni in MySQL Interrogazioni semplici Interrogazioni semplici Selezionare tutti dati relativi ai clienti: mysql> SELECT * from utente; Selezionare solo alcune colonne, ad esempio titolo e autore dei libri presenti in biblioteca: mysql> SELECT titolo, autore from datilibro; Selezionare alcune righe usando la condizione WHERE. Ad esempio selezionare i titoli dei libri della Mc-Graw Hill: mysql> SELECT titolo from datilibro Where casaeditrice = mc-graw Hill ; 24 12
Interrogazioni semplici Utilizzo del costrutto COUNT. Esempio: visualizzare quanti prestiti ci sono stati nel mese di ottobre 2005 mysql> SELECT count(*) from prestito Where dataprestito >= 2005/10/01 and dataprestito <= 2005/10/31 ; Utilizzo del costrutto GROUP BY. Esempio: visualizzare quanti prestiti per libro ci sono stati mysql> SELECT count(*) as numero prestito, ISBN from prestito Group by ISBN; 25 Interrogazioni avanzate Utilizzo di join. Esempio: trovare i titoli dei libri di informatica presi a prestito nel giugno 2005 mysql> SELECT titolo from prestito join libro join datilibro Where prestito.collocazione = libro.collocazione and libro.isbn = datilibro.isbn and dataprestito >= 2005/06/01/ and dataprestito <= 2005/06/30 ; Utilizzo di query annidate. Esempio: Trovare i codici e i nomi degli utenti che non hanno mai preso in prestito libri di Informatica della Mc- Graw Hill mysql>select codice, nome, cognome from utente Where codice not in (SELECT codice utente join prestito join libro join datilibro Where utente.codice=prestito.codiceutente and prestito.collocazione = libro.collocazione and libro.isbn = datilibro.isbn and genere= informatica and casaeditrice= Mc-Graw Hill ; 26 13