MySQL
VISTA
Ricerca…
Sintassi
CREATE VIEW view_name AS SELECT nome_colonna FROM nome_tabella WHERE condition; /// Semplifica la sintassi della vista
CREARE [O SOSTITUIRE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = {utente | CURRENT_USER}] [SQL SECURITY {DEFINER | INVOKER}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]; /// Full Create view syntax
DROP VIEW [IF EXISTS] [db_name.] View_name; /// Drop view sintassi
Parametri
parametri | Dettagli |
---|---|
view_name | Nome della vista |
SELECT statement | Dichiarazioni SQL da impacchettare nelle viste. Può essere un'istruzione SELECT per recuperare i dati da una o più tabelle. |
Osservazioni
Le viste sono tabelle virtuali e non contengono i dati restituiti. Possono salvarti dalla scrittura di query complesse ancora e ancora.
- Prima che una vista venga resa specifica, la sua specificazione consiste interamente in un'istruzione
SELECT
. L'istruzioneSELECT
non può contenere una sottoquery nella clausola FROM. - Una volta che una vista è fatto è usato in gran parte proprio come un tavolo e può essere
SELECT
cata dal proprio come un tavolo.
Devi creare viste, quando vuoi limitare alcune colonne della tua tabella, dall'altro utente.
- Ad esempio: nella propria organizzazione, si desidera che i gestori visualizzino poche informazioni da una tabella denominata "Vendite", ma non si desidera che i tecnici del software possano visualizzare tutti i campi della tabella "Vendite". Qui puoi creare due diverse viste per i tuoi manager e i tuoi ingegneri del software.
Prestazioni VIEWs
sono zucchero sintattico. Tuttavia, la performance può essere o meno peggiore della query equivalente con la selezione della vista inserita. Lo Strumento di ottimizzazione tenta di eseguire questo "inserimento" per te, ma non sempre ha esito positivo. MySQL 5.7.6 fornisce ulteriori miglioramenti nello Strumento di ottimizzazione. Ma, a prescindere, l'utilizzo di una VIEW
non genererà una query più veloce .
Crea una vista
privilegi
L'istruzione CREATE VIEW richiede il privilegio CREATE VIEW per la vista e alcuni privilegi per ogni colonna selezionata dall'istruzione SELECT. Per le colonne utilizzate altrove nell'istruzione SELECT, è necessario avere il privilegio SELECT. Se è presente la clausola OR REPLACE, è necessario disporre anche del privilegio DROP per la vista. CREATE VIEW potrebbe anche richiedere il privilegio SUPER, a seconda del valore DEFINER, come descritto più avanti in questa sezione.
Quando si fa riferimento a una vista, si verifica il controllo dei privilegi.
Una vista appartiene a un database. Per impostazione predefinita, viene creata una nuova vista nel database predefinito. Per creare esplicitamente la vista in un determinato database, utilizzare un nome completo
Per esempio:
db_name.view_name
mysql> CREATE VIEW test.v AS SELECT * FROM t;
Nota: all'interno di un database, le tabelle di base e le viste condividono lo stesso spazio dei nomi, pertanto una tabella di base e una vista non possono avere lo stesso nome.
A VISTA può:
- essere creato da molti tipi di istruzioni SELECT
- fare riferimento alle tabelle di base o ad altre viste
- usa join, UNION e sottoquery
- SELECT non deve nemmeno fare riferimento a nessuna tabella
Un altro esempio
L'esempio seguente definisce una vista che seleziona due colonne da un'altra tabella e un'espressione calcolata da tali colonne:
mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
restrizioni
- Prima di MySQL 5.7.7, l'istruzione SELECT non può contenere una sottoquery nella clausola FROM.
- L'istruzione SELECT non può fare riferimento a variabili di sistema o variabili definite dall'utente.
- All'interno di un programma memorizzato, l'istruzione SELECT non può fare riferimento a parametri del programma o variabili locali.
- L'istruzione SELECT non può fare riferimento ai parametri dell'istruzione preparati.
- Qualsiasi tabella o vista cui fa riferimento la definizione deve esistere. Dopo aver creato la vista, è possibile rilasciare una tabella o visualizzarla
la definizione si riferisce a. In questo caso, l'uso della vista provoca un errore. Per verificare la definizione di una vista per problemi di questo tipo, utilizzare l'istruzione CHECK TABLE. - La definizione non può fare riferimento a una tabella TEMPORARY e non è possibile
crea una vista TEMPORANEA. - Non è possibile associare un trigger a una vista.
- Gli alias per i nomi delle colonne nell'istruzione SELECT vengono confrontati con la lunghezza massima della colonna di 64 caratteri (non l'alias massimo
lunghezza di 256 caratteri). - A
VIEW
può o non può ottimizzare così come l'equivalenteSELECT
. È improbabile che l'ottimizzazione sia migliore.
Una vista da due tavoli
Una vista è molto utile quando può essere utilizzata per inserire dati da più di una tabella.
CREATE VIEW myview AS
SELECT a.*, b.extra_data FROM main_table a
LEFT OUTER JOIN other_table b
ON a.id = b.id
Nelle viste mysql non si materializzano. Se ora esegui la query semplice SELECT * FROM myview
, mysql eseguirà effettivamente LEFT JOIN dietro la scena.
Una vista creata una volta può essere unita ad altre viste o tabelle
Aggiornamento di una tabella tramite VISTA
A VIEW
funziona molto come un tavolo. Sebbene tu possa UPDATE
una tabella, potresti o non riuscire ad aggiornare una vista in quella tabella. In generale, se la SELECT
nella vista è abbastanza complessa da richiedere una tabella temporanea, UPDATE
non è consentito.
Cose come GROUP BY
, UNION
, HAVING
, DISTINCT
e alcune subquery impediscono l'aggiornamento della vista. Dettagli nel manuale di riferimento .
DROPPARE UNA VISTA
- Creare e rilasciare una vista nel database corrente.
CREATE VIEW few_rows_from_t1 AS SELECT * FROM t1 LIMIT 10;
DROP VIEW few_rows_from_t1;
- Creare e rilasciare una vista che fa riferimento a una tabella in un altro database.
CREATE VIEW table_from_other_db AS SELECT x FROM db1.foo WHERE x IS NOT NULL;
DROP VIEW table_from_other_db;