Mysql
 sql >> Database >  >> RDS >> Mysql

Comprensione delle viste in SQL

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 comando.

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.