Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Vues dans SQL Server

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

  1. Vues
  2. Vues indexées
  3. Créer des vues indexées dans SQL Server