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