MySQL 8 गैर-पुनरावर्ती और पुनरावर्ती दोनों सामान्य तालिका अभिव्यक्तियों का समर्थन करता है, A CTE (कॉमन टेबल एक्सप्रेशन) एक अस्थायी परिणाम सेट है जिसे आप किसी अन्य SELECT, INSERT, UPDATE, या DELETE स्टेटमेंट में संदर्भित कर सकते हैं।
गैर-पुनरावर्ती CTE
एक सामान्य तालिका अभिव्यक्ति (सीटीई) एक व्युत्पन्न तालिका की तरह है, लेकिन इसकी घोषणा खंड से के बजाय क्वेरी ब्लॉक से पहले रखी जाती है। सीटीई का उपयोग करते हुए, सबक्वेरी का मूल्यांकन केवल एक बार किया जाता है, सामान्य तालिका अभिव्यक्ति नामित अस्थायी परिणाम सेट के उपयोग को सक्षम करती है, सामान्य तालिका अभिव्यक्तियों को ऑपरेटर के साथ कथन के भीतर परिभाषित किया जाता है।
मान लीजिए कि आप पिछले वर्ष के संबंध में प्रत्येक वर्ष के भुगतान में प्रतिशत परिवर्तन का पता लगाना चाहते हैं। सीटीई के बिना, आपको दो सबक्वेरी लिखने की जरूरत है, और वे अनिवार्य रूप से वही हैं। MySQL इसका पता लगाने के लिए पर्याप्त स्मार्ट नहीं है और उपश्रेणियों को दो बार निष्पादित किया जाता है।
अगले_वर्ष के रूप में q1.years,q2.years,q1.sum1,q2.sum1 as next_sum,100 * (q2.sum1 - q1.sum1) / q1.sum1 पीसीटी से चुनें (वर्ष (भुगतान दिनांक) के रूप में वर्ष चुनें, एसयूएम (राशि) वर्ष के अनुसार भुगतान समूह से योग 1 के रूप में) q1 के रूप में, (वर्ष (भुगतान तिथि) वर्ष के रूप में चुनें, योग (राशि) वर्ष के अनुसार भुगतान समूह से योग 1 के रूप में) q2WHEREq1.years =q2.years - 1; +-- -----+----------+---------------+---------------+---------- ------+| साल | अगले_वर्ष | योग1 | next_sum | पीसीटी |+----------+-----------+-----------+---------------+- -----------+| 2003 | 2004 | 3250217.70 | 4313328.25 | 32.708903 || 2004 | 2005 | 4313328.25 | 1290293.28 | -70.085901 | ------------+2 पंक्तियाँ सेट में (0.01 सेकंड)
गैर-पुनरावर्ती सीटीई के साथ, व्युत्पन्न क्वेरी को केवल एक बार निष्पादित किया जाता है और पुन:उपयोग किया जाता है
CTE_NAME AS के साथ (वर्षों के रूप में वर्ष (भुगतान तिथि) चुनें, योग (राशि) वर्ष के अनुसार भुगतान समूह से योग 1 के रूप में चुनें) q1.years,q2.years as next_year,q1.sum1,q2.sum1 AS next_sum,100 * (q2.sum1 - q1.sum1) / q1.sum1 CTE_NAME के रूप में q1, CTE_NAME AS q2 से पीसीटी जहां q1.years =q2.years - 1; + -------- + -------- ---- +---------------+---------------+-----------+| साल | अगले_वर्ष | योग1 | next_sum | पीसीटी |+----------+-----------+-----------+---------------+- -----------+| 2003 | 2004 | 3250217.70 | 4313328.25 | 32.708903 || 2004 | 2005 | 4313328.25 | 1290293.28 | -70.085901 | ------------+2 पंक्तियाँ सेट में (0.00 सेकंड)
आप देख सकते हैं कि सीटीई के साथ, परिणाम समान हैं और क्वेरी समय में 50% तक सुधार होता है, पठनीयता अच्छी है और इसे कई बार संदर्भित किया जा सकता है
CTE अन्य CTE को संदर्भित कर सकते हैं:cte1 AS के साथ (चुनें ... से ...), cte2 AS (चुनें ... cte1 से ...) cte1, cte2 से चुनें ...
पुनरावर्ती सीटीई
एक पुनरावर्ती सीटीई एक सीटीई है जो स्वयं को संदर्भित करता है। ऐसा करने पर, प्रारंभिक सीटीई को बार-बार निष्पादित किया जाता है, डेटा के सबसेट लौटाता है, जब तक कि पूरा परिणाम वापस नहीं आ जाता
ReCURSIVE cte_name AS(cte_definition -- /* Seed SELECT */UNION ALLcte_definition -- /* "recursive" SELECT */ संदर्भ cte_name के साथ।)- CTESELECT *FROM cte_nameका इस्तेमाल करके स्टेटमेंट
प्रारंभिक डेटा सबसेट बनाने के लिए बीज चयन को एक बार निष्पादित किया जाता है; पुनरावर्ती चयन को बार-बार डेटा के सबसेट को वापस करने के लिए निष्पादित किया जाता है जब तक कि पूरा परिणाम सेट प्राप्त न हो जाए। जब पुनरावृत्ति कोई नई पंक्तियाँ उत्पन्न नहीं करती है तो पुनरावर्तन रुक जाता है।
मान लीजिए कि आप प्रत्येक कर्मचारी के लिए प्रबंधन श्रृंखला के साथ एक संगठनात्मक चार्ट तैयार करने के लिए पदानुक्रमित डेटा ट्रैवर्सल करना चाहते हैं (यानी, सीईओ से कर्मचारी तक का रास्ता)। एक पुनरावर्ती सीटीई का प्रयोग करें! रिकर्सिव सीटीई पदानुक्रमित डेटा को क्वेरी करने के लिए उपयुक्त हैं,
तालिका बनाएं
टेबल मैंगेरेम्प बनाएं (आईडी INT प्राथमिक कुंजी न्यूल नहीं, नाम VARCHAR(100) NOT NULL,man_id INT NULL,INDEX (man_id),FOREIGN KEY (man_id) संदर्भ mangeremp (id));
पदानुक्रमित संरचना प्राप्त करने के लिए डेटा डालें
इन्सर्ट इनटू मैन्जरेम्प वैल्यू(333, "वकास", न्यूल), # वकास सीईओ है (मैन_आईडी इज न्यूल)(198, "अली", 333), # अली के पास आईडी 198 है और 333 (वकास) को रिपोर्ट करता है ( 692, "अहमद", 333), #अहमद की रिपोर्ट वकास को (29, "ओसामा", 198), #ओसामा की रिपोर्ट अली को रेफरी आईडी 198 (4610, "मुगीस", 29), # मुगी की रिपोर्ट ओसामा को (72, "असलम", 29),(123, "अफरोज", 692);
पुनरावर्ती emp_paths (आईडी, नाम, पथ) AS (चयन आईडी, नाम, CAST(id AS CHAR(200)) के साथ mangeremp से जहां man_id NULL UNION है, सभी चुनें e.id, e.name, CONCAT(ep. पथ, ',', e.id) emp_paths से ep ep.id =e.man_id के रूप में mangeremp के रूप में शामिल हों) चुनें * पथ द्वारा आदेश emp_paths से; +------ + -------- --+-----------------+| आईडी | नाम | पथ |+----------+------------+---------------------+| 333 | वकास | 333 || 198 | अली | 333,198 || 29 | ओसामा | 333,198,29 || 4610 | मुघिस | 333,198,29,4610 || 72 | असलम | 333,198,29,72 || 692 | अहमद | 333,692 || 123 | अफरोज | 333,692,123 |+------+-----------+---------------------+7 पंक्तियाँ सेट में (0.00 सेकंड)
e.id, e.name, CONCAT(ep.path, ',', e.id) से emp_paths से ep ep.id =e.man_id ---- रिकर्सिव क्वेरी चुनें। पूर्व>पुनरावर्ती क्वेरी द्वारा निर्मित प्रत्येक पंक्ति उन सभी कर्मचारियों को ढूंढती है जो पिछली पंक्ति द्वारा उत्पादित कर्मचारी को सीधे रिपोर्ट करते हैं। ऐसे प्रत्येक कर्मचारी के लिए, पंक्ति में
कर्मचारी आईडी, नाम और कर्मचारी प्रबंधन श्रृंखला शामिल होती है। श्रृंखला प्रबंधक की श्रृंखला है
अंत में जोड़े गए कर्मचारी आईडी के साथ