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’esempio
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 232 valori possibili
FLOAT = indica un numero reale a virgola mobile a precisione semplice. Rappresenta un numero tra 1.18
x10-38 e 3.40 x1038
DOUBLE = indica un numero reale a virgola mobile e precisione doppia. Rappresenta un numero tra 2.23
x10-308 e 1.80 x10308
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
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 McGraw 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