Le Views (termine tradotto in Italiano letteralmente con la parola "Viste"), sono delle tabelle temporanee, che si comportano come delle vere e proprie tabelle ma che in realtà non contengono "fisicamente" dati; esattamente come una qualsiasi altra tabella una View è formata da righe e colonne che però in questo caso sono il risultato di una query che viene archiviata come se fosse un oggetto.
Attraverso la creazione di una View non si fa altro che memorizzare il subset di una tabella esistente attraverso un processo di interrogazione del DBMS, questo subset permette di riferirsi alle proprietà e ai metodi dell'oggetto archiviato nello stesso modo in cui è possibile operare con una qualsiasi altra tabella.
Nel corso di questa breve trattazione descriveremo le caratteristiche delle Views, la procedura necessaria per la loro creazione, manipolazione e rimozione.
Views e restrizioni
Uno dei vantaggi connessi alle Views sta nel fatto che grazie ad esse è possibile aumentare il grado di sicurezza dei dati nel momento in cui vengono manipolati, infatti una View permette di modificare soltanto i dati ad essa relativi salvaguardando l'integrità generale dei records archiviati.
In pratica, la creazione di una View ci permette di imporre delle restrizioni sull'accesso ai dati e di limitare in questo modo l'azione delle interrogazioni soltanto a specifiche colonne di una tabella; lo stesso discorso può essere fatto per quanto riguarda le possibilità di accesso ai dati.
Semplificando possiamo dire che con una View è possibile limitare l'accesso a :
- delle specifiche colonne;
- dei records specifici;
- delle colonne e dei records specifici;
- dei subset specifici;
- delle statistiche relative ad una specifica tabella.
Vedremo tra breve quanto questa caratteristica delle Views sia particolarmente importante.
Creare una View: sintassi
MySQL consente di creare Views tramite il comando CREATE VIEW appositamente dedicato; la sintassi prevista per questo comando è la seguente:
CREATE VIEW nome_view [(lista_colonne)] [WITH ENCRYPTION] AS comando_select [WITH CHECK OPTION]
Analizziamo la sintassi proposta nei particolari:
- nome_view: è il nome che desideriamo assegnare alla View.
- lista_colonne: contiene l'elenco delle colonne che parteciperanno alla creazione della View; questa voce deve comprendere lo stesso numero di colonne che viene specificato nella parte relativa a "comando_select"; nel caso in cui la voce "lista_colonne" dovesse mancare CREATE VIEW farà riferimento a quelle indicate tramite "comando_select".
- WITH ENCRYPTION: permette di criptare il testo della View all'iterno della tabella syscomments.
- AS: specifica l'azione che dovrà essere compiuta dalla View.
- comando_select: è riferito alla query che definisce la View.
- WITH CHECK OPTION: è una clausola che viene applicata ai comandi per la modifica dei dai come INSERT e UPDATE per rispettare la definizione della View apportata tramite "comando_select".
Quando si crea una Vista è necessario tenere conto di alcune restrizioni:
- È possibile creare Views soltanto nel database corrente.
- Il nome della View deve seguire le regole imposte dall'IDENTIFIER del datasource.
- Il nome della View non deve essere lo stesso della tabella di partenza.
- È possibile creare una View solo se la tabella di partenza permette l'esecuzione di query SELECT.
- Non è possibile definire una View utilizzando il comando SELECT INTO.
- Non è possibile definire un trigger in una View.
- Non è possibile definire un indice all'interno di una View.
- Non è possibile associare CRATE VIEW ad altri comandi SQL nella stessa istruzione.
Creare una View: un esempio pratico
Supponiamo di avere a disposizione due tabelle di questo tipo:
mysql> SELECT * FROM Aziende; +------+---------------+----------+ | ID_a | Azienda | Sede | +------+---------------+----------+ | 1 | Rossi srl | Roma | | 2 | Bianchi srl | Milano | | 3 | Verdi srl | Bologna | | 4 | Neri srl | Cagliari | | 5 | Marroni srl | Roma | | 6 | Gialli srl | Roma | +------+---------------+----------+ 6 rows in set (0.00 sec) mysql> SELECT * FROM Prodotti; +---------+-------------+------+ | ID_p | Prodotto | ID_a | +---------+-------------+------+ | 111 | Mele | 1 | | 112 | Pere | 2 | | 113 | Cachi | 2 | | 114 | Mango | 3 | | 115 | Ciliegie | 5 | +---------+-------------+------+ 5 rows in set (0.00 sec)
Come sarà semplice notare, le due tabelle proposte ("Aziende" e "Prodotti") sono in relazione, infatti nella seconda tabella è contenuto un campo ("ID_a") presente anche nella prima; nella tabella "Prodotti", il campo "ID_a" funge da riferimento per assegnare a ciascun prodotto l'azienda produttrice il cui nome è archiviato nel campo "Azienda" della prima tabella.
Ora immaginiamo di voler operare su un'unica tabella che prenda in considerazione soltanto i record relativi alle aziende produttrici che hanno un riferimento anche all'interno della seconda tabella.
Quello che vogliamo ottenere è quindi una nuova tabella che conterrà i campi relativi all'ID_a dell'azienda, al loro nome e alla città in cui ogni produttore ha la sua sede.
Vediamo quindi qual dovrebbe essere l'istruzione necessaria per la creazione della nostra View:
mysql> CREATE VIEW View_Aziende AS -> SELECT * FROM Aziende -> WHERE ID_a IN ( -> SELECT ID_a FROM Prodotti) -> WITH CHECK OPTION; Query OK, 0 rows affected (0.05 sec)
Operando una semplice query di selezione su tutti i dati della tabella virtuale appena creata otterremo il seguente output:
mysql> SELECT * FROM View_Aziende; +------+---------------+----------+ | ID_a | Azienda | Sede | +------+---------------+----------+ | 1 | Rossi srl | Roma | | 2 | Bianchi srl | Milano | | 3 | Verdi srl | Bologna | | 5 | Marroni srl | Roma | +------+---------------+----------+ 4 rows in set (0.03 sec)
Come è possibile notare, il procedimento per la creazione di una View non è poi particolarmente difficile e i comandi SQL con i quali di può operare su di essa sono in pratica gli stessi (tranne alcune eccezioni dovute alle restrizioni imposte dal DBMS).
Volendo, potremo anche "raffinare" le nostre interrogazioni verso la tabella virtuale utilizzando ad esempio la clausola WHERE pienamente supportata:
mysql> SELECT * FROM View_Aziende WHERE Sede='Roma'; +------+---------------+----------+ | ID_a | Azienda | Sede | +------+---------------+----------+ | 1 | Rossi srl | Roma | | 5 | Marroni srl | Roma | +------+---------------+----------+ 2 rows in set (0.04 sec)
Alterazione di una View
Le tabelle virtuali possono essere alterate esattamente come quelle fisiche, a questo scopo esiste il comando ALTER VIEW che modifica la definizione di una View; la sintassi per l'alterazione di una Vista è la seguente:
ALTER VIEW nome_view [(lista_colonne)] [WITH ENCRYPTION] AS comando_select [WITH CHECK OPTION]
In questo caso non vi è nulla da segnalare di particolare, la sintassi per l'alterazione delle tabelle si differenzia da quella di creazione essenzialmente per il comando SQL utilizzato che in questo caso è ALTER VIEW.
Possiamo quindi proporre un esempio di alterazione basandoci sulle stesse tabelle utilizzate negli esempi precedenti:
mysql> ALTER VIEW View_Aziende AS -> SELECT Aziende.ID_a, Aziende.Azienda, Aziende.Sede, -> Prodotti.Prodotto from Aziende, Prodotti -> WHERE Aziende.ID_a=Prodotti.ID_a; Query OK, 0 rows affected (0.01 sec)
Dalla View ottenuta potremmo ricavare l'intero set di record con un semplice comando di selezione:
mysql> SELECT * FROM View_Aziende; +------+---------------+----------+-------------+ | ID_a | Azienda | Sede | Prodotto | +------+---------------+----------+-------------+ | 1 | Rossi srl | Roma | Mele | | 2 | Bianchi srl | Milano | Pere | | 2 | Bianchi srl | Milano | Cachi | | 3 | Verdi srl | Bologna | Mango | | 5 | Marroni srl | Rossi | Ciliegie | +------+---------------+----------+-------------+ 5 rows in set (0.02 sec)
La View così ottenuta dal processo di alterazione contiene anche una voce relativa ai prodotti elencati nella tabella "Prodotti" delle aziende elencate nella tabella "Aziende".
Eliminazione di una View
L'ultimo comando che analizzeremo è naturalmente quello relativo all'eliminazione di una Vista; in questo caso avremo a disposizione DROP VIEW dotato di una semplicissima sintassi:
DROP VIEW nome_view;
Per rimuovere la vista creata nei nostri esempi precedenti sarà quindi sufficiente utilizzare la breve istruzione:
mysql> DROP VIEW View_Aziende;