Microsoft SQL Server
UTWÓRZ WIDOK
Szukaj…
UTWÓRZ WIDOK
CREATE VIEW view_EmployeeInfo
AS
SELECT EmployeeID,
FirstName,
LastName,
HireDate
FROM Employee
GO
Rzędy z widoków można wybierać podobnie jak tabele:
SELECT FirstName
FROM view_EmployeeInfo
Możesz także utworzyć widok z kolumną obliczeniową. Możemy zmodyfikować powyższy widok w następujący sposób, dodając kolumnę obliczeniową:
CREATE VIEW view_EmployeeReport
AS
SELECT EmployeeID,
FirstName,
LastName,
Coalesce(FirstName,'') + ' ' + Coalesce(LastName,'') as FullName,
HireDate
FROM Employee
GO
Pogląd ten dodaje dodatkową kolumnę, która pojawi się po SELECT
wiersze z nim. Wartości w tej dodatkowej kolumnie będą zależeć od pól FirstName
i LastName
w tabeli Employee
i będą automatycznie aktualizowane za kulisami, gdy pola te zostaną zaktualizowane.
UTWÓRZ WIDOK Z Szyfrowaniem
CREATE VIEW view_EmployeeInfo
WITH ENCRYPTION
AS
SELECT EmployeeID, FirstName, LastName, HireDate
FROM Employee
GO
STWÓRZ WIDOK Z WEJŚCIEM WEWNĘTRZNYM
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
Widoki mogą używać złączeń do wybierania danych z wielu źródeł, takich jak tabele, funkcje tabel, a nawet inne widoki. W tym przykładzie użyto kolumn FirstName i LastName z tabeli Person oraz kolumny JobTitle z tabeli Employee.
Ten widok może teraz służyć do wyświetlania wszystkich odpowiednich wierszy dla menedżerów w bazie danych:
SELECT *
FROM view_PersonEmployee
WHERE JobTitle LIKE '%Manager%'
UTWÓRZ Zindeksowany WIDOK
Aby utworzyć widok z indeksem, widok należy utworzyć za pomocą słów kluczowych WITH SCHEMABINDING
:
CREATE VIEW view_EmployeeInfo
WITH SCHEMABINDING
AS
SELECT EmployeeID,
FirstName,
LastName,
HireDate
FROM [dbo].Employee
GO
Można teraz tworzyć dowolne indeksy klastrowe lub nieklastrowane:
CREATE UNIQUE CLUSTERED INDEX IX_view_EmployeeInfo
ON view_EmployeeInfo
(
EmployeeID ASC
)
Indeksowane widoki mają pewne ograniczenia:
Definicja widoku może odwoływać się do jednej lub więcej tabel w tej samej bazie danych.
Po utworzeniu unikalnego indeksu klastrowego można utworzyć dodatkowe indeksy nieklastrowane względem widoku.
Możesz aktualizować dane w bazowych tabelach - w tym wstawki, aktualizacje, usuwa, a nawet obcina.
Nie możesz modyfikować bazowych tabel i kolumn. Widok jest tworzony za pomocą opcji Z SCHEMABINDOWANIEM.
Nie może zawierać COUNT, MIN, MAX, TOP, złączeń zewnętrznych ani kilku innych słów kluczowych lub elementów.
Aby uzyskać więcej informacji na temat tworzenia indeksowanych widoków, przeczytaj ten artykuł MSDN
Zgrupowane WIDOKI
Zgrupowany widok jest oparty na zapytaniu z klauzulą GROUP BY. Ponieważ każda z grup może mieć więcej niż jeden wiersz w bazie, z którego została zbudowana, są to koniecznie WIDOKI tylko do odczytu. Takie WIDOKI zwykle mają jedną lub więcej funkcji agregujących i są wykorzystywane do celów sprawozdawczych. Są również przydatne do obejścia słabych stron SQL. Rozważ WIDOK pokazujący największą sprzedaż w każdym stanie. Zapytanie jest proste:
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;
WIDOKI UNII
WIDOKI oparte na operacji UNION lub UNION ALL są tylko do odczytu, ponieważ nie ma jednego sposobu odwzorowania zmiany na tylko jeden wiersz w jednej z tabel podstawowych. Operator UNION usunie zduplikowane wiersze z wyników. Zarówno operatorzy UNION, jak i UNION ALL ukrywają, z której tabeli pochodzą wiersze. WIDOKÓW takich należy używać, ponieważ kolumny w UNII [WSZYSTKO] nie mają własnych nazw. Teoretycznie UNIA dwóch rozłącznych tabel, z których żadna nie ma zduplikowanych wierszy, powinna być aktualizowana.
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));