{count, plural, one {कोर्स} other {कोर्स}}
यदि आप कुछ समय से SQL के साथ काम कर रहे हैं लेकिन CTEs का उपयोग नहीं किया है, तो संभवतः आप सोचेंगे कि इनके बिना अब तक कैसे काम चला। मैं इन्हें लगभग हर जगह उपयोग करता हूँ, जिनमें SELECT, INSERT, UPDATE, और DELETE स्टेटमेंट्स शामिल हैं।
इस लेख में, मैं मूल बातें बताऊँगा, जिनमें CTE कैसे बनाया जाता है शामिल है। मैं कुछ उन्नत बातों पर भी जाऊँगा, जैसे गैर-रिकर्सिव और रिकर्सिव CTEs के बीच अंतर कैसे करें—दोनों का अपना उद्देश्य होता है।
यदि आप SQL ऑपरेशंस से थोड़े अनभिज्ञ हैं, तो शुरुआत करने के लिए हमारा लोकप्रिय Introduction to SQL कोर्स आज़माएँ। कोर्स सुव्यवस्थित और व्यापक है, और यह आपको प्रभावी क्वेरीज़ का उपयोग करके डेटा निकालने के लिए आवश्यक हर चीज सिखाएगा।
SQL CTE क्या है?
CTEs की अवधारणा उदाहरणों के साथ स्पष्ट हो जाएगी। फिलहाल, यह कह सकते हैं कि CTE, या कॉमन टेबल एक्सप्रेशन, SQL में एक अस्थायी, नामित रिज़ल्ट सेट है जो आपको जटिल क्वेरीज़ को सरल बनाने देता है, जिससे उन्हें पढ़ना और मेंटेन करना आसान हो जाता है।
CTEs का अक्सर उपयोग तब होता है जब आप कई सबक्वेरीज़ के साथ काम करते हैं। आप उन्हें पहचान सकते हैं क्योंकि वे विशिष्ट WITH कीवर्ड से बनाई जाती हैं और, जैसा कि मैंने बताया, इन्हें SELECT, INSERT, UPDATE, और DELETE स्टेटमेंट्स में उपयोग किया जा सकता है।
SQL CTE कैसे बनाएं
CTE बनाते समय, हम CTE परिभाषा शुरू करने के लिए WITH कीवर्ड का उपयोग करते हैं। CTE का सामान्य सिंटैक्स इस प्रकार है:
WITH cte_name (column1, column2, ...) AS (
-- Query that defines the CTE
SELECT ...
FROM ...
WHERE ...
)
-- Main query
SELECT ...
FROM cte_name;
जहाँ:
- WITH: CTE परिभाषा शुरू करता है।
- cte_name: CTE को दिया गया नाम (बाद में संदर्भित करने के लिए)।
- वैकल्पिक कॉलम सूची: CTE के रिज़ल्ट सेट के लिए कॉलम नाम निर्दिष्ट करता है।
- मुख्य क्वेरी: CTE को नाम से संदर्भित करती है, जैसे वह एक सामान्य टेबल हो।
एक उदाहरण देखते हैं। मान लें कि हमारे पास Employees टेबल है और हम ऐसे कर्मचारियों का चयन करना चाहते हैं जिनका वेतन $50,000 से अधिक है।
चरण 1: बेस क्वेरी लिखें
हम बुनियादी SELECT क्वेरी लिखकर शुरू करते हैं:
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees
WHERE Salary > 50000;
चरण 2: CTE बनाने के लिए क्वेरी को WITH कीवर्ड से रैप करें
CTE को नाम देने के लिए WITH कीवर्ड का उपयोग करें।
WITH HighEarningEmployees AS (
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees
WHERE Salary > 50000
)
चरण 3: मुख्य क्वेरी में CTE का उपयोग करें
अंत में, ऊपर परिभाषित CTE नाम को बुलाकर SELECT स्टेटमेंट में CTE को संदर्भित करें।
WITH HighEarningEmployees AS (
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees
WHERE Salary > 50000
)
SELECT EmployeeID, FirstName, LastName
FROM HighEarningEmployees;
ऊपर दिए चरणों का सार यह है कि हमने WITH कीवर्ड का उपयोग करके HighEarningEmployees नाम का CTE परिभाषित किया। आंतरिक क्वेरी का उपयोग अस्थायी डेटासेट बनाने के लिए किया गया। मुख्य क्वेरी HighEarningEmployees को संदर्भित करती है ताकि निर्दिष्ट कॉलम EmployeeID, FirstName, और LastName प्रदर्शित किए जा सकें।
SQL CTEs क्यों उपयोगी हैं
उपरोक्त उदाहरण से, आप सोच सकते हैं कि जब साधारण क्वेरी भी वही परिणाम देती हैं तो हम CTEs का उपयोग क्यों करें। इसके कारण निम्नलिखित हैं:
जटिल क्वेरीज़ को सरल बनाना
CTEs जटिल SQL स्टेटमेंट्स को छोटे, अधिक प्रबंधनीय हिस्सों में बाँट देती हैं, जिससे कोड पढ़ना, लिखना और मेंटेन करना आसान हो जाता है।
मान लें हमारे पास तीन टेबल हैं: Orders, Customers, और Products। हम 2024 में खरीदारी करने वाले प्रत्येक ग्राहक द्वारा उत्पन्न कुल राजस्व निकालना चाहते हैं। जब हम CTE का उपयोग किए बिना क्वेरी लिखते हैं, तो यह भरी-भरी लगती है और पढ़ने-समझने में कठिन होती है।
-- Standard SQL: Hard to read nested logic
SELECT
c.CustomerName,
SUM(p.Price * o.Quantity) AS TotalRevenue
FROM Orders o
JOIN Customers c
ON o.CustomerID = c.CustomerID
JOIN Products p
ON o.ProductID = p.ProductID
WHERE EXTRACT(YEAR FROM o.OrderDate) = 2024
GROUP BY c.CustomerName
HAVING SUM(p.Price * o.Quantity) > 1000;
CTE का उपयोग करके, हम लॉजिक को अधिक पठनीय प्रारूप में विभाजित कर सकते हैं। पहले हम "फ़िल्टरिंग और जॉइनिंग" चरण को अलग करते हैं, फिर एग्रीगेशन करते हैं।
-- Standard SQL: Cleaner with CTE
WITH OrderDetails AS (
SELECT
o.OrderID,
c.CustomerName,
p.Price,
o.Quantity,
o.OrderDate
FROM Orders o
JOIN Customers c
ON o.CustomerID = c.CustomerID
JOIN Products p
ON o.ProductID = p.ProductID
WHERE EXTRACT(YEAR FROM o.OrderDate) = 2024
)
-- Main query
SELECT
CustomerName,
SUM(Price * Quantity) AS TotalRevenue
FROM OrderDetails
GROUP BY CustomerName
HAVING SUM(Price * Quantity) > 1000;
कोड पुन: उपयोग
CTEs एक ही रिज़ल्ट सेट को पुन: उपयोग करने की सुविधा देकर डुप्लीकेशन से बचाती हैं। यदि आपको किसी एग्रीगेट (जैसे योग) की गणना करनी है और फिर उसी एग्रीगेट के आधार पर फ़िल्टर करना है, तो CTE उपयुक्त है।
मान लें हमें प्रत्येक प्रोडक्ट कैटेगरी के लिए औसत और कुल बिक्री की गणना करनी है। हम एक बार CTE में गणना परिभाषित करते हैं:
WITH CategorySales AS (
SELECT
Category,
SUM(SalesAmount) AS TotalSales,
AVG(SalesAmount) AS AverageSales
FROM Products
GROUP BY Category
)
-- Select from the CTE where the pre-calculated TotalSales is high
SELECT
Category,
TotalSales,
AverageSales
FROM CategorySales
WHERE TotalSales > 5000;
अन्य उपयोग
क्वेरीज़ को सरल बनाने और कोड पुन: उपयोग के अलावा, CTEs के अन्य उपयोग भी हैं। मैं CTEs के हर संभावित उपयोग को विस्तार से कवर करने में सक्षम नहीं हूँ। यदि आप अभ्यास जारी रखना चाहते हैं, तो हमारा Data Manipulation in SQL कोर्स एक बढ़िया विकल्प है। हालाँकि, यहाँ मैं कुछ अन्य मुख्य कारण दर्ज कर रहा हूँ:
- क्वेरी संगठन और पठनीयता: CTEs क्वेरीज़ को तार्किक, क्रमिक चरणों में विभाजित करके SQL कोड की पठनीयता में सुधार करती हैं। क्वेरी प्रक्रिया का प्रत्येक चरण अपने अलग CTE से दर्शाया जा सकता है, जिससे पूरी क्वेरी का अनुसरण करना आसान हो जाता है।
- हाइरार्किकल डेटा ट्रैवर्सल: CTEs संगठनात्मक संरचनाओं, पैरेंट-चाइल्ड संबंधों, या किसी नेस्टेड स्तर वाले डेटा मॉडल जैसे हाइरार्किकल संबंधों में नेविगेट करने में मदद कर सकती हैं। रिकर्सिव CTEs हाइरार्किकल डेटा को क्वेरी करने में उपयोगी हैं क्योंकि वे आपको स्तरों को क्रमिक रूप से पार करने देती हैं।
- मल्टी-लेवल एग्रीगेशंस: CTEs कई स्तरों पर एग्रीगेशन करने में मदद कर सकती हैं, जैसे विभिन्न ग्रैन्युलैरिटी (उदा., महीने, तिमाही और वर्ष) पर बिक्री के आँकड़े निकालना। इन एग्रीगेशन चरणों को अलग करने के लिए CTEs का उपयोग करने से सुनिश्चित होता है कि प्रत्येक स्तर स्वतंत्र और तार्किक रूप से गणना किया गया है।
- कई टेबल्स से डेटा संयोजित करना: विभिन्न टेबल्स से डेटा संयोजित करने के लिए कई CTEs का उपयोग किया जा सकता है, जिससे अंतिम संयोजन चरण अधिक संरचित हो जाता है। यह दृष्टिकोण जटिल जॉइन्स को सरल बनाता है और स्रोत डेटा को तार्किक रूप से व्यवस्थित करता है ताकि पठनीयता में सुधार हो।
उन्नत SQL CTE तकनीकें
CTEs उन्नत SQL तकनीकों का समर्थन करती हैं, जिससे वे विभिन्न उपयोग मामलों के लिए बहुमुखी और उपयोगी बनती हैं। निम्नलिखित CTEs के कुछ उन्नत अनुप्रयोग हैं।
एक ही क्वेरी में कई CTEs
आप एक ही क्वेरी में कई CTEs परिभाषित कर सकते हैं, जो जटिल ट्रांसफॉर्मेशन और कैलकुलेशन की अनुमति देता है। यह तरीका तब उपयोगी है जब किसी समस्या के लिए डेटा प्रोसेसिंग के कई चरणों की आवश्यकता होती है, जहाँ प्रत्येक CTE एक अलग चरण का प्रतिनिधित्व करता है।
मान लें हमारे पास Sales नामक टेबल में बिक्री डेटा है और हम प्रत्येक प्रोडक्ट के लिए कुल बिक्री की गणना करना चाहते हैं, उन प्रोडक्ट्स की पहचान करना चाहते हैं जिनकी कुल बिक्री औसत से अधिक है, और इन प्रोडक्ट्स को उनकी कुल बिक्री के आधार पर रैंक करना चाहते हैं।
WITH ProductSales AS (
-- Step 1: Calculate total sales for each product
SELECT ProductID, SUM(SalesAmount) AS TotalSales
FROM Sales
GROUP BY ProductID
),
AverageSales AS (
-- Step 2: Calculate the average of those totals
-- Note: We can reference the previous CTE (ProductSales) here
SELECT AVG(TotalSales) AS AverageTotalSales
FROM ProductSales
),
HighSalesProducts AS (
-- Step 3: Filter products above the average
SELECT ps.ProductID, ps.TotalSales
FROM ProductSales ps
CROSS JOIN AverageSales av
WHERE ps.TotalSales > av.AverageTotalSales
)
-- Step 4: Rank the results
SELECT
ProductID,
TotalSales,
RANK() OVER (ORDER BY TotalSales DESC) AS SalesRank
FROM HighSalesProducts;
ऊपर दिए उदाहरण में:
- पहला CTE (
ProductSales) प्रति प्रोडक्ट कुल बिक्री की गणना करता है। - दूसरा CTE (
AverageSales) सभी प्रोडक्ट्स में कुल बिक्री का औसत निकालता है। - तीसरा CTE (
HighSalesProducts) उन प्रोडक्ट्स को फ़िल्टर करता है जिनकी कुल बिक्री औसत से अधिक है। - अंतिम क्वेरी इन प्रोडक्ट्स को उनकी कुल बिक्री के आधार पर रैंक करती है।
UPDATE, DELETE, और MERGE स्टेटमेंट्स में CTEs
जब UPDATE, DELETE, और MERGE ऑपरेशंस में शामिल किया जाता है, तो CTEs डेटा मैनिपुलेशन कार्यों को सरल बना सकते हैं, विशेषकर तब जब जटिल फ़िल्टर्स या हाइरार्किकल डेटा से निपटना हो।
UPDATE स्टेटमेंट के साथ CTE का उपयोग
मान लें हमारे पास Employees टेबल में EmployeeSalary कॉलम है। हम उन सभी कर्मचारियों को 10% वेतन वृद्धि देना चाहते हैं जिन्होंने कंपनी में 5 साल से अधिक काम किया है।
-- Define a CTE to find employees hired more than 5 years ago
WITH LongTermEmployees AS (
SELECT EmployeeID
FROM Employees
-- Standard SQL: Compare HireDate to 5 years before today
WHERE HireDate <= CURRENT_DATE - INTERVAL '5' YEAR
)
-- Update salaries by 10% for long-term employees identified in the CTE
UPDATE Employees
SET EmployeeSalary = EmployeeSalary * 1.10
WHERE EmployeeID IN (SELECT EmployeeID FROM LongTermEmployees);
CTE LongTermEmployees उन कर्मचारियों की पहचान करता है जिन्होंने पाँच साल से अधिक काम किया है। UPDATE स्टेटमेंट इस CTE का उपयोग करके वेतन को चयनात्मक रूप से बढ़ाता है।
DELETE स्टेटमेंट के साथ CTE का उपयोग
अब मान लें कि हमारे पास Products नाम की टेबल है और हम ऐसे सभी प्रोडक्ट्स हटाना चाहते हैं जो पिछले 2 वर्षों में नहीं बिके हैं। हम प्रोडक्ट्स को फ़िल्टर करने के लिए CTE का उपयोग कर सकते हैं:
-- Define a CTE to identify products not sold in the last 2 years
WITH OldProducts AS (
SELECT ProductID
FROM Products
-- Standard SQL: Filter for dates older than 2 years ago
WHERE LastSoldDate < CURRENT_DATE - INTERVAL '2' YEAR
)
-- Delete products identified as old from the main table
DELETE FROM Products
WHERE ProductID IN (SELECT ProductID FROM OldProducts);
CTE OldProducts उन प्रोडक्ट्स की पहचान करता है जो पिछले दो वर्षों में नहीं बिके, और फिर DELETE स्टेटमेंट इस CTE का उपयोग करके उन्हें हटा देता है।
MERGE स्टेटमेंट के साथ CTE का उपयोग
SQL में MERGE स्टेटमेंट सोर्स टेबल के डेटा के आधार पर टार्गेट टेबल में सशर्त अपडेट, इंसर्ट या डिलीट की अनुमति देता है। निम्न उदाहरण में, CTE MergedInventory नए और मौजूदा इन्वेंटरी डेटा को संयोजित करता है। इसके बाद MERGE स्टेटमेंट CTE डेटा के आधार पर मौजूदा प्रोडक्ट्स की क्वांटिटी अपडेट करता है या नए प्रोडक्ट्स इंसर्ट करता है।
-- CTE to prepare the source data for the merge
WITH MergedInventory AS (
SELECT
ni.ProductID,
ni.Quantity AS NewQuantity
FROM NewInventoryData ni
)
-- Merge the prepared data into the Inventory table
MERGE INTO Inventory AS target
USING MergedInventory AS source
ON target.ProductID = source.ProductID
-- Update existing products with new quantities
WHEN MATCHED THEN
UPDATE SET target.Quantity = source.NewQuantity
-- Insert new products if they don't exist in the inventory
WHEN NOT MATCHED THEN
INSERT (ProductID, Quantity)
VALUES (source.ProductID, source.NewQuantity);
रिकर्सिव कॉमन टेबल एक्सप्रेशन (CTEs)
रिकर्सिव CTEs CTE का एक विशेष प्रकार हैं जो अपनी परिभाषा के भीतर स्वयं को संदर्भित करते हैं, जिससे क्वेरी बार-बार ऑपरेशंस कर सकती है। यह उन्हें संगठनात्मक चार्ट जैसे हाइरार्किकल डेटा के साथ काम करने के लिए आदर्श बनाता है।
रिकर्सिव CTEs का परिचय
रिकर्सिव CTEs CTE का एक विशेष प्रकार हैं जो अपनी परिभाषा के भीतर स्वयं को संदर्भित करते हैं, जिससे क्वेरी बार-बार ऑपरेशंस कर सकती है। यह उन्हें हाइरार्किकल या ट्री-संरचित डेटा, जैसे संगठनात्मक चार्ट, डायरेक्टरी संरचनाएँ, या प्रोडक्ट असेंबलियाँ, के साथ काम करने के लिए आदर्श बनाता है। रिकर्सिव CTE क्रमिक रूप से डेटा प्रोसेस करता है, चरण-दर-चरण परिणाम लौटाता है जब तक कि रिकर्सिव मेंबर कोई नई पंक्तियाँ न लौटाए (समापन शर्त)।
एंकर और रिकर्सिव मेंबर
एक रिकर्सिव CTE मुख्यतः दो भागों से बना होता है:
- एंकर मेंबर: वह भाग जो रिकर्शन शुरू करने वाली बेस क्वेरी को परिभाषित करता है।
- रिकर्सिव मेंबर: वह भाग जो CTE को स्वयं संदर्भित करता है, जिससे "रिकर्सिव" ऑपरेशंस संभव होते हैं।
मान लें हमारे पास Employees टेबल है, जहाँ हर पंक्ति में EmployeeID, EmployeeName, और ManagerID होता है। यदि हम किसी विशिष्ट मैनेजर के सभी प्रत्यक्ष और अप्रत्यक्ष रिपोर्ट्स ढूँढ़ना चाहते हैं, तो हम टॉप-लेवल मैनेजर की पहचान करने वाले एंकर मेंबर से शुरू करते हैं।
नोट: स्टैंडर्ड SQL (PostgreSQL, MySQL, SQLite) में आपको RECURSIVE कीवर्ड का उपयोग करना होगा।
WITH RECURSIVE EmployeeHierarchy AS (
-- Anchor member: select the top-level manager
SELECT
EmployeeID,
EmployeeName,
ManagerID,
1 AS Level
FROM Employees
WHERE EmployeeID = 1 -- Starting with the top-level manager
UNION ALL
-- Recursive member: find employees who report to the current managers
SELECT
e.EmployeeID,
e.EmployeeName,
e.ManagerID,
eh.Level + 1
FROM Employees e
INNER JOIN EmployeeHierarchy eh
ON e.ManagerID = eh.EmployeeID
)
-- Select the final result from the CTE
SELECT EmployeeID, EmployeeName, Level
FROM EmployeeHierarchy;
यह कैसे काम करता है:
- एंकर: क्वेरी पहले एंकर मेंबर चलाती है, और ID 1 वाले कर्मचारी को ढूँढ़ती है।
- रिकर्शन: रिकर्सिव मेंबर चलता है, उन कर्मचारियों को ढूँढ़ता है जिनका
ManagerIDपिछले चरण में मिलेEmployeeIDसे मेल खाता है। - लूप: यह प्रक्रिया तब तक दोहराई जाती है (लेवल 1 को लेवल 2 मिलते हैं, लेवल 2 को लेवल 3) जब तक कोई नए कर्मचारी नहीं मिलते।
SQL में CTEs की संभावित समस्याएँ या सीमाएँ
तार्किक और पठनीय क्वेरी लिखने के लिए CTEs की विशेषताओं और सीमाओं को समझना महत्वपूर्ण है। आइए अलग-अलग डेटाबेस में CTEs के उपयोग की कुछ सीमाएँ और संभावित मुद्दे देखें।
SQL Server और Azure सीमाएँ
SQL Server या Azure Synapse Analytics के साथ काम करते समय SQL CTEs के कुछ वातावरण-विशिष्ट प्रतिबंध होते हैं। इनमें निम्न शामिल हैं:
- SQL Server: रिकर्सिव CTEs के लिए डिफ़ॉल्ट अधिकतम रिकर्शन स्तर 100 है। यदि इस सीमा को समायोजन के बिना पार किया जाता है, तो त्रुटि आती है। CTE परिभाषाएँ सीधे किसी अन्य CTE परिभाषा के भीतर नेस्ट नहीं की जा सकतीं (हालाँकि आप कई CTEs को क्रमिक रूप से चेन कर सकते हैं)।
- Azure Synapse Analytics: सपोर्ट विशिष्ट पूल प्रकार पर निर्भर करता है। रिकर्सिव CTEs वर्तमान में Dedicated SQL Pools (पूर्व में SQL DW) में समर्थित नहीं हैं। हालाँकि, वे Serverless SQL Pools में समर्थित हैं। इसके अलावा, कुछ DML ऑपरेशंस (जैसे CTEs के साथ
UPDATEयाDELETE) में स्टैंडर्ड SQL Server की तुलना में सिंटैक्स प्रतिबंध हो सकते हैं।
यदि आप स्वयं को SQL Server के साथ काम करते पाते हैं, तो जान लें कि DataCamp के पास मदद के लिए बहुत से बेहतरीन संसाधन हैं। शुरुआत के लिए, मैं DataCamp का Introduction to SQL Server कोर्स लेने की सलाह देता हूँ ताकि डेटा विश्लेषण के लिए SQL Server की मूल बातें सीख सकें। आप हमारा SQL Server Developer करियर ट्रैक आज़मा सकते हैं, जो ट्रांज़ैक्शंस और एरर हैंडलिंग से लेकर टाइम सीरीज़ एनालिसिस तक सब कुछ कवर करता है। हमारा Hierarchical and Recursive Queries in SQL Server कोर्स सीधे इस बात के मूल में जाता है कि SQL Server में उन्नत क्वेरीज़ कैसे लिखें, जिनमें CTEs से जुड़े तरीके शामिल हैं।
अन्य संभावित समस्याएँ
हालाँकि CTEs जटिल क्वेरीज़ को सरल बनाने में उपयोगी हैं, कुछ सामान्य गलतियाँ हैं जिनसे आपको अवगत होना चाहिए। इनमें निम्न शामिल हैं:
-
रिकर्सिव CTEs में अनंत लूप: यदि रिकर्सिव CTE के लिए समापन शर्त पूरी नहीं होती, तो यह अनंत लूप में बदल सकती है, जिससे क्वेरी अनिश्चित काल तक चलती रहती है। रिकर्सिव CTE को अनिश्चितकाल तक चलने से रोकने के लिए,
OPTION (MAXRECURSION N)हिंट का उपयोग करें ताकि रिकर्सिव इटरशन की अधिकतम संख्या सीमित की जा सके, जहाँNनिर्दिष्ट सीमा है।- कैसे ठीक करें: SQL Server में, रिकर्सिव इटरशन की अधिकतम संख्या सीमित करने के लिए
OPTION (MAXRECURSION N)हिंट का उपयोग करें। PostgreSQL में, आप लूप्स को स्वतः पहचानने के लिएCYCLEक्लॉज़ का उपयोग कर सकते हैं।
- कैसे ठीक करें: SQL Server में, रिकर्सिव इटरशन की अधिकतम संख्या सीमित करने के लिए
-
प्रदर्शन संबंधी विचार: यदि रिकर्शन की गहराई अधिक है या बड़े डेटासेट प्रोसेस किए जा रहे हैं तो रिकर्सिव CTEs संसाधन-गहन हो सकती हैं। प्रदर्शन को बेहतर बनाने के लिए, प्रत्येक इटरशन में प्रोसेस होने वाले डेटा को सीमित करें और अत्यधिक रिकर्शन स्तरों से बचने के लिए उपयुक्त फ़िल्टरिंग सुनिश्चित करें।
प्रदर्शन: CTEs बनाम सबक्वेरीज़
एक आम मिथक है कि CTEs स्वाभाविक रूप से सबक्वेरीज़ से तेज होती हैं। वास्तविकता में, अधिकांश आधुनिक क्वेरी ऑप्टिमाइज़र (जैसे SQL Server और PostgreSQL में) स्टैंडर्ड CTEs को "इनलाइन" कर देते हैं, अर्थात् वे सबक्वेरीज़ की तरह ही प्रोसेस होती हैं और प्रदर्शन में कोई अंतर नहीं होता।
हालाँकि, CTEs मैटेरियलाइज़ेशन के माध्यम से प्रदर्शन में बढ़त दे सकती हैं, जहाँ डेटाबेस CTE परिणाम को एक बार गणना करता है और मुख्य क्वेरी के भीतर कई संदर्भों के लिए उसे कैश कर देता है।
मैं CTEs का उपयोग मुख्य रूप से पठनीयता के लिए करने की सलाह देता हूँ। प्रदर्शन लाभ स्थिति-निर्भर होते हैं और यह इस पर निर्भर करता है कि आपका विशिष्ट डेटाबेस कैशिंग को कैसे संभालता है।
CTEs का उपयोग कब करें बनाम अन्य तकनीकें
हालाँकि CTEs दोहराए जाने वाले कार्यों वाली क्वेरीज़ को सरल बनाने के लिए उपयुक्त हैं, डिराइव्ड टेबल्स, व्यूज़, और टेम्प टेबल्स भी समान उद्देश्य पूरा करती हैं। निम्न तालिका प्रत्येक विधि के लाभ, हानियाँ और उपयोग का समय दर्शाती है।
| Technique | Advantages | Disadvantages | Suitable Use Case |
|---|---|---|---|
| CTEs | एकल क्वेरी के भीतर अस्थायी स्कोपकोई स्टोरेज या मेंटेनेंस आवश्यक नहींकोड को मॉड्यूलर बनाकर पठनीयता में सुधार | केवल उसी क्वेरी तक सीमित जिसमें वे परिभाषित हैं | जटिल क्वेरीज़ को व्यवस्थित करना, अस्थायी रूपांतरण, और बहु-चरणीय कार्यों को तोड़ना |
| Derived Tables | नेस्टेड सबक्वेरीज़ को सरल बनातास्थायी स्टोरेज की आवश्यकता नहीं | जटिल क्वेरीज़ के लिए पढ़ना/मेंटेन करना कठिनक्वेरी के भीतर कई बार पुन: उपयोग नहीं किया जा सकता | क्वेरी के भीतर त्वरित, एक-बार उपयोग वाले ट्रांसफॉर्मेशन और एग्रीगेशन |
| Views | क्वेरीज़ में पुन: उपयोग योग्यडेटा एक्सेस को सीमित कर सुरक्षा बढ़ा सकते हैं | मेंटेनेंस की आवश्यकता होती है और कई क्वेरीज़ को प्रभावित कर सकते हैंजटिल व्यूज़ प्रदर्शन पर प्रभाव डाल सकते हैं | दीर्घकालिक पुन: उपयोग योग्य लॉजिक और डेटा एक्सेस नियंत्रण |
निष्कर्ष
CTEs में महारत अभ्यास से आती है, जैसे किसी और चीज़ में: एक दक्ष डेटा विश्लेषक बनने के लिए मैं DataCamp का Associate Data Analyst in SQL करियर ट्रैक आज़माने की सलाह देता हूँ। Reporting in SQL कोर्स भी आपको जटिल रिपोर्ट्स और डैशबोर्ड बनाने में दक्ष बनने में मदद करेगा ताकि डेटा प्रस्तुति प्रभावी हो। अंत में, आपको SQL Associate Certification प्राप्त करनी चाहिए ताकि आप SQL का उपयोग करके व्यावसायिक समस्याओं को सुलझाने में अपनी महारत प्रदर्शित कर सकें और अन्य पेशेवरों के बीच अलग दिखें।
डेटा एनालिटिक्स, बिज़नेस इंटेलिजेंस और डेटा साइंस में व्यावहारिक अनुभव रखने वाला डेटा साइंस तकनीकी लेखक। मैं SQL, Python, Power BI, Databricks और डेटा इंजीनियरिंग पर व्यावहारिक, उद्योग-केंद्रित सामग्री लिखता/लिखती हूँ, जो वास्तविक दुनिया की एनालिटिक्स कार्य से जुड़ी होती है। मेरी लेखनी तकनीकी गहराई और व्यावसायिक प्रभाव के बीच पुल का काम करती है, जिससे पेशेवरों को डेटा को आत्मविश्वासपूर्ण निर्णयों में बदलने में मदद मिलती है.
SQL CTE FAQs
SQL में CTE क्या है?
CTE (कॉमन टेबल एक्सप्रेशन) एक अस्थायी, नामित रिज़ल्ट सेट है जिसे SQL क्वेरी के भीतर WITH कीवर्ड का उपयोग करके परिभाषित किया जाता है, और जटिल क्वेरीज़ को छोटे, अधिक प्रबंधनीय हिस्सों में बाँटकर सरल बनाने के लिए उपयोग किया जाता है।
CTE और व्यू में क्या अंतर है?
CTEs अस्थायी होते हैं और केवल एकल क्वेरी की अवधि तक मौजूद रहते हैं। व्यूज़ डेटाबेस में संग्रहीत होते हैं और कई क्वेरीज़ में पुन: उपयोग किए जा सकते हैं। CTEs स्टोरेज स्पेस उपभोग नहीं करते, जबकि व्यूज़ करते हैं।
क्या CTEs टेम्परेरी टेबल्स से तेज होते हैं?
ज़रूरी नहीं। CTEs पठनीयता में सुधार करते हैं, लेकिन बड़े डेटासेट के लिए वे अस्थायी टेबल्स से हमेशा बेहतर प्रदर्शन नहीं करते।
क्या CTEs का उपयोग INSERT, UPDATE, या DELETE ऑपरेशंस में किया जा सकता है?
हाँ, CTEs का उपयोग डेटा मॉडिफिकेशन स्टेटमेंट्स में किया जा सकता है ताकि प्रक्रिया सरल हो, खासकर जब फ़िल्टरिंग या जॉइनिंग शामिल हो।
नॉन-रिकर्सिव और रिकर्सिव CTEs में क्या अंतर है?
नॉन-रिकर्सिव CTEs स्वयं को संदर्भित नहीं करते और सबक्वेरी या अस्थायी टेबल की तरह कार्य करते हैं। नॉन-रिकर्सिव CTEs, सबक्वेरीज़ या अस्थायी टेबल्स की तरह, जटिल क्वेरीज़ को सरल बनाते हैं। दूसरी ओर, रिकर्सिव CTEs क्वेरी परिभाषा के भीतर स्वयं को संदर्भित करते हैं और क्रमिक डेटा प्रोसेसिंग के लिए उपयोग होते हैं, जैसे कि हाइरार्किकल डेटा संरचनाओं को पार करना। वे ऐसे कार्यों के लिए उपयुक्त हैं जिनमें बार-बार निष्पादन की आवश्यकता होती है, जहाँ प्रत्येक चरण पिछले वाले पर आधारित होता है।
