Di Manoj Debnath
Le tabelle in un database SQL possono contenere enormi quantità di dati, ma non sono sempre in un formato utile per essere facilmente utilizzate. Il volume dei dati deve essere filtrato in base ad alcuni criteri specifici per un uso efficiente. Per motivi di sicurezza, potremmo voler rendere pubblica solo una certa quantità di dati mentre il resto potrebbe essere accessibile agli utenti privilegiati. Le operazioni SQL DML sono estensibili e utilizzate per filtrare una o più tabelle utilizzando espressioni di query complesse. Sfruttando l'idea, possiamo creare tabelle virtuali da tabelle di base persistenti utilizzando SQL che conterrebbe i dati esatti di cui abbiamo bisogno. Questo è il motivo per cui lo standard SQL:2006 ha introdotto l'uso delle tabelle di visualizzazione, o viste. La definizione di una vista o di una tabella virtuale esiste come oggetto schema. Questo articolo introduce il concetto di viste in SQL, come funziona e mostra come viene implementato con alcuni esempi.
Introduzione alle viste SQL
Le viste SQL non sono altro che tabelle virtuali che risiedono nella memoria derivata da una o più tabelle di base. Le tabelle virtuali indicano che le tuple nelle viste non hanno esistenza fisica e non sono archiviate nel database. Le tuple sono come dati temporanei creati come risultato della query SQL che in genere disegna dati filtrati da una o più tabelle di base. Di conseguenza, esiste una limitazione sul tipo di operazione che può essere applicata a una tabella di visualizzazione. Ad esempio, l'operazione di aggiornamento non può essere applicata a tutti i tipi di viste, ma non ha limitazioni all'applicazione di query SQL su di essa.
Gli esempi seguenti sono testati con il database MySQL. Inizia creando alcune tabelle:
la mia_azienda banca dati:
CREATE DATABASE my_company; CREATE TABLE Employee( empId INT(11) UNSIGNED CHECK (empId > 0), empName VARCHAR(20), birthDate DATE, address TEXT(128), gender VARCHAR(1), salary DECIMAL(15,2), managerId INT(11) UNSIGNED, deptId INT(11) UNSIGNED, PRIMARY KEY(empId) ); CREATE TABLE Department( deptId INT(11) UNSIGNED CHECK (empId > 0), deptName VARCHAR(20), deptMgrId INT(11) UNSIGNED, mgrStartDate DATE, PRIMARY KEY(deptId) ); CREATE TABLE Project( projId INT(11) UNSIGNED CHECK (empId > 0), projName VARCHAR(20), projLocation TEXT(128), deptId INT(11) UNSIGNED, PRIMARY KEY(projId) ); CREATE TABLE EmpWorksOnProj( empId INT(11) UNSIGNED, projId INT(11) UNSIGNED, hoursWorked DECIMAL(4,2) ); ALTER TABLE Employee ADD CONSTRAINT fk_emp_mgr FOREIGN KEY(managerId) REFERENCES Employee(empId); ALTER TABLE Employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES Department(deptId); ALTER TABLE Department ADD CONSTRAINT fk_dept_mgr FOREIGN KEY(deptMgrId) REFERENCES Employee(empId); ALTER TABLE Project ADD CONSTRAINT fk_proj_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
Le viste possono essere considerate come una tabella di riferimento e possiamo usarla tutte le volte che vogliamo, anche se potrebbe non esistere fisicamente. Ad esempio, potremmo dover spesso fare riferimento a mia_azienda database e trova Dipendente e Progetto informazione. Tieni presente che esistono molte relazioni tra Dipendente e Progetto poiché una persona può lavorare su molti progetti e anche un progetto ha molti dipendenti. Pertanto, invece di specificare il join di tre tabelle:Impiegato , EmpWorksOnProj e Progetto ogni volta che abbiamo bisogno di un'informazione collaborativa ed emettiamo una query, definiamo una vista che viene specificata come risultato del join tra queste tabelle. La vista costituisce la tabella virtuale creata dal risultato della query. Il vantaggio è che la query ora può recuperare da una singola tabella risultante invece di dover recuperare da tre tabelle unite. La collezione di tabelle:Impiegato , Progetto , Dipartimento ecc. formano così le tabelle di base o la tabella di definizione della vista.
Creiamo alcune viste basate sullo schema sopra indicato.
CREATE VIEW V1 AS SELECT empName, projName, hoursWorked FROM Employee, Project, EmpWorksOnProj WHERE Employee.empId=EmpWorksOnProj.empId AND Project.projId=EmpWorksOnProj.projId;
Il modo per specificare le query SQL sulla vista o sulla tabella virtuale è lo stesso che specificare le query che coinvolgono le tabelle di base. È possibile utilizzare SQL SELECT sulle viste per ottenere i dati come segue:
SELEZIONA * DA V1;
NomeEmp | Nome progetto | Ore lavorate |
Topolino | Club House | 6.50 |
… | … | … |
Paperino | Agricoltura | 7.0 |
Di seguito viene creata una seconda vista:
CREATE VIEW V2 AS SELECT deptName, COUNT(*), SUM(salary) FROM Department, Employee WHERE Employee.deptId=Department.deptId GROUP BY reptName;
Il risultato SQL SELECT in
SELECT * FROM V1;
Nome reparto | COUNT(*) | SOMMA(stipendio) |
Musica | 5 | 56000.00 |
… | … | … |
Dramma | 2 | 25400.00 |
Si noti che nella vista V1 i nomi degli attributi sono derivati dalla tabella di base. Nella V2 i nuovi nomi degli attributi vengono specificati in modo esplicito utilizzando la corrispondenza uno a uno tra gli attributi specificati della clausola CREATE VIEW e quelli specificati nella clausola SELECT. La clausola SELECT con la vista è decisiva per la definizione della vista.
Le informazioni visualizzate dovrebbero essere sempre aggiornate. Ciò significa che deve sempre riflettere le modifiche apportate alle tabelle di base su cui è definito. Questo è interessante, perché significa che la vista non è effettivamente materializzata al momento della sua definizione, ma più tardi quando viene specificata una query su di essa. Il sistema di gestione del database in background è responsabile di mantenere aggiornata la visualizzazione.
AGGIORNA, INSERISCI ed ELIMINA nelle visualizzazioni
In SQL, è possibile creare viste aggiornabili che possono essere utilizzate per modificare dati esistenti o inserire nuove righe nella vista che a sua volta inserisce o modifica il record nella tabella di base . Una vista è aggiornabile o meno è determinata dall'istruzione SELECT definita all'interno della definizione della vista. Non esiste una clausola speciale per designare una vista come aggiornabile. In genere, la definizione della vista deve essere semplice e non deve contenere funzioni aggregate come SUM, AVG, MAX, MIN, COUNT. Qualsiasi tipo di raggruppamento o clausola DISTINCT o JOIN rende anche la vista non aggiornabile. Fare riferimento al manuale del database pertinente dell'RDBMS specifico per ciò che rende una vista non aggiornabile.
Creiamo una vista aggiornabile:
CREATE VIEW v3_ch_dept_name AS SELECT deptId, deptName, deptMgrId, mgrStartDate FROM Department;
La query SELECT in vista:
SELECT * FROM v3_ch_dept_name;
ID reparto | Nome reparto | DeptMgrId | MgrStartDate |
1 | Musica | 123456789 | 01-01-2020 |
… | … | … | … |
5 | Dramma | 987654321 | 05-03-2018 |
Ora aggiorna la vista cambiando il nome del reparto (deptName).
UPDATE v3_ch_dept_name SET deptName = 'Security' WHERE deptId = 5;
Una riga può essere inserita nella vista come segue:
INSERT INTO v3_ch_dept_name VALUES (7,'Logistics',666884444,'1982-07-07');
Inoltre possiamo CANCELLARE una riga dalla vista come segue:
DELETE FROM v3_ch_dept_name WHERE deptId = 7;
In MySQL, puoi facilmente trovare le viste in un database che sono aggiornabili o che non utilizzano il seguente comando SELECT.
SELECT table_name FROM information_schema.views WHERE is_updatable like 'YES' AND table_schema like 'my_company';
DROP viste dal database
Una vista può sempre essere eliminata con DROP VIEW
DROP VIEW V1;
Nota che quando eseguiamo il comando drop view rimuove la definizione della vista. I dati sottostanti archiviati nelle tabelle di base da cui deriva questa vista rimangono invariati. Una vista una volta eliminata può essere ricreata con lo stesso nome.
L'istruzione ALTER VIEW
Le viste sono generalmente inalterabili secondo lo standard SQL:2006, ciò significa che l'istruzione ALTER VIEW non funziona con le viste. Tuttavia, ci sono RDBMS come MySQL o SQL Server che supportano questo tipo di istruzione. L'Oracolo crede prima di tutto nell'abbandonare la vista e poi nel ricrearla invece di alterarla. Pertanto, le funzionalità supportate nelle viste da RDBMS variano da prodotto a prodotto.
Conclusione
Le viste SQL sono anche uno strumento utile per accedere a più tipi di dati. Le query complesse possono essere archiviate all'interno della definizione della vista. Questo sfrutta il riutilizzo perché possiamo invocare la vista invece di ricreare le query ogni volta che ne abbiamo bisogno. È un modo conveniente per presentare informazioni all'utente nascondendo molte informazioni che non vogliamo esporre a tutti. Questo è importante anche dal punto di vista della sicurezza. Strutture complesse possono essere sintetizzate e presentate in un formato facile per l'utente finale.
Riferimenti:
Elmasri, Ramez e Shamkant B. Navathe. Nozioni fondamentali sui sistemi di database . Educazione Pearson.