Microsoft SQL Server
CREA VISTA
Ricerca…
CREA VISTA
CREATE VIEW view_EmployeeInfo
AS
SELECT EmployeeID,
FirstName,
LastName,
HireDate
FROM Employee
GO
Le righe delle viste possono essere selezionate in modo simile alle tabelle:
SELECT FirstName
FROM view_EmployeeInfo
Puoi anche creare una vista con una colonna calcolata. Possiamo modificare la vista sopra come segue aggiungendo una colonna calcolata:
CREATE VIEW view_EmployeeReport
AS
SELECT EmployeeID,
FirstName,
LastName,
Coalesce(FirstName,'') + ' ' + Coalesce(LastName,'') as FullName,
HireDate
FROM Employee
GO
Questo punto di vista aggiunge una colonna aggiuntiva che verrà visualizzato quando si SELECT
righe da esso. I valori in questa colonna aggiuntiva dipenderanno dai campi FirstName
e LastName
nella tabella Employee
e aggiorneranno automaticamente dietro le quinte quando tali campi vengono aggiornati.
CREATE VIEW con la crittografia
CREATE VIEW view_EmployeeInfo
WITH ENCRYPTION
AS
SELECT EmployeeID, FirstName, LastName, HireDate
FROM Employee
GO
CREATE VIEW con INNER JOIN
CREATE VIEW view_PersonEmployee
AS
SELECT P.LastName,
P.FirstName,
E.JobTitle
FROM Employee AS E
INNER JOIN Person AS P
ON P.BusinessEntityID = E.BusinessEntityID
GO
Le viste possono utilizzare i join per selezionare i dati da numerose fonti come tabelle, funzioni di tabella o anche altre viste. Questo esempio utilizza le colonne FirstName e LastName dalla tabella Person e la colonna JobTitle dalla tabella Employee.
Ora questa vista può essere utilizzata per vedere tutte le righe corrispondenti per i Manager nel database:
SELECT *
FROM view_PersonEmployee
WHERE JobTitle LIKE '%Manager%'
CREA VISTA indicizzata
Per creare una vista con un indice, la vista deve essere creata utilizzando le parole chiave WITH SCHEMABINDING
:
CREATE VIEW view_EmployeeInfo
WITH SCHEMABINDING
AS
SELECT EmployeeID,
FirstName,
LastName,
HireDate
FROM [dbo].Employee
GO
Ora è possibile creare qualsiasi cluster o indici non cluster:
CREATE UNIQUE CLUSTERED INDEX IX_view_EmployeeInfo
ON view_EmployeeInfo
(
EmployeeID ASC
)
Ci sono alcune limitazioni alle viste indicizzate:
La definizione della vista può fare riferimento a una o più tabelle nello stesso database.
Una volta creato l'indice cluster univoco, è possibile creare ulteriori indici non cluster sulla vista.
È possibile aggiornare i dati nelle tabelle sottostanti, inclusi gli inserimenti, gli aggiornamenti, le eliminazioni e persino i troncati.
Non è possibile modificare le tabelle e le colonne sottostanti. La vista viene creata con l'opzione WITH SCHEMABINDING.
Non può contenere COUNT, MIN, MAX, TOP, join esterni o poche altre parole chiave o elementi.
Per ulteriori informazioni sulla creazione di viste indicizzate è possibile leggere questo articolo MSDN
VISTE raggruppate
Una VISTA raggruppata si basa su una query con una clausola GROUP BY. Poiché ciascuno dei gruppi può avere più di una riga nella base da cui è stato creato, questi sono necessariamente VISTE di sola lettura. Tali VISTE di solito hanno una o più funzioni aggregate e sono utilizzati a fini di reporting. Sono anche utili per aggirare i punti deboli in SQL. Considera una VISTA che mostra la più grande vendita in ogni stato. La query è semplice:
https://www.simple-talk.com/sql/t-sql-programming/sql-view-beyond-the-basics/
CREATE VIEW BigSales (state_code, sales_amt_total)
AS SELECT state_code, MAX(sales_amt)
FROM Sales
GROUP BY state_code;
VISIONI UNION-ED
Le VISUALIZZA basate su un'operazione UNION o UNION ALL sono di sola lettura perché non esiste un unico modo per mappare una modifica su una sola riga in una delle tabelle di base. L'operatore UNION rimuoverà le righe duplicate dai risultati. Sia gli operatori UNION che UNION ALL nascondono da quale tabella provengono le righe. Tali VISUALIZZAZIONI devono utilizzare a, poiché le colonne in UNION [ALL] non hanno nomi propri. In teoria, un UNION di due tabelle disgiunte, nessuna delle quali ha righe duplicate in sé dovrebbe essere aggiornabile.
https://www.simple-talk.com/sql/t-sql-programming/sql-view-beyond-the-basics/
CREATE VIEW DepTally2 (emp_nbr, dependent_cnt)
AS (SELECT emp_nbr, COUNT(*)
FROM Dependents
GROUP BY emp_nbr)
UNION
(SELECT emp_nbr, 0
FROM Personnel AS P2
WHERE NOT EXISTS
(SELECT *
FROM Dependents AS D2
WHERE D2.emp_nbr = P2.emp_nbr));