back to top

Le Viste (o Views) in MySQL

Le Viste (o Views) sono uno strumento per la rappresentazione dei dati in MySQL. In pratica possiamo pensare ad una Vista come se fosse una sorta di "tabella temporanea" il cui scopo è di presentare determinati dati in un determinato modo. Esattamente come le tabelle, infatti, le Viste sono composte da colonne e righe le quali, però, sono il frutto di una query che è stata memorizzata, all’interno del database, in qualità di oggetto.

Views: quando e perchè utilizzarle?

Il vantaggio principale delle Views attiene alla sicurezza dei dati: grazie all’implementazione di apposite Viste, infatti, è possibile limitare l’accesso ai dati contenuti in una tabella, specificando le singole colonne o i singoli record che si desidera rendere accessibili. In questo modo è come se si creasse una specie di "tabella virtuale" la quale assume una certa indipendenza (relativamente alle politiche di accesso) rispetto alla tabelle fisica ad essa sottostante.

Un altro caso frequente di utilizzo delle Views consiste nella possibilità di memorizzare in esse query molto complesse (frutto di JOIN o UNION) oppure query di rappresentazione di dati fisicamente non presenti in alcuna tabella, ma calcolati partendo da altri dati. In questi casi lo strumento View diventa una sorta di "scorciatoia" per accedere rapidamente a questo tipo di interrogazioni.

Creare un View in MySQL

Per creare una View in MySQL è necessario utilizzare il comando CREATE VIEW seguito dal nome della vista che desideriamo creare e da una serie di altre opzione che, a breve, illustreremo.

E’ importante precisare che il nome deve essere univoco nel database, quindi non sarà possibile, ad esempio, chiamare una vista utilizzando un nome già utilizzato per una tabella.

La sintassi di base per la creazione di una Vista è la seguente:

CREATE VIEW nome_vista lista_colonne AS ...

Dove al posto dei tre puntini di sospensione dovremo scrivere la query di SELECT che vogliamo memorizzare nella Vista.

Facciamo un esempio. Supponiamo di voler creare una Vista per limitare le colonne accessibili su una data tabella:

CREATE VIEW amici_maschi AS
SELECT nome, email FROM amici WHERE sesso = 'M';

Così facendo abbiamo creato la nostra Vista sulla tabella "amici" limitando l’accesso alle sole colonne "nome" ed "email".

Volendo possiamo anche specificare, dopo il nome della vista, l’elenco dei nomi per i campi della nostra vista: ovviamente è necessario che questi siano dello stesso numero dei campi indicati all’interno della SELECT. Ad esempio:

CREATE VIEW amici_maschi (nome_amico, email_amico) AS
SELECT nome, email FROM amici WHERE sesso = 'M';

Viste aggiornabili e non aggiornabili

Una Vista si dice aggiornabile quando consente di modificare, per il tramite di essa, i dati nella tabella sottostante.

Per essere aggiornabile, la Vista deve possedere un rapporto uno ad uno con la tabella sottostante, quindi la SELECT che genera la View:

  • NON può utilizzare DISTINCT;
  • NON può contenere subquery e/o espressioni nella lista delle colonne selezionate;
  • NON può far ricorso funzioni di aggregazione;
  • NON può contenere UNION e JOIN (salvo alcune eccezioni);

Quando una vista è aggiornabile, pertanto, possiamo utilizzarla non solo per modificare, ma anche per inserire dati nella tabella sottostante (purché contenga tutte le colonne di tale tabella che non hanno un valore di default).

Quando abbiamo a che fare con viste aggiornabili è opportuno inserire, alla fine dell’istruzione con la quale creiamo la Vista, la clausola WITH CHECK OPTION con la quale, in pratica, chiediamo al DBMS di verificare che inserimenti o modifiche di record siano conformi alla definizione della Vista (siano, cioè, conformi all’eventuale clausola WHERE specificata in sede di definizione della Vista).

Facciamo un esempio supponendo di voler inserire, all’interno della nostra Vista "amici_maschi", un nuovo record nella tabella "amici". Per farlo modifichiamo leggermente la View contemplando un nuovo campo:

CREATE VIEW amici_maschi AS
SELECT nome, email, sesso FROM amici WHERE sesso = 'M';

Ora effettuiamo una INSERT INTO direttamente nella View:

INSERT INTO amici_maschi (nome,email,sesso) VALUES ('Roberta','[email protected]','F');

Così facendo stiamo cercando di inserire in tabella un record escluso dalla nostra Vista essendo quest’ultima limitata agli amici di sesso maschile.

Se avessimo aggiunto la clausola WITH CHECK OPTION in questo modo:

CREATE VIEW amici_maschi AS
SELECT nome, email, sesso FROM amici WHERE sesso = 'M'
WITH CHECK OPTION;

avremmo ricevuto un errore, in quanto il DBMS avrebbe rilevato che il nuovo record era incompatibile con la definizione della View.

Definire il proprietario della View

Come già visto nelle lezioni precedenti riguardanti Procedure e Triggers, è possibile definire, mediante la clasuola DEFINER l’utente proprietario di una View. In mancanza di questa indicazione, il DBMS ne assegnerà la titolarità all’utente corrente (è come se avessimo dichiarato esplicitamente DEFINER = CURRENT_USER).

Vediamo un esempio:

CREATE DEFINER=`nomeutente`@`localhost` VIEW ...

Interrogare una View in MySQL

Accedere ad una Vista è semplicissimo: funzionando quest’ultima esattamente come una comune tabella, sarà sufficiente effettuare una SELECT. Nel caso della nostra Vista, pertanto, utilizzeremo:

SELECT * FROM amici_maschi;

Aggiornare una View in MySQL

Una volta creata, una Vista può anche essere aggiornata aggiungendo la clausola OR REPLACE subito dopo CREATE, in questo modo:

CREATE OR REPLACE VIEW amici_maschi AS
SELECT nome, telefono FROM amici SESSO = 'M';

Oppure, in alternativa, è possibile utilizzare il comando ALTER VIEW in questo modo:

ALTER VIEW amici_maschi AS
SELECT nome, telefono FROM amici;

La differenza tra i due comandi dovrebbe essere intuitiva: mentre ALTER VIEW può essere utilizzato solo per modificare una Vista esistente, con CREATE OR REPLACE VIEW possiamo non solo modificare, ma anche creare la Vista se questa ancora non esiste.

Eliminare una View in MySQL

Nel momento in cui una Vista non fosse più utile, è possibile eliminarla mediante il comando DROP VIEW seguito dal nome della View che si desidera rimuovere. Ad esempio:

DROP VIEW amici_maschi;

Anche in sede di eliminazione delle View è possibile aggiungere la clausola IF EXISTS in questo modo:

DROP VIEW IF EXISTS amici_maschi;
Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

In questa guida...