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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Dott.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/39
Puoi anche leggere