Présentation
Une vue dans SQL Server est une structure semblable à une table virtuelle basée sur le jeu de résultats d'une instruction SQL. En surface, une vue est similaire à un tableau avec la structure de signature de lignes et de colonnes. Cependant, ces lignes et colonnes proviennent de tables référencées dans la requête, qui définit la vue.
Nous utilisons des vues pour nous concentrer sur les colonnes en béton aux fins pour lesquelles elles ont été créées. Les vues peuvent également servir pour des raisons de sécurité. Ils filtrent les colonnes des tables sous-jacentes que l'on ne veut pas rendre visibles à certains utilisateurs. Affiche les colonnes de filtre comme une clause WHERE filtre les lignes.
Une autre raison de Views est la simplicité. Ils agrègent les colonnes de plusieurs tables différentes et créent une apparence générale qui ressemble à une seule table.
Types de vues
Les vues de base définies par l'utilisateur sont faciles à créer. Le processus est similaire à l'écriture de requêtes faisant référence à une ou plusieurs tables.
- Les vues indexées sont celles qui ont été matérialisées ou stockées comme une table. Les vues indexées peuvent améliorer les performances des requêtes qui agrègent de nombreuses lignes. Cependant, ils ne conviennent pas si les tables sous-jacentes sont fréquemment mises à jour.
- Les vues partitionnées joignent les données partitionnées horizontalement à partir de tables localement (au sein de la même instance) ou sur plusieurs, à l'aide de serveurs liés.
- Les vues système sont les structures communes que SQL Server utilise pour exposer les métadonnées du catalogue. Les vues système sont la plupart de ces structures que l'on interroge pour dépanner les performances ou enquêter sur une instance SQL Server.
Création d'une vue à partir d'une table
Jetez un œil à l'exemple du Listing 1. La première instruction renvoie TOUS les enregistrements de la table Purchasing.PurchaseOrders (1a), tandis que la deuxième requête ne renvoie que quelques colonnes (1b).
En utilisant la deuxième requête, nous pouvons créer une vue qui renvoie le même jeu de résultats que (1b). Lorsque nous faisons cela, nous pouvons interroger une vue pour obtenir la sortie souhaitée. Ainsi, nous simplifions la requête pour un utilisateur final.
-- Listing 1: Creating a Basic User-Defined View
-- 1a
SELECT * FROM
Purchasing.PurchaseOrders;
-- 1b
SELECT
PurchaseOrderID
, SupplierID
, OrderDate
, ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders;
-- 1c
CREATE VIEW Purchasing.QuickOrders
AS
SELECT
PurchaseOrderID
, SupplierID
, OrderDate
, ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders;
-- 1d
SELECT * FROM Purchasing.QuickOrders ;
Création d'une vue à partir de deux tables
À l'aide des JOIN, nous pouvons récupérer des données à partir de deux tables ou plus qui ont une relation. Grâce à Views, nous pouvons simplifier l'accès à ces données.
Le Listing 2 (2a) montre un JOIN entre Purchasing.PurchaseOrders et Purchasing.PurchaseOrderLines. Nous pouvons créer une vue à partir de ce JOIN, et cela nous permettra de récupérer les mêmes données à l'aide d'une requête, comme indiqué dans (2c).
-- Listing 2: Creating a View from Two Tables
-- 2a
SELECT
po.PurchaseOrderID
, po.SupplierID
, po.OrderDate
, po.ExpectedDeliveryDate
, pol.Description
, pol.ExpectedUnitPricePerOuter
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID;
-- 2b
CREATE VIEW Purchasing.DetailedOrders
AS
SELECT
po.PurchaseOrderID
, po.SupplierID
, po.OrderDate
, po.ExpectedDeliveryDate
, pol.Description
, pol.ExpectedUnitPricePerOuter
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID;
-- 2c
SELECT * FROM Purchasing.DetailedOrders;
Création d'une vue sur les bases de données
En utilisant la dénomination en plusieurs parties, nous pouvons référencer des tables dans une base de données différente. Par conséquent, nous pouvons effectuer des JOIN sur les bases de données et créer des vues qui couvrent les bases de données. Il est utile pour certaines applications qui répartissent leurs données sur des bases de données dans la même instance SQL Server.
Le Listing 3 montre un cas similaire au Listing 2, mais avec une différence :nous ajoutons une troisième table à la requête JOIN à partir d'une base de données différente. Notez que nous devons utiliser un LEFT OUTER JOIN car aucune relation réelle n'existe entre les tables des deux bases de données. Ici, nous l'utilisons uniquement pour illustrer la création d'une VUE qui couvre différentes bases de données.
Nous avons introduit un alias dans l'instruction CREATE VIEW, car nous avons des colonnes de deux tables différentes portant le même nom. Nous devons distinguer ces colonnes dans de tels cas.
-- Listing 3: Creating a View Across Databases
-- 3a
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,so.orderid
,so.custid
,so.orderdate
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
LEFT OUTER JOIN TSQLV4.Sales.Orders so
ON po.PurchaseOrderID=so.orderid;
-- 3b
CREATE VIEW Purchasing.DetailedOrdersDistributed
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,so.orderid
,so.custid
,so.orderdate AS OrdersOrderDate
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
LEFT OUTER JOIN TSQLV4.Sales.Orders so
ON po.PurchaseOrderID=so.orderid;
-- 3c
SELECT * FROM Purchasing.DetailedOrdersDistributed;
Jetez un oeil à la Figure 1. Elle montre le résultat de l'exécution du Listing 3(3c). Notez que les trois dernières colonnes sont vides, comme TSQLV4.Sales.Orders la table ne contient aucune ligne correspondant à la condition JOIN.
Création d'une vue sur plusieurs instances
Nous pouvons étendre la dernière instruction en introduisant une table qui vit entièrement dans une autre instance.
Pour ce faire, nous devons d'abord créer un serveur lié. Nous le faisons avec le code similaire à celui montré dans le Listing 4.
-- Listing 4: Linked Server
USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'IGIRI01\SQLEXPRESS', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'IGIRI01\SQLEXPRESS',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO
Remarquez comment nous adressons la table externe à l'aide d'un nom en quatre parties :
-- Listing 5: Creating a View Across Instances
-- 5a
CREATE VIEW Purchasing.DetailedOrdersExternal
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,ipol.LastEditedWhen
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
INNER JOIN [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
ON po.PurchaseOrderID=ipol.PurchaseOrderID;
-- 5b
SELECT * FROM Purchasing.DetailedOrdersExternal;
Inclusion de fonctions dans les vues
Étant donné que les vues sont essentiellement des requêtes, nous pouvons leur appliquer presque tout ce que nous faisons avec des requêtes régulières. Nous pouvons inclure des fonctions, des clauses WHERE, des expressions CASE, des alias, etc.
Cependant, la clause ORDER BY n'est pas autorisée, sauf que vous utilisez le "TOP 100 hack". Les listings 6 à 9 illustrent l'utilisation de ces clauses dans Views.
-- Listing 6: Creating a View with a Function
CREATE VIEW Purchasing.DetailedOrdersComplex
AS
SELECT
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
-- Listing 7: Creating a View with a WHERE Clause
CREATE VIEW Purchasing.DetailedOrdersComplexFilt
AS
SELECT
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
WHERE ipol.PurchaseOrderID<10;
-- Listing 8: Creating a View a TOP Clause
CREATE VIEW Purchasing.DetailedOrdersComplexTop
AS
SELECT TOP 10
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
-- Listing 9: Creating a View with a CASE Expression
CREATE VIEW Purchasing.DetailedOrdersComplexTop
AS
SELECT TOP 10
CASE
ipol.PurchaseOrderID
WHEN 1 THEN 'First Order'
WHEN 2 THEN 'Second Order'
END PurchaseOrder
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
Vues indexées
Nous avons fait référence aux vues indexées plus haut dans l'article. Les vues indexées peuvent améliorer les performances, sauf dans les cas où les tables sous-jacentes sont intensives en écriture. SQL Server nécessite que certaines options SET soient activées avant de créer des vues indexées ou d'effectuer certaines opérations sur celles-ci.
La clause WITH SCHEMABINDING doit être utilisée lors de la création d'une vue pour y placer un index. Cette clause associe strictement la vue aux objets sous-jacents. Ainsi, de tels objets ne peuvent pas être supprimés.
-- Listing 10: Creating an Indexed View
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON;
CREATE VIEW Purchasing.DetailedOrdersIndexed
WITH SCHEMABINDING
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders po;
CREATE UNIQUE CLUSTERED INDEX IX_ID
ON Purchasing.DetailedOrdersIndexed (PurchaseOrderID);
Conclusion
Dans cet article, nous avons examiné les vues à un certain niveau de détail. Nous avons brièvement couvert les types de vues et donné plusieurs exemples de vues définies par l'utilisateur et comment nous avons utilisé les JOIN pour réaliser des vues qui dépendent de nombreuses tables. Nous avons également couvert les vues complexes qui incluent des fonctions ainsi que des vues indexées.
Références
- Vues
- Vues indexées
- Créer des vues indexées dans SQL Server