Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में दृश्य

परिचय

SQL सर्वर में एक दृश्य एक SQL स्टेटमेंट के परिणाम-सेट के आधार पर एक वर्चुअल टेबल जैसी संरचना है। सतह पर, एक दृश्य पंक्तियों और स्तंभों की हस्ताक्षर संरचना वाली तालिका के समान है। हालाँकि, ये पंक्तियाँ और स्तंभ क्वेरी में संदर्भित तालिकाओं से आते हैं, जो दृश्य को परिभाषित करता है।

हम दृश्य का उपयोग उन ठोस स्तंभों पर ध्यान केंद्रित करने के लिए करते हैं जिनके लिए वे बनाए गए हैं। दृश्य सुरक्षा कारणों से भी काम कर सकते हैं। वे अंतर्निहित तालिकाओं में स्तंभों को फ़िल्टर करते हैं जिन्हें कोई कुछ उपयोगकर्ताओं को दृश्यमान नहीं बनाना चाहता है। WHERE क्लॉज जैसे फ़िल्टर कॉलम देखता है पंक्तियों को फ़िल्टर करता है।

दृश्यों का एक अन्य कारण सादगी है। वे कई अलग-अलग तालिकाओं से स्तंभों को एकत्रित करते हैं और एक सामान्य रूप बनाते हैं जो एक तालिका की तरह दिखता है।

दृश्यों के प्रकार

मूल उपयोगकर्ता-परिभाषित दृश्य बनाना आसान है। यह प्रक्रिया उन प्रश्नों को लिखने के समान है जो एक या अधिक तालिकाओं का संदर्भ देते हैं।

  • अनुक्रमित दृश्य वे होते हैं जिन्हें एक तालिका की तरह भौतिक या संग्रहीत किया गया है। अनुक्रमित दृश्य कई पंक्तियों को एकत्रित करने वाली क्वेरी के प्रदर्शन में सुधार कर सकते हैं। हालांकि, यदि अंतर्निहित तालिकाओं को बार-बार अद्यतन किया जाता है, तो वे उपयुक्त नहीं हैं।
  • विभाजित दृश्य, लिंक किए गए सर्वर का उपयोग करके, स्थानीय रूप से (उसी उदाहरण के भीतर) या कई तालिकाओं से क्षैतिज रूप से विभाजित डेटा में शामिल होते हैं।
  • सिस्टम दृश्य सामान्य संरचनाएं हैं जिनका उपयोग SQL सर्वर कैटलॉग मेटाडेटा को प्रदर्शित करने के लिए करता है। सिस्टम दृश्य उन संरचनाओं में से अधिकांश हैं जो प्रदर्शन के समस्या निवारण या SQL सर्वर इंस्टेंस की जांच के लिए एक प्रश्न हैं।

एक तालिका से दृश्य बनाना

लिस्टिंग 1 में दिए गए उदाहरण पर एक नज़र डालें। पहला स्टेटमेंट Purchasing.PurchaseOrders टेबल के सभी रिकॉर्ड लौटाता है। (1a), जबकि दूसरी क्वेरी केवल कुछ कॉलम (1b) लौटाती है।

दूसरी क्वेरी का उपयोग करके, हम एक ऐसा दृश्य बना सकते हैं जो समान परिणाम सेट करता है (1b)। जब हम ऐसा करते हैं, तो हम वांछित आउटपुट प्राप्त करने के लिए व्यू को क्वेरी कर सकते हैं। इस प्रकार, हम अंतिम उपयोगकर्ता के लिए क्वेरी को सरल बनाते हैं।

-- 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 ;

दो तालिकाओं से दृश्य बनाना

जॉइन का उपयोग करके, हम दो या दो से अधिक तालिकाओं से डेटा पुनर्प्राप्त कर सकते हैं जिनमें संबंध हैं। दृश्यों का उपयोग करके, हम ऐसे डेटा तक पहुँचने को सरल बना सकते हैं।

लिस्टिंग 2 (2a) खरीददारी के बीच एक जॉइन दिखाता है। खरीद आदेश और खरीददारी। खरीद आदेश रेखाएं। हम इस जॉइन से एक दृश्य बना सकते हैं, और यह हमें एक क्वेरी का उपयोग करके उसी डेटा को पुनः प्राप्त करने की अनुमति देगा, जैसा कि (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;

सभी डेटाबेस में दृश्य बनाना

बहु-भाग नामकरण का उपयोग करके, हम एक अलग डेटाबेस में तालिकाओं का संदर्भ दे सकते हैं। इसलिए, हम डेटाबेस में जॉइन कर सकते हैं और डेटाबेस को देखने वाले दृश्य बना सकते हैं। यह कुछ अनुप्रयोगों के लिए सहायक होता है जो एक ही SQL सर्वर इंस्टेंस में अपने डेटा को डेटाबेस में फैलाते हैं।

लिस्टिंग 3 लिस्टिंग 2 के समान मामला दिखाता है, लेकिन एक अंतर के साथ:हम एक अलग डेटाबेस से जॉइन क्वेरी में एक तीसरी तालिका जोड़ते हैं। ध्यान दें कि हमें बाएं बाहरी जॉइन का उपयोग करना होगा क्योंकि दोनों डेटाबेस में तालिकाओं के बीच कोई वास्तविक संबंध मौजूद नहीं है। यहां, हम इसका उपयोग केवल एक दृश्य बनाने के लिए करते हैं जो विभिन्न डेटाबेस तक फैला हो।

हमने क्रिएट व्यू स्टेटमेंट में एक उपनाम पेश किया है, क्योंकि हमारे पास एक ही नाम के दो अलग-अलग टेबल के कॉलम हैं। हमें ऐसे मामलों में उन स्तंभों में अंतर करना चाहिए।

  -- 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;

चित्र 1 पर एक नज़र डालें। यह लिस्टिंग 3(3c) को निष्पादित करने का परिणाम दिखाता है। ध्यान दें कि TSQLV4.Sales.Orders के रूप में अंतिम तीन कॉलम खाली हैं तालिका में JOIN शर्त से मेल खाने वाली कोई पंक्तियाँ नहीं हैं।

सभी उदाहरणों में दृश्य बनाना

हम एक अन्य उदाहरण में पूरी तरह से रहने वाली तालिका को पेश करके अंतिम कथन का विस्तार कर सकते हैं।

इसे प्राप्त करने के लिए, हमें पहले एक लिंक्ड सर्वर बनाना होगा। हम इसे लिस्टिंग 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

ध्यान दें कि हम चार-भाग वाले नाम का उपयोग करके बाहरी तालिका को कैसे संबोधित करते हैं:

-- 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;

दृश्यों में कार्यों सहित

चूंकि दृश्य अनिवार्य रूप से प्रश्न हैं, हम उन पर लगभग कुछ भी लागू कर सकते हैं जो हम नियमित प्रश्नों के साथ करते हैं। हम फ़ंक्शंस, WHERE क्लॉज़, CASE एक्सप्रेशन, उपनाम आदि शामिल कर सकते हैं।

हालाँकि, ORDER BY क्लॉज की अनुमति नहीं है, सिवाय इसके कि आप "टॉप 100 हैक" का उपयोग करते हैं। लिस्टिंग 6 से 9 दृश्यों में उन खंडों के उपयोग को दर्शाती है।

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

अनुक्रमित दृश्य

हमने पहले लेख में अनुक्रमित दृश्यों का उल्लेख किया था। अनुक्रमित दृश्य प्रदर्शन में सुधार कर सकते हैं, उन मामलों को छोड़कर जहां अंतर्निहित तालिकाएं लेखन-गहन हैं। अनुक्रमित दृश्य बनाने या उन पर कुछ संचालन करने से पहले SQL सर्वर को कुछ SET विकल्पों को सक्षम करने की आवश्यकता होती है।

WITH SCHEMABINDING क्लॉज का उपयोग उस पर एक इंडेक्स डालने के लिए व्यू बनाते समय किया जाना चाहिए। यह खंड दृश्य को अंतर्निहित वस्तुओं के साथ सख्ती से जोड़ता है। इस प्रकार, ऐसी वस्तुओं को गिराया नहीं जा सकता।

-- 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);

निष्कर्ष

इस लेख में, हमने कुछ स्तरों पर विचारों की जांच की है। हमने संक्षेप में विचारों के प्रकारों को कवर किया और उपयोगकर्ता परिभाषित विचारों के कई उदाहरण दिए और हमने कई तालिकाओं पर निर्भर विचारों को महसूस करने के लिए जॉइन का उपयोग कैसे किया। हमने जटिल विचारों को भी शामिल किया है जिसमें फ़ंक्शन के साथ-साथ अनुक्रमित दृश्य भी शामिल हैं।

संदर्भ

  1. दृश्य
  2. अनुक्रमित दृश्य
  3. एसक्यूएल सर्वर में अनुक्रमित दृश्य बनाएं

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सम्मिलित पंक्ति की पीके गाइड प्राप्त करने का सबसे अच्छा तरीका

  2. SQL सर्वर में ट्रिगर इवेंट प्रकारों को सूचीबद्ध करने के लिए sys.trigger_event_types का उपयोग करें

  3. SQL सर्वर पुनर्निर्माण अनुक्रमणिका क्वेरी

  4. SQL सर्वर में डेटा फ़ाइलों और लॉग फ़ाइलों का स्थान कैसे खोजें

  5. SQL में एकाधिक तालिकाओं में शामिल होना