BANCHE DATI E MYSQL INTRODUZIONE A MYSQL - DOTT. ING. IVAN FERRAZZI V1.1 DEL 05/02/2014
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
Dott.Ing.Ivan Ferrazzi
Banche dati
e
MySQL
Introduzione
a
MySQL
Dott. Ing. Ivan Ferrazzi
V1.1 del 05/02/2014
1/39Dott.Ing.Ivan Ferrazzi
Copyright ©2014 Dott.Ing. Ivan Ferrazzi
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License, Version 1.2 or any later version published by the
Free Software Foundation; with no Invariant Sections, no
Front-Cover Texts, and no Back-Cover Texts.
2/39Dott.Ing.Ivan Ferrazzi
Indice generale
INTRODUZIONE....................................................................................................4
La banca dati...................................................................................................4
Database Management System (DBMS)..........................................................5
Programmi applicativi......................................................................................5
Database relazionali...........................................................................................6
Le tabelle.........................................................................................................6
Il concetto di “chiave primaria”.......................................................................7
Gli indici...........................................................................................................7
Le forme di normalizzazione...............................................................................9
La prima forma normale (prima normalizzazione)...........................................9
La seconda forma normale (seconda normalizzazione).................................10
La terza forma normale (terza normalizzazione)...........................................11
Sistema client-server........................................................................................13
MySQL..............................................................................................................14
La shell di MySql............................................................................................14
La gestione degli utenti e dei permessi.........................................................16
La gestione delle banche dati........................................................................18
La gestione delle tabelle................................................................................19
La gestione dei record...................................................................................27
Inserire record con INSERT INTO...........................................................................................27
Modificare record con UPDATE..............................................................................................28
Eliminare record con DELETE FROM.....................................................................................28
La proiezione con il comando SELECT...........................................................29
Il blocco WHERE.....................................................................................................................31
Il blocco ORDER BY................................................................................................................33
Il blocco LIMIT.........................................................................................................................33
Il blocco GROUP BY................................................................................................................34
Il blocco HAVING....................................................................................................................34
Le relazioni con LEFT JOIN, RIGHT JOIN, FULL JOIN e INNER JOIN..............................36
Le subquery...................................................................................................38
Le subquery nel blocco WHERE..............................................................................................38
Le subquery nel blocco FROM.................................................................................................38
3/39Dott.Ing.Ivan Ferrazzi
INTRODUZIONE
Il termine banca dati viene comunemente utilizzato per indicare un archivio nel
quale viene memorizzata una notevole quantità di dati. Da un punto di vista
tecnico, però, il sistema di archiviazione è composto da più elementi, ossia una
banca dati, un Database Management System (DBMS) ed un'eventuale
programma applicativo (programma con il quale lavora l'utente finale).
Le singole parti sono strutturate in modo tale da consentire l'inserimento, la
cancellazione, la modifica e l'estrapolazione dei dati stessi.
Al giorno d'oggi è diventato ormai indispensabile avvalersi di questi sistemi per
l'organizzazione dei dati, basti pensare a quanto sia utile poter immagazzinare i
dati di un censimento all'interno di una banca dati. Tutto ciò permette di
risparmiare tonnellate di carta e di velocizzare la ricerca dei dati, che altrimenti
sarebbe lenta e laboriosa.
La banca dati.
Come banca dati (o sistema di archiviazione) si intende, quindi, il metodo
tecnico utilizzato per la memorizzazione dei dati e gli algoritmi di
velocizzazione e ottimizzazione delle singole operazioni, come l'inserimento, la
modifica, oppure l'eliminazione di dati od insieme di essi. Inoltre, fa parte della
banca dati, anche il tipo di memorizzazione della struttura della tabella, dei
campi e degli eventuali indici (discussi in seguito).
4/39Dott.Ing.Ivan Ferrazzi
Database Management System (DBMS).
Il Database Management System è il software in grado di gestire la banca dati.
Infatti, la banca dati ed il Database Management System sono due cose ben
distinte.
Il DBMS è il software che permette di interagire con i dati archiviati all'interno
della banca dati.
Paragonato al mondo reale possiamo utilizzare il seguente semplice esempio:
Se vediamo un bambino in spiaggia giocare con delle conchiglie, le conchiglie
potrebbero rappresentare il database, mentre il bambino che le maneggia,
sarebbe il Database Management System.
L'utilizzo di un DBMS facilita anche la condivisione di un singolo archivio
all'interno di una rete informatica. In questo caso un computer può mettere a
disposizione il servizio di banca dati mediante un DBMS Server ad altri
computer collegati alla stessa rete informatica forniti di un DBMS Client.
Questo sistema permette di alleggerire i computer Client centralizzando tutte
le operazioni su un'unica banca dati presente su un computer Server.
Un aspetto particolare riguarda l' autorizzazione per l'accesso ai dati, in quanto
il DBMS dovrà essere dotato di un sistema di protezione, i dati contenuti nelle
tabelle del database dovranno essere accessibili solo alle persone autorizzate.
L'autorizzazione dovrà quindi essere assegnata dall'amministratore di sistema.
Programmi applicativi.
I database sono strutturati in modo tale da poter essere utilizzati da programmi
applicativi, che possono interagire con essi.
I programmi applicativi possono essere scritti in diversi linguaggi (es. C, C++,
Java, Visualbasic, PHP, ecc.) e mettono a disposizione dell'utente un'interfaccia
grafica semplice con la quale è possibile gestire le varie operazioni
(inserimento, modifica e cancellazione) per una corretta gestione dei dati
memorizzati.
5/39Dott.Ing.Ivan Ferrazzi
Database relazionali
I database relazionali utilizzano come struttura principale per la
memorizzazione dei dati le tabelle. Una tabella, così come la conosciamo da
Excel, oppure Calc, è composta da colonne e righe, dove la singola colonna
contiene dati di formato uguale e la singola riga dati che appartengono ad un
insieme logico. Potremo avere, come esempio, una tabella composta dalle
colonne Cognome, Nome ed Indirizzo, mentre nelle singole righe troviamo i
dati, che insieme, forniscono un'informazione logica (dati di una persona).
Questa tipologia di database viene chiamata relazionale, perché permette di
mettere in relazione due o più tabelle. L'insieme dei dati Cognome, Nome e
Indirizzo appartenente alla tabella clienti può essere messo in relazione con
l'insieme dei dati Articolo, Quantità e Prezzo appartenente alla tabella acquisti.
Le tabelle
Le tabelle sono gli elementi fondamentali per l'organizzazione dei dati in un
database relazionale. La struttura di una tabella viene definita tramite l'utilizzo
dei campi (chiamati anche attributi), che descrivono quello che sarà il
contenuto di una colonna. I campi possono essere definiti mediante valori
numerici, geometrici, relativi a date, a tempo oppure alfabetici.
La scelta del tipo di campo, ossia contenitore per i nostri dati, è fondamentale
per una efficace progettazione di un database. Con una corretta definizione del
tipo di colonna si può rendere un database veloce ed economico (in termini di
byte).
Immaginate di essere il responsabile di un magazzino, facciamo di un
ferramenta. Vi viene dato il compito di organizzare i prodotti in modo che
6/39Dott.Ing.Ivan Ferrazzi
occupino il minor spazio possibile, che siano organizzati per tipo e che sia il più
facile possibile trovarli.
In magazzino vi viene messo a disposizione uno scaffale e una vasta gamma di
contenitori che potrete utilizzare per portare a termine l'incarico che vi è stato
dato. Una delle possibilità che avete è quella di prendere tutti gli articoli
(bulloni, viti, rondelle, chiavi e tutti gli altri oggetti del caso) e di gettarli in un
unico contenitore molto grande. Lo spazio utilizzato è relativamente poco ed il
tempo utilizzato per l'archiviazione di un nuovo articolo è quasi inesistente,
perché basta metterlo nell'unico contenitore esistente. Il tempo che però viene
utilizzato per estrarre dal contenitore un articolo che stiamo cercando è molto
elevato.
Se volete un magazzino veramente efficiente dovete fare attenzione a queste
regole: per oggetti piccoli, piccoli contenitori, per oggetti grandi, grandi
contenitori, oggetti di forma particolare, contenitori adatti all’oggetto.
La cosa sembra ovvia, ma in un database, questa situazione può rendere una
applicazione più o meno efficiente, e nei nostri “scaffali digitali” la scelta del
tipo di contenitore di dati può essere fatta in modo ancora più precisa, non solo
per le loro dimensioni ma anche per il loro utilizzo.
L'insieme logico di dati presenti all'interno di una tabella (ossia la singola riga)
viene chiamata record.
Il concetto di “chiave primaria”
La chiave primaria è un campo, oppure un'insieme di campi, che permettono di
identificare univocamente un record di una tabella. All'interno della medesima
tabella non possono esistere due record con un uguale valore assegnato
all'interno del campo, o dei campi, che definiscono la chiave primaria.
La chiave primaria di una tabella può essere formata da uno o più campi. Una
chiave primaria definita da più campi viene comunemente chiamata chiave
composta.
Nel caso di chiave composta il valore viene dato dalla combinazione dei campi
coinvolti. L'utilizzo di una chiave primaria all'interno di una tabella è
consigliabile, ma non obbligatorio.
Gli indici
Un indice è un sistema che permette di avere un ordinamento logico di dati
strutturato in maniera tale da ottimizzarne la ricerca dei contenuti. Nei libri, ad
esempio, utilizziamo un indice per cercare un preciso capitolo.
In una tabella l'indice viene creato automaticamente con la chiave primaria,
utilizzando la medesima come valore di ordinamento. Dopo ogni operazione,
quindi inserimento, modifica, oppure eliminazione di un record, l'intero
contenuto dove essere riordinato per chiave primaria. L'aggiunta di un indice
ha come risultato l'ottimizzazione di ricerche effettuate su valori all'interno di
esso.
7/39Dott.Ing.Ivan Ferrazzi
Nei libri tecnici troviamo a volte degli indici che permettono di trovare le
pagine all'interno delle quali appare una determinata parola, un determinato
diagramma o del specifico materiale fotografico.
Così come è possibile aggiungere ulteriori indici (oltre a quello principale) ai
libri è possibile aggiungere anche ulteriori indici alle tabelle. Un'operazione su
una tabella avrà come effetto l'aggiornamento di tutti gli indici usati. La ricerca
di un valore all'interno di un qualsiasi campo può diventare molto veloce, ma
l'aggiornamento o l'inserimento di nuovi record potrebbe diventare molto
laborioso. Si consiglia quindi di utilizzare gli indici con criterio dato che ogni
indice aggiunto, oltre al rallentamento di operazioni base, occupa spazio
prezioso sul disco fisso.
8/39Dott.Ing.Ivan Ferrazzi
Le forme di normalizzazione
La normalizzazione è una procedura con la quale si elimina la ridondanza e il
rischio di inconsistenza dei dati all'interno delle tabelle di un database. Creare
una struttura di banca dati con le strutture delle tabelle ed i contenuti che non
tengono conto delle forme di normalizzazione può essere quindi molto
rischioso. Esistono varie forme di normalizzazione, ma ci limiteremo a spiegare
le prime tre forme principali.
La prima forma normale (prima normalizzazione).
Una tabella si trova in prima forma normale quando:
● ogni riga della tabella contiene lo stesso numero di colonne;
● ogni valore presente all'interno della stessa colonna è dello stesso tipo
(numerico, stringa, data, ecc.);
● ogni campo (ossia colonna) dell'intera tabella contiene dei valori che in
base al loro utilizzo non possono essere ulteriormente scomponibili;
● esiste almeno un campo definito come chiave primaria.
Prendiamo come esempio una tabella che contiene dei semplici contatti (il
campo sottolineato, quindi Nr, è definito come chiave primaria):
Nr Cognome Nome Data di nascita
1 Rossi Mario 01/05/1958
2 Verdi Alberto 05/09/1988
9/39Dott.Ing.Ivan Ferrazzi
Se utilizziamo il campo Data di nascita solo come campo per la memorizzazione
della data di nascita possiamo dire di avere una tabelle che si trova in prima
forma normale. Nel momento in cui si volesse utilizzare il campo Data di
nascita per metterlo in relazione con la tabella Segni dello Zodiaco e dare
quindi la possibilità al sistema di estrarre in automatico il relativo segno dello
Zodiaco di ogni nostro contatto in base al mese di nascita non avremmo più
una tabella che si trova in prima forma normale.
In questo caso dobbiamo scomporre nelle sue parti elementari anche il campo
Data di nascita come segue:
Nr Cognome Nome Giorno Mese Anno
1 Rossi Mario 01 05 1958
2 Verdi Alberto 05 09 1988
Ora abbiamo una tabella che, in base al suo utilizzo, si trova in prima forma
normale.
La seconda forma normale (seconda normalizzazione).
Una tabella si trova nella seconda forma normale quando le regole della prima
forma normale sono rispettate e tutti i campi definiti come non-chiave primaria
dipendono dall'intera chiave primaria.
Prendiamo la seguente tabella come esempio:
Articoli
CodArticolo Descrizione Giacenza Magazzino Locazione magazzino
0001 maglia 130 M10 Via Mascialli 2
0002 jeans 65 M11 Via Gramsci 10
0003 cappello 100 M10 Via Mascialli 2
In questo caso abbiamo una chiave primaria composta dai campi CodArticolo e
Magazzino. Come possiamo notare questa tabella si trova in prima forma
normale.
Per motivi logistici dobbiamo ora spostare il magazzino identificato dal codice
M10 da Via Mascialli 2 a Via Roma 4. Questa modifica va naturalmente
apportata anche alla nostra tabella. Dopo aver dato al sistema il comando per
l'aggiornamento del campo Locazione magazzino come desiderato, inizia
l'elaborazione. Modificato il primo record corrispondente (nel nostro caso
l'articolo con il codice 0001) il sistema va in crash. L'elaborazione non è
riuscita, quindi, a raggiungere il terzo record che andava a sua volta modificato
come il primo. Il contenuto della nostra tabella è ora il seguente:
10/39Dott.Ing.Ivan Ferrazzi
Articoli
CodArticolo Descrizione Giacenza Magazzino Locazione magazzino
0001 maglia 130 M10 Via Roma 4
0002 jeans 65 M11 Via Gramsci 10
0003 cappello 100 M10 Via Mascialli 2
Come possiamo notare esiste ora un'incongruenza tra il primo ed il terzo
record. Per portare questa tabella in seconda forma normale dobbiamo
suddividerla in due tabelle diverse. Questo è naturalmente possibile solo in
caso di chiave primaria composta, come nel nostro caso.
Si otterranno quindi le seguenti tabelle
Articoli Magazzini
CodArticolo Magazzino Descrizione Giacenza Magazzino Locazione
0001 M10 maglia 130 M10 Via Roma 4
0002 M11 jeans 65 M11 Via Gramsci 10
0003 M10 cappello 100
La terza forma normale (terza normalizzazione).
Una tabella si trova in terza forma normale quando le regole delle prime due
forme normali sono rispettate e tutti i campi non-chiave dipendono dalla chiave
primaria.
Prendiamo come esempio la seguente tabella
Alunni
Matricola Cognome Nome Scuola Indirizzo scuola
MA0001 Rossi Mario ITC Marini Via Garibaldi 2
MA0002 Verdi Alberto Liceo Classico A Via Leopardi 8
MA0003 Albertini Rosa ITC Marini Via Garibaldi 2
Come possiamo notare non tutti i campi non-chiave dipendono dalla chiave
primaria Matricola. Il campo Indirizzo scuola, infatti, non dipende dal campo
Matricola, ma dal campo Scuola che non fa parte della chiave primaria.
Per portare la tabella in terza forma normale dobbiamo anche qui suddividerla
in due tabelle, ossia
Alunni Scuole
Matricola Cognome Nome Scuola Scuola Indirizzo
11/39Dott.Ing.Ivan Ferrazzi
MA0001 Rossi Mario ITC Marini ITC Marini Via Garibaldi 2
MA0002 Verdi Alberto Liceo A Liceo A Via Leopardi 8
MA0003 Albertini Rosa ITC Marini
12/39Dott.Ing.Ivan Ferrazzi
Sistema client-server
Il sistema client-server è un metodo con il quale si possono condividere
applicazioni in rete.
Questo sistema si ha quando esiste un computer detto server che mette a
disposizione un servizio ed almeno un computer detto client che usufruisca di
esso.
Come precedentemente accennato un DBMS (Database Management System)
può fungere da servizio server, e mettere quindi a disposizione il servizio di
condivisione database su una rete informatica, o da client. Il database, ossia
l'intero sistema di tabelle ed i loro contenuti, viene installato sul rispettivo
server, mentre gli altri computer in rete ne utilizzano le risorse mediante DBMS
installato come client.
Tutte le operazioni richieste vengono quindi inviate mediante connessione tra
DBMS client e server, il server ne elabora il risultato che poi viene mandato al
client utilizzando la medesima connessione.
13/39Dott.Ing.Ivan Ferrazzi
MySQL
Mysql è il database opensource più famoso al mondo, perché gratuito,
qualitativamente buono e viene messo a disposizione su un qualsiasi
webserver con sistema operativo GNU/Linux, oppure Microsoft.
La shell di MySql.
Il DBMS di MySql viene messo a disposizione mediante una semplice shell,
ossia un ambiente da prompt di comandi che permette di interagire
direttamente con il sistema.
Sia su sistemi operativi GNU/Linux, che su sistemi Microsoft, il programma per
far partire il prompt dei comandi di MySql è mysql. Il comando viene
normalmente utilizzato come segue
mysql [-h host] [-u utente [-p[password]]] [database] [-N] [-e “query”]
-h host Questo parametro permette di definire il computer in rete al
quale vogliamo connetterci, quindi al computer che funge da
server MySql. Il valore host può essere inserito come nome della
macchina oppure come indirizzo IP. Nel caso in qui questo
parametro venisse omesso verrà tentata la connessione al
computer localhost, ossia il computer sul quale si sta lavorando.
-u utente Questo parametro permette di definire il nome dell'utente con il
quale si vuole effettuare la connessione alla banca dati. Nel caso
in cui l'utente necessiti di password per accedere al servizio è
indispensabile utilizzare il parametro p.
Omettendo il parametro u (e quindi p) il sistema cercherà di
14/39Dott.Ing.Ivan Ferrazzi
connettersi utilizzando root come utente privo di password.
-p[password] Questo parametro permette a MySql di visualizzare la richiesta di
inserimento password una volta confermato il comando. La
richiesta non viene visualizzata se si passa la password
direttamente all'interno della riga di comando. Attenzione! La
password va inserita direttamente dopo l'opzione -p senza
lasciare spazi.
database E' possibile scegliere la banca dati alla quale vogliamo
connetterci.
-e “query” Questo parametro permette di eseguire una query inclusa tra
virgolette e mostrare il risultato direttamente all'interno del
terminale. Questa opzione può essere utilizzata in caso di
redirect del risultato di una query.
-N Questo parametro permette di disabilitare la visualizzazione della
riga di intestazione nei risultati delle query inviate con -e.
Un altro comando molto utile è mysqldump che stampa all'interno dello standard
output del terminale i comandi MySQL che descrivono la banca dati in
questione. Possiamo sfruttare mysqldump per realizzare delle copie di sicurezza o
per migrare la nostra banca dati da un server ad un altro. Il comando viene
normalmente utilizzato come segue
mysqldump [-h host] [-u utente [-p[password]]] database [tabella1...tabellaN]
-h host Questo parametro permette di definire il computer in rete al
quale vogliamo connetterci, quindi al computer che funge da
server MySql. Il valore host può essere inserito come nome della
macchina oppure come indirizzo IP. Nel caso in qui questo
parametro venisse omesso verrà tentata la connessione al
computer localhost, ossia il computer sul quale si sta lavorando.
-u utente Questo parametro permette di definire il nome dell'utente con il
quale si vuole effettuare la connessione alla banca dati. Nel caso
in cui l'utente necessiti di password per accedere al servizio è
indispensabile utilizzare il parametro -p.
Omettendo il parametro -u (e quindi -p) il sistema cercherà di
connettersi utilizzando root come utente privo di password.
-p[password] Questo parametro permette a MySql di visualizzare la richiesta di
inserimento password una volta confermato il comando. La
richiesta non viene visualizzata se si passa la password
direttamente all'interno della riga di comando. Attenzione! La
password va inserita direttamente dopo l'opzione -p senza
lasciare spazi.
database E' possibile scegliere la banca dati della quale vogliamo creare il
dump.
Tabella1...N E' possibile indicare il nome delle tabella che vogliamo includere
all'interno del nostro dump.
Per creare un file dump della nostra banca dati come backup e/o migrazione da
15/39Dott.Ing.Ivan Ferrazzi
Per creare un file dump della nostra banca dati come backup e/o migrazione da
un server ad un altro è possibile effettuare il redirect dello standard output
verso un file come segue
mysqldump -u pippo -p12345 db_test > dump_db_test.sql
Questo comando creerà il file dump_db_test.sql all'interno della cartella attuale
che conterrà la struttura della banca dati db_test alla quale si accede con
utente pippo e password 12345.
La gestione degli utenti e dei permessi.
Mysql permette una capillare gestione degli utenti. All'installazione del
programma ci verrà chiesto di inserire la password di root, cioè l'utente
amministratore di sistema. L'utente root avrà il “potere” di creare nuovi utenti
e di dare loro la possibilità (o meno) di eseguire determinate operazioni, a
partire da semplici richieste di informazioni contenute all'interno di determinate
tabelle, fino alla loro completa eliminazione. L'utente root, essendo
amministratore, non ha limiti di operabilità.
Per creare un utente utilizziamo il seguente comando:
CREATE USER utente[@host] [IDENTIFIED BY 'password'];
utente Questo parametro permette di definire il nome del nuovo utente
che si vuole creare.
host Questo parametro permette di definire il nome del computer,
l'indirizzo IP oppure la rete dalla quale l'utente avrà il permesso
di connettersi al server MySql. Nel caso in cui si omette questo
parametro l'utente viene registrato con il valore ' %', ossia può
accedere da una qualsiasi postazione in rete.
password Identifica la password che l'utente dovrà utilizzare per effettuare
una corretta connessione. Se omettiamo questo parametro
l'utente rimane privo di password.
Alcuni esempi sono:
CREATE USER pippo@localhost IDENTIFIED BY 'pippopwd';
CREATE USER pluto IDENTIFIED BY 'pluto123';
CREATE USER paperino@192.168.1.34 IDENTIFIED BY 'pap12345';
Per cancellare un utente dal sistema utilizziamo il comando:
DROP USER utente[@host];
utente Questo parametro permette di definire il nome dell'utente che si
desidera eliminare.
16/39Dott.Ing.Ivan Ferrazzi
host Il medesimo utente può avere il diritto di connettersi al server
MySql da più postazione. Con questo parametro definiamo
l'utente che vogliamo eliminare in base al nome del computer,
l'indirizzo IP oppure la rete dalla quale effettua la connessione.
Nel caso in cui si omette questo parametro viene eliminato
l'utente indipendentemente dalla sua posizione di accesso.
Dopo aver creato un'utente possiamo assegnarli i diritti di accesso sulle varie
operazioni possibili all'interno del sistema MySql con il seguente comando:
GRANT permesso ON database.tabella TO utente[@host];
permesso Questo parametro permette di definire il permesso che si vuole
assegnare all'utente desiderato (vedi seguente tabella).
database Permette di definire la banca dati alla quale fanno riferimento i
permessi assegnati. Con il valore * assegniamo i permessi a tutte
le banche dati disponibili.
tabella Permette di definire la tabella all'interno della banca dati
specificata alla quale fanno riferimento i permessi assegnati. Con
il valore * assegniamo i permessi a tutte le tabelle della banca
dati (o di tutte le banche dati se utilizzato il valore *) in
questione.
utente Questo parametro permette di definire l'utente al quale verranno
assegnati i vari permessi.
host Permette di definire il nome del computer, l'indirizzo IP oppure la
rete dell'utente al quale si vuole assegnare i vari permessi.
I permessi principali che si possono assegnare con l'utilizzo di questo comando
sono elencati nella seguente tabella. La colonna a sinistra contiene il codice da
utilizzare come permesso, mentre quella a destra contiene i comandi per i quali
si ottiene il permesso di esecuzione.
Permesso Comandi utilizzabili
ALL tutte esclusa GRANT
ALTER ALTER TABLE
CREATE CREATE TABLE
CREATE TEMPORARY TABLES CREATE TEMPORARY TABLE
CREATE VIEW CREATE VIEW
DELETE DELETE
DROP DROP TABLE
INDEX CREATE INDEX, DROP INDEX
INSERT INSERT
LOCK TABLES LOCK TABLES
SELECT SELECT
SHOW VIEW SHOW CREATE VIEW
17/39Dott.Ing.Ivan Ferrazzi
UPDATE UPDATE
USAGE nessuna
GRANT OPTION GRANT, REVOKE
CREATE USER CREATE USER, DROP USER, RENAME USER, REVOKE ALL
PRIVILEGES
FILE SELECT ... INTO OUTFILE, LOAD DATA INFILE
PROCESS SHOW FULL PROCESSLIST
RELOAD FLUSH
SHOW DATABASES SHOW DATABASES
SHUTDOWN mysqladmin shutdown
SUPER KILL, SET GLOBAL
Così come è possibile assegnare dei permessi ci viene data anche la possibilità
di revocare eventuali permessi con il seguente comando:
REVOKE permesso ON database.tabella FROM utente[@host];
Per la descrizione dei parametri si fa riferimento al comando GRANT.
La gestione delle banche dati.
Come prima cosa creiamo una banca dati inserendo un nome che la
identificherà in futuro. La banca dati che creiamo diventerà il “contenitore” di
tutte le tabelle che inseriremo successivamente.
Per semplificare la comprensione dei vari comandi MySql creiamo un esempio
pratico da seguire passo dopo passo. Come esempio prendiamo la gestione dei
lettori, dei libri, degli autori, così come del noleggio di una biblioteca.
Il comando che utilizziamo per la creazione della banca dati è il seguente:
CREATE DATABASE [IF NOT EXISTS] nome [CHARACTER SET caratteri];
IF NOT EXISTS Permette di creare il database solamente se non esiste.
nome Permette di definire il nome della banca dati che vogliamo
creare.
caratteri Permette di aggiungere il charset che il database deve utilizzare
(es. utf-8).
Nel nostro caso la banca dati si chiamerà biblioteca, quindi digitiamo:
CREATE DATABASE biblioteca;
A livello globale MySql ci mette a disposizione altri comandi che possono
essere utili per una completa gestione del sistema.
Possiamo, infatti, eliminare una banca dati non più utilizzata, o creata
18/39Dott.Ing.Ivan Ferrazzi
erroneamente, con il comando DROP DATABASE come segue:
DROP DATABASE [IF EXISTS] nome;
IF EXISTS Permette di definire eliminare la banca dati solamente se
effettivamente esiste.
nome Permette di definire il nome della banca dati da eliminare.
Per visualizzare un elenco di tutte le banche dati attualmente presenti
all'interno del nostro sistema digitiamo:
SHOW DATABASES;
La gestione delle tabelle.
Prima di iniziare a gestire le nostre tabelle è indispensabile effettuare una
connessione alla banca dati con la quale vogliamo lavorare. Se ci siamo appena
collegati al server MySql e non abbiamo ancora effettuato nessuna connessione
ad una banca dati presente possiamo utilizzare il comando:
CONNECT database;
database Permette di definire il nome della banca dati alla quale vogliamo
connetterci, e quindi, con la quale vogliamo lavorare.
Nel caso in cui fossimo già connessi ad una banca dati possiamo utilizzare il
comando use per spostarci all'interno di un'altra banca dati come segue:
USE database;
database Permette di definire il nome della banca dati alla quale vogliamo
connetterci, e quindi, con la quale vogliamo lavorare.
Nel nostro esempio possiamo quindi digitare:
CONNECT biblioteca;
Tutte le operazioni che effettueremo da ora in poi verranno eseguito sulla
banca dati biblioteca.
Per creare una nuova tabella utilizziamo il comando CREATE TABLE come
segue:
CREATE TABLE [IF NOT EXISTS] tabella (
campo1 tipo_dato1 opzione1,
campo2 tipo_dato2 opzione2,
campo3 tipo_dato3 opzione3,
...
19/39Dott.Ing.Ivan Ferrazzi
PRIMARY KEY(campo1[,campo2]),
[FOREIGN KEY (campo1[,campo2])
REFERENCES tabella(campo1[,campo2])
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
]
);
tabella Permette di definire il nome della nuova tabella che vogliamo
creare.
campoX Permette di definire il nome del campo da utilizzare all'interno
della tabella.
tipo_datoX Permette di definire il tipo di dato che verrà inserito all'interno
del campo (vedi seguente tabella).
opzioneX Permette di assegnare al campo in questione ulteriori
caratteristiche. Quelle più usate sono AUTO_INCREMENT (solo per
campi numerici), che definisce campi il cui valore viene
automaticamente incrementato di 1 ad ogni nuovo record
aggiunto, NULL, che permette valori vuoti all'interno del campo
stesso, NOT NULL, che non permette l'inserimento di valori vuoti
all'interno di questo campo, DEFAULT (valore), che permette di
definire il valore di default utilizzato nel caso in cui il valore del
campo non venisse specificato con l'utilizzo del comando INSERT
INTO, PRIMARY KEY, che inserito come opzione definisce solo quel
campo come chiave primaria, ed infine, ZEROFILL (solo per campi
numerici), che riempie lo spazio a sinistra del valore numerico nel
campo di zeri fino all'esaurimento della memoria assegnata.
Esempio: se si inserisce in una colonna definita con INT(10)
ZEROFILL il valore 755, il database visualizzerà 0000000755.
Il blocco FOREIGN KEY permette di definire il campo (o i campi) che fanno
riferimento al campo (o i campi) della chiave primaria di un'altra tabella
(REFERENCES …). Le opzioni aggiuntive ON UPDATE e ON DELETE permettono di
indicare come MySQL deve comportarsi in caso di modifica oppure eliminazione
di record che stanno in relazione con questa tabella. I valori che possiamo
utilizzare sono
RESTRICT La modifica della chiave primaria sulla tabella principale oppure
l'eliminazione del relativo record esclude operazioni sulla tabella
in relazione.
CASCADE La modifica della chiave primaria sulla tabella principale oppure
l'eliminazione del relativo record ha come conseguenza la
modifica dei dati nella tabella in relazione oppure l'eliminazione
del record di riferimento.
SET NULL La modifica della chiave primaria sulla tabella principale oppure
l'eliminazione del relativo record ha come conseguenza
l'inserimento di campi nulli all'interno della tabella di riferimento.
NO ACTION Stesso di RESTRICT.
20/39Dott.Ing.Ivan Ferrazzi
MySql ci mette a disposizione tipi di dati numerici, oppure di stringa. I tipi di
dati che possiamo utilizzare per definire dei campi numerici sono i seguenti:
TINYINT Può contenere da valori che vanno da -128 a 127. Se al campo
viene assegnata la proprietà UNSIGNED, potranno essere
memorizzati soltanto numeri positivi con un valore compreso tra
0 e 255. La memoria occupata sarà di 1 byte.
SMALLINT Può contenere valori che vanno da -32.768 a 32.767. Se al
campo viene assegnata la proprietà UNSIGNED, potranno essere
memorizzati soltanto numeri positivi con un valore compreso tra
0 e 65.535. La memoria occupata sarà di 2 byte.
MEDIUMINT Può contenere valori che vanno da -8.388.608 a 8.388.607. Se al
campo viene assegnata la proprietà UNSIGNED, potranno essere
memorizzati soltanto numeri positivi con un valore compreso tra
0 e 16.777.215. La memoria occupata sarà di 3 byte.
INT Può contenere valori che vanno da -2.147.483.648 a
2.147.483.647. Se al campo viene assegnata la proprietà
UNSIGNED, potranno essere memorizzati soltanto numeri positivi
con un valore compreso tra 0 e 4.294.967.295. La memoria
occupata sarà di 4 byte.
BIGINT Può contenere valori che vanno da -9.223.372.036.854.775.808 a
9.223.372.036.854.775.807. Se al campo viene assegnata la
proprietà UNSIGNED, potranno essere memorizzati soltanto numeri
positivi compresi tra 0 e 18.446.744.073.709.550.615. La
memoria occupata sarà di 8 byte.
FLOAT(M,D) Può contenere numeri con virgola mobile. Il parametro M definisce
il numero di cifre prima della virgola, mentre D definisce il
numero di cifre dopo la virgola. I decimali contenuti dopo la
virgola saranno arrotondati per difetto. La memoria occupata
sarà di 4 byte.
DOUBLE(M,D) Può contenere numeri con virgola mobile. Il parametro M definisce
il numero di cifre prima della virgola, mentre D definisce il
numero di cifre dopo la virgola. I decimali contenuti dopo la
virgola saranno arrotondati per difetto. La memoria occupata
sarà di 8 byte.
DECIMAL(M,D) Può contenere numeri con virgola mobile. Il parametro M definisce
il numero di cifre prima della virgola, mentre D definisce il
numero di cifre dopo la virgola. I decimali contenuti dopo la
virgola saranno arrotondati per difetto. La memoria occupata
sarà di M + 2 byte.
I tipi di dati che possiamo utilizzare per definire dei campi stringa sono i
seguenti:
CHAR(C) Può contenere caratteri alfanumerici, fino ad una lunghezza
massima di 255 caratteri. La lunghezza massima del valore
inserito nella colonna viene definita dal parametro C. Nel caso in
21/39Dott.Ing.Ivan Ferrazzi
cui il valore inserito fosse di lunghezza inferiore alla lunghezza
massima definita, lo spazio fisico occupato sul disco fisso sarebbe
comunque quello definito dalla lunghezza massima.
Esempio: In un campo definito con CHAR(10) inseriamo la parola
'ciao'. Nonostante la parola inserita sia di 4 byte (1 byte per
carattere) lo spazio fisico occupato sarebbe comunque di 10
byte.
VARCHAR(C) Può contenere caratteri alfanumerici, fino ad una lunghezza
massima di 255 caratteri. La lunghezza massima del valore
inserito nella colonna viene definita dal parametro C. Nel caso in
cui il valore inserito fosse di lunghezza inferiore alla lunghezza
massima definita lo spazio fisico occupato sul disco fisso sarebbe
quello pari alla lunghezza del valore più un carattere che
determina la fine della stringa.
Ritornando all'esempio precedente abbiamo: In un campo
definito con VARCHAR(10) inseriamo la parola 'ciao'. Lo spazio
fisico occupato sarebbe quindi 4 byte (1 byte per carattere del
valore inserito) + 1 byte (carattere '\0' che definisce la chiusura
della stringa) per uno spazio complessivo di 5 byte.
Il tipo VARCHAR occupa, quindi, meno spazio, ma è più lento da
gestire rispetto al tipo CHAR. Si consiglia quindi di utilizzare VARCHAR
solamente nei casi in cui la lunghezza del valore non fosse fissa o
conosciuta dall'inizio (ad esempio nel caso di cognomi, nomi,
indirizzi, ecc.).
TINYTEXT Può contenere caratteri alfanumerici, fino a 255 caratteri. La
memoria occupata è di (lunghezza) + 1.
TINYBLOB Può contenere caratteri alfanumerici, fino a 255 caratteri. La
memoria occupata è di (lunghezza) + 1.
TEXT Può contenere caratteri alfanumerici, fino a 65.535 caratteri. La
memoria occupata è di (lunghezza) + 2.
BLOB Può contenere caratteri alfanumerici, fino a 65.535 caratteri. La
memoria occupata è di (lunghezza) + 2.
MEDIUMTEXT Può contenere caratteri alfanumerici, fino a 16.777.215 caratteri.
La memoria occupata è di (lunghezza) + 3.
MEDIUMBLOB Può contenere caratteri alfanumerici, fino a 16.777.215 caratteri.
La memoria occupata è di (lunghezza) + 3.
LONGTEXT Può contenere caratteri alfanumerici, fino a 4.294.967.295
caratteri. La memoria occupata è di (lunghezza) + 4.
LONGBLOB Può contenere caratteri alfanumerici, fino a 4.294.967.295
caratteri. La memoria occupata è di (lunghezza) + 4.
I tipi di campo BLOB sono classificati case sensitive, perché sensibili alle lettere
maiuscole, a differenza dei tipi di campo TEXT. Bisogna, quindi, fare molta
attenzione ad utilizzare i tipi di campo BLOB: “mysql” e “MySQL” vengono gestiti
come due valori diversi.
DATETIME Memorizza la data e l'ora, compresa di minuti e secondi. Il
22/39Dott.Ing.Ivan Ferrazzi
formato che viene utilizzato è 'YYYY-MM-DD HH:MM:SS' e può
assumere valori che vanno da '1000-01-01 00:00:00' a '9999-12-31
23:59:59'.
DATE Memorizza la data nel formato 'YYYY-MM-DD' e può assumere valori
che vanno da '1000-01-01' a '9999-12-31'.
TIME Memorizza l’ora e può assumere valori che vanno da '-838:59:59'
a '838:59:59'.
YEAR Memorizza l’anno nel formato 'YYYY' e può assumere valori che
vanno da '1901' a '2155'.
TIMESTAMP(N) Memorizza in modo automatico ad ogni record inserito, la data e
l'ora correnti. Il parametro N permette di definire il formato del
valore memorizzato come segue:
TIMESTAMP(14) per memorizzare YYYY-MM-DD HH:MM:SS
TIMESTAMP(12) per memorizzare YY-MM-DD HH:MM:SS
TIMESTAMP(10) per memorizzare YY-MM-DD HH:MM
TIMESTAMP(8) per memorizzare YYYY-MM-DD
TIMESTAMP(6) per memorizzare YY-MM-DD
TIMESTAMP(4) per memorizzare YY-MM
TIMESTAMP(2) per memorizzare YY
ENUM(lista) Permette di definire una lista di valori possibili per il campo in
questione. I valori vengono inseriti tra apici e separati da virgole.
Possiamo, ad esempio, definire un campo per la memorizzazione
dei valori SI/NO come segue: ENUM ('S','N'). Un campo definito
con l'utilizzo di questo tipo può comunque contenere anche il
valore nullo.
La lista fornita come parametro può contenere fino ad un
massimo di 65.535 voci. Inoltre è molto importante ricordare che
l'elaborazione di queste colonne è più rapida rispetto a quelle che
definiscono i campi di stringa, come VARCHAR, TEXT, ecc.
SET(lista) Uguale al tipo di campo ENUM con l'unica differenza nel poter
definire fino ad un massimo di 64 voci come lista di valori
possibili.
E' possibile creare una nuova tabella basandosi sulla struttura di una tabella già
esistente. In questo caso possiamo scrivere
CREATE TABLE nuova_tabella LIKE vecchia_tabella;
Tornando al nostro esempio di gestione di biblioteca abbiamo ora bisogno di
creare le quattro tabelle che ci accompagneranno per tutto il nostro percorso: i
lettori, gli autori, i libri ed il noleggio. La struttura delle tabelle verrà tenuta il
più semplice possibile. Non tentiamo, quindi, di mettere in piedi un esempio
qualitativamente pratico, ma semplice dal punto di vista della comprensione.
Digitiamo quindi:
CREATE TABLE lettori (
IDLettore INT(11) NOT NULL AUTO_INCREMENT,
Cognome VARCHAR(30),
23/39Dott.Ing.Ivan Ferrazzi
Nome VARCHAR(20),
Data_nascita DATE,
PRIMARY KEY (IDLettore)
);
La prima tabella che abbiamo creato è la tabella per la memorizzazione dei
lettori. Il numero che permetterà di identificare il lettore ( PRIMARY KEY) viene
memorizzato all'interno del campo IDLettore il cui valore non potrà mai essere
nullo (NOT NULL) e aumenterà automaticamente ad ogni nuovo inserimento
(AUTO_INCREMENT).
CREATE TABLE autori (
IDAutore INT(11) NOT NULL AUTO_INCREMENT,
Cognome VARCHAR(30),
Nome VARCHAR(20),
Data_nascita DATE,
PRIMARY KEY (IDAutore)
);
La seconda tabelle che abbiamo creato è la tabella per la memorizzazione degli
autori. La struttura è identica a quella utilizzata per i lettori.
CREATE TABLE libri (
IDLibro INT(11) NOT NULL AUTO_INCREMENT,
IDAutore INT(11),
Titolo VARCHAR(50),
Genere ENUM ('Romanzo','Giallo','Horror'),
PRIMARY KEY (IDLibro),
FOREIGN KEY (IDAutore) REFERENCES autori(IDAutore)
ON DELETE CASCADE
ON UPDATE CASCADE
);
La terza tabella che abbiamo creato è la tabella libri. Il campo che permetterà
di identificare il libro univocamente (PRIMARY KEY) è il campo IDLibro, che non
potrà contenere valori nulli (NOT NULL) e verrà incrementato automaticamente
ad ogni nuovo inserimento (AUTO_INCREMENT). Un campo molto importante è
IDAutore che conterrà il valore IDAutore della tabella autori dell'autore che ha
scritto il libro (per semplificare gestiamo libri scritti da un solo autore). Questo
campo verrà, quindi, utilizzato per mettere in relazione questa tabella con la
tabella autori. La relazione la definiamo con FOREIGN KEY definendo che la
cancellazione o la modifica dell'autore avrà come conseguenza la cancellazione
o la modifica dei relativi libri.
Inoltre notiamo il campo Genere definito come ENUM che permette di limitare a
Romanzo, Giallo e Horror i generi di libro che possono essere inseriti.
CREATE TABLE noleggi (
IDNoleggio INT(11) NOT NULL AUTO_INCREMENT,
DataNoleggio DATE,
IDLibro INT(11),
IDLettore INT(11),
Riportato ENUM ('S','N') DEFAULT ('N'),
PRIMARY KEY (IDNoleggio),
24/39Dott.Ing.Ivan Ferrazzi
FOREIGN KEY (IDLibro) REFERENCES libri(IDLibro)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (IDLettore) REFERENCES lettori(IDLettore)
ON DELETE CASCADE
ON UPDATE CASCADE
);
L'ultima tabella che abbiamo creato è la tabella noleggi che permette di
memorizzare i vari noleggi che vengono effettuati durante il periodo di
gestione. IDNoleggio è il numero progressivo che permetterà di identificare il
noleggio effettuato, mentre DataNoleggio permetterà la memorizzazione della
data di quando il noleggio è avvenuto.
IDLibro e IDLettore conterranno i valori dei rispettivi campi dalle tabelle libri e
lettori, permetteranno, quindi, di mettere in relazioni le due tabelle. Il campo
riportato, che può contenere solamente i valori 'S' oppure 'N', viene utilizzato
per memorizzare la riconsegna del libro. Se questo valore non viene definito
all'interno del comando INSERT INTO il valore inserito sarà 'N' (DEFAULT).
Per eliminare un'eventuale tabella non più utilizzata o creata erroneamente
possiamo utilizzare il seguente comando:
DROP TABLE [IF EXISTS] tabella[, tabella];
tabella Permette di definire il nome della tabella da eliminare.
E' anche possibile rinominare una tabella esistente con
RENAME TABLE vecchia_tabella TO nuova_tabella[, v_tabella2 TO n_tabella2];
Il seguente comando permette di elencare tutte le tabelle presenti all'interno
della banca dati alla quale ci siamo connessi:
SHOW TABLES;
Una volta certi della presenza di una tabella ne possiamo verificare la propria
struttura con il comando:
DESCRIBE tabella;
oppure
DESC tabella;
tabella Permette di definire il nome della tabella per la quale visualizzare
la struttura su schermo.
Il comando che permette di alterare la struttura della tabella nelle sue singole
parti è ALTER TABLE. L'utilizzo di questo comando ha come conseguenza la
rielaborazione dei record in base all'operazione richiesta e non la loro
25/39Dott.Ing.Ivan Ferrazzi
cancellazione.
Per motivi di complessità del comando stesso ci limitiamo a trattare solamente
le forme più utilizzate, ossia ADD, per aggiungere nuovi campi, CHANGE, per
modificare campi esistenti, e DROP, per eliminare campi indesiderati:
ALTER TABLE tabella ADD [COLUMN] campo tipo_dato [AFTER campo2];
tabella Permette di definire il nome della tabella per la quale verrà
effettuata la modifica.
campo Permette di definire il nome del campo da aggiungere alla
tabella.
tipo_dato Permette di definire il tipo di dato per il quale verrà utilizzato il
campo (vedi CREATE TABLE).
campo2 Normalmente il nuovo campo viene inserito come ultimo campo
della tabella. Possiamo usare AFTER per definire il campo
attualmente presente all'interno della tabella dopo il quale verrà
inserito il nuovo campo.
ALTER TABLE tabella CHANGE [COLUMN] campo_v campo_n tipo_dato;
tabella Permette di definire il nome della tabella per la quale verrà
effettuata la modifica.
campo_v Permette di definire il nome del campo per il quale dovrà avere
effetto la modifica.
campo_n Permette di definire il nuovo nome da assegnare al campo
campo_v. Se vogliamo lasciare invariato il nome e modificare
solamente il tipo di dato avremo campo_n che sarà uguale al valore
di campo_v.
tipo_dato Permette di definire il nuovo tipo di dato che vogliamo assegnare
al campo in questione.
ALTER TABLE tabella DROP [COLUMN] campo;
tabella Permette di definire il nome della tabella per la quale verrà
effettuata la modifica.
campo Permette di definire il nome del campo che vogliamo eliminare.
Per tornare al nostro esempio poniamo il caso di esserci dimenticato del campo
CAP all'interno della tabella per la memorizzazione dei lettori. Per il campo CAP
utilizziamo il tipo di dato CHAR(5). Per modificare la rispettiva tabella scriviamo:
ALTER TABLE lettori ADD COLUMN CAP CHAR(5);
Utilizziamo il comando
DESCRIBE lettori;
per verificare la nuova struttura della tabella in questione.
26/39Dott.Ing.Ivan Ferrazzi
La gestione dei record.
Una volta create le tabelle desiderate possiamo proseguire con la gestione dei
record. Come gestione dei record si intenda l'inserimento di nuovi record, la
modifica di record esistenti e/o l'eventuale eliminazione di record non più
utilizzati.
Inserire record con INSERT INTO
Per effettuare l'inserimento di un nuovo record usiamo il seguente comando:
INSERT INTO tabella (campo1,campo2,...,campoN)
VALUES (valore1,valore2,...,valoreN);
tabella Permette di definire il nome della tabella all'interno della quale si
vuole aggiungere il record desiderato.
campoX Permette di definire il nome del campo X per il quale si vuole
aggiungere il valore X.
valoreX Permette di definire il valore da assegnare al campo X. Il valore
va aggiunto tra apici (') se il campo è di tipo testuale (es. CHAR,
VARCHAR, DATE, ecc.) e senza apici in caso di tipo numerico (es.
FLOAT, INT, ecc.).
Inseriamo ora i seguenti record alla tabella autori del nostro esempio:
INSERT INTO autori (Cognome,Nome,Data_nascita)
VALUES ('Rossi','Mario','1958-01-31');
INSERT INTO autori (Cognome,Nome,Data_nascita)
VALUES ('Verdi','Antonio','1945-03-16');
Con questi due comandi inseriamo due autori all'interno della rispettiva tabella.
Notiamo l'omissione del campo IDAutore, non necessario perché definito come
AUTO_INCREMENT (il valore viene incrementato automaticamente ad ogni nuovo
inserimento). Il sistema assegnerà quindi all'autore Rossi Mario il valore 1 come
IDAutore e all'autore Verdi Antonio il valore 2.
Aggiungiamo ora i seguenti libri:
INSERT INTO libri (IDAutore,Titolo,Genere)
VALUES (1,'Il mio Destino','Romanzo');
INSERT INTO libri (IDAutore,Titolo,Genere)
VALUES (1,'Non aprite quel portone','Horror');
INSERT INTO libri (IDAutore,Titolo,Genere)
VALUES (2,'Con le ali in mano','Romanzo');
INSERT INTO libri (IDAutore,Titolo,Genere)
VALUES (2,'Senza dubbio','Giallo');
Anche qui notiamo l'omissione del campo IDLibro perché definito come
AUTO_INCREMENT. Inoltre notiamo l'inserimento dei valori testuali (es. Titolo) con
gli apici, mentre il valore numerico (IDAutore) viene inserito senza.
Continuiamo a riempire anche le restanti tabelle come segue:
27/39Dott.Ing.Ivan Ferrazzi
INSERT INTO lettori (Cognome,Nome,Data_nascita)
VALUES ('Franceschi','Franco','1975-04-15');
INSERT INTO lettori (Cognome,Nome,Data_nascita)
VALUES ('Alberti','Alberto','1978-08-02');
INSERT INTO noleggi (DataNoleggio,IDLibro,IDLettore)
VALUES ('2009-01-16',1,1);
INSERT INTO noleggi (DataNoleggio,IDLibro,IDLettore)
VALUES ('2009-02-02',2,2);
Abbiamo quindi aggiunto due nuovi lettori che hanno a loro volta noleggiato un
libro a testa. Il primo ha noleggiato il libro con IDLibro uguale a 1, mentre il
secondo ha noleggiato il libro con IDLibro uguale a 2. Inoltre notiamo che
nell'inserimento dei record nella tabella dei noleggi possiamo omettere il valore
del campo Riportato perché definito con un valore di default (N).
Modificare record con UPDATE
Oltre all'inserimento dei record abbiamo anche la possibilità di modificare i
singoli valori presenti all'interno di ogni singolo record. Per modificare un
record usiamo:
UPDATE tabella SET campo1=valore1[,campo2=valore2,...] WHERE condizione;
tabella Permette di definire il nome della tabella all'interno della quale si
vuole modificare il record desiderato.
campoX Permette di definire il nome del campo X per il quale si vuole
modificare il valore X.
valoreX Permette di definire il valore da assegnare al campo X. Il valore
va aggiunto tra apici (') se il campo è di tipo testuale (es. CHAR,
VARCHAR, DATE, ecc.) e senza apici in caso di tipo numerico (es.
FLOAT, INT, ecc.).
criteri Permette di identificare il record per il quale si intende eseguire
la modifica. I criteri vengono definiti con la forma campo=valore. E'
possibile combinare in serie più criteri mediante AND o OR logico.
Nel momento in cui il primo lettore restituisca il suo libro possiamo modificare il
campo Riportato come segue:
UPDATE noleggi SET Riportato='S' WHERE IDLettore=1 AND IDLibro=1;
Eliminare record con DELETE FROM
Possiamo anche eliminare definitivamente da una tabella record non più
utilizzati. Se avessimo inserito il secondo noleggio per errore lo si potrebbe
eliminare con il comando:
DELETE FROM tabella WHERE criteri;
28/39Dott.Ing.Ivan Ferrazzi
tabella Permette di definire il nome della tabella dalla quale si vuole
eliminare il record.
criteri Permette di identificare il record che si vuole elminare. Anche qui
possiamo definire i criteri con la forma campo=valore. E' possibile
combinare in serie più criteri mediante AND o OR logico.
ossia
DELETE FROM noleggi WHERE IDLettore=2;
La proiezione con il comando SELECT.
Il comando SELECT permette di proiettare il contenuto di una o più tabelle sullo
schermo visualizzandone i contenuti a piacere. La struttura semplice del
comando è la seguente:
SELECT campo1,campo2,...,campoN FROM tabella;
campoX Permette di definire il nome del campo per il quale si vuole
visualizzare il valore dei record elencati. Possiamo utilizzare
anche l'asterisco (*) al posto dei singoli campi per visualizzare
sullo schermo tutti i campi disponibili.
tabella Permette di identificare la tabella dalla quale vogliamo elencare i
record contenuti.
Per visualizzare su schermo tutti i libri registrati all'interno della nostra banca
dati possiamo scrivere:
SELECT * FROM libri;
Il risultato sarà il seguente:
IDLibro IDAutore Titolo Genere
============================================================
1 1 Il mio Destino Romanzo
2 1 Non aprite quel portone Horror
3 2 Con le ali in mano Romanzo
4 2 Senza dubbio Giallo
Possiamo però limitare anche la proiezione dei campi definendoli direttamente
all'interno del blocco SELECT come segue:
SELECT Titolo,Genere FROM libri;
che avrà come risultato:
Titolo Genere
=====================================
Il mio Destino Romanzo
29/39Dott.Ing.Ivan Ferrazzi
Non aprite quel portone Horror
Con le ali in mano Romanzo
Senza dubbio Giallo
Per sapere quali sono i genere di libri che abbiamo registrato all'interno della
nostra banca dati possiamo scrivere:
SELECT Genere FROM libri;
Il risultato sarebbe il seguente:
Genere
========
Romanzo
Horror
Romanzo
Giallo
In questo caso, però, notiamo una ripetizione indesiderata. A noi interessa
sapere il genere dei libri che abbiamo; il valore Romanzo dovrebbe quindi venire
fuori una volta sola. Per questo motivo possiamo aggiungere al blocco SELECT la
direttiva DISTINCT che evita di estrarre valori doppi. Nel nostro esempio
possiamo usare:
SELECT DISTINCT Genere FROM libri;
per mostrare il risultato come segue:
Genere
========
Romanzo
Horror
Giallo
I valori dei campi che vengono utilizzati per la proiezione all'interno del blocco
SELECT possono essere elaborati mediante apposite funzioni. Una di queste è la
funzione CONCAT che permette di concatenare il valore di due o più campi
all'interno di un'unica colonna di risultato. Possiamo quindi mostrare il valore
dei campi Cognome e Nome proiettato all'interno di un'unica colonna come segue:
SELECT CONCAT(Cognome,Nome) FROM autori;
Il risultato verrebbe visualizzato su schermo come segue:
CONCAT(Cognome,Nome)
====================
RossiMario
VerdiAntonio
Nel risultato notiamo due cose che potrebbero dare fastidio. La prima è il titolo
della colonna CONCAT(Cognome,Nome) e la seconda è il concatenamento senza
spazi dei due valori Cognome e Nome (es. RossiMario).
30/39Puoi anche leggere