Subqueries SQL क्वेरी में अभिव्यंजक शक्ति जोड़ते हैं?


29

क्या एसक्यूएल को सबक्वेरी की जरूरत है?

संबंध डेटाबेस के लिए संरचित क्वेरी भाषा के पर्याप्त सामान्यीकृत कार्यान्वयन की कल्पना करें। चूंकि विहित एसक्यूएल SELECTबयान की संरचना वास्तव में इसके लिए बहुत महत्वपूर्ण है, इसलिए मैं सीधे संबंधपरक बीजगणित के लिए अपील नहीं करता हूं, लेकिन आप अभिव्यक्ति के रूप में उचित प्रतिबंध बनाकर उन शब्दों में इसे फ्रेम कर सकते हैं।

एक एसक्यूएल SELECTक्वेरी आम तौर पर एक प्रक्षेपण (होते SELECTहिस्सा) की कुछ संख्या JOIN(संचालन JOINभाग), में से कुछ संख्या SELECTION परिचालन (एसक्यूएल में, WHEREखंड), और फिर सेट के लिहाज से परिचालन ( UNION, EXCEPT, INTERSECT, आदि), एक और द्वारा पीछा किया SQL SELECTक्वेरी।

शामिल होने वाली तालिकाएं अभिव्यक्ति के गणना किए गए परिणाम हो सकते हैं; दूसरे शब्दों में, हम एक बयान कर सकते हैं जैसे:

SELECT t1.name, t2.address
  FROM table1 AS t1 
  JOIN (SELECT id, address 
          FROM table2 AS t3 
         WHERE t3.id = t1.id) AS t2
 WHERE t1.salary > 50,000;

हम एक SQL तालिका के एक हिस्से के रूप में एक गणना तालिका के उपयोग को एक उपकुंजी के रूप में संदर्भित करेंगे। ऊपर के उदाहरण में, दूसरा (इंडेंटेड) SELECTएक उपश्रेणी है।

क्या सभी एसक्यूएल प्रश्नों को इस तरह से लिखा जा सकता है जैसे कि सबक्वेरी का उपयोग न करना? ऊपर का उदाहरण:

SELECT t1.name, t2.address
  FROM table1 AS t1 
  JOIN table2 AS t2
    ON t1.id = t2.id
 WHERE t1.salary > 50,000;

यह उदाहरण कुछ हद तक स्पष्ट या तुच्छ है, लेकिन एक ऐसे उदाहरण की कल्पना कर सकते हैं जहां एक समकक्ष अभिव्यक्ति को पुनर्प्राप्त करने के लिए काफी अधिक प्रयास की आवश्यकता हो सकती है। दूसरे शब्दों में, क्या यह मामला है कि सबक्यूबरीज़ के साथ प्रत्येक एसक्यूएल क्वेरी के लिए, सबक्वेरीज के बिना क्वैरी क्यू मौजूद है जैसे कि क्यू और क्यू समान अंतर्निहित तालिकाओं के लिए समान परिणाम देने की गारंटी है? हमें निम्न प्रकार से SQL क्वेरी को सीमित करें:क्षक्ष'क्षक्ष'

SELECT <attribute>,
      ...,
      <attribute>
 FROM <a table, not a subquery>
 JOIN <a table, not a subquery>
  ...
 JOIN <a table, not a subquery>
WHERE <condition>
  AND <condition>
  ...
  AND <condition>

UNION
 -or-
EXCEPT
 -or-
<similar>

SELECT ...

और इसी तरह। मुझे लगता है कि बाएं और दाएं बाहरी जोड़ बहुत ज्यादा नहीं जोड़ते हैं, लेकिन अगर मुझसे गलती हुई है, तो कृपया बेझिझक कहें कि ... किसी भी घटना में, वे निष्पक्ष खेल हैं। जहाँ तक सेट ऑपरेशंस चलते हैं, मुझे लगता है कि उनमें से कोई भी ठीक है ... संघ, अंतर, सममित अंतर, प्रतिच्छेदन, आदि ... कुछ भी जो सहायक है। क्या ऐसे कोई ज्ञात रूप हैं जिनसे सभी एसक्यूएल प्रश्नों को कम किया जा सकता है? क्या इनमें से कोई भी सबकुछ खत्म कर देता है? या ऐसे कुछ उदाहरण हैं जहां कोई समान, सबक्वेरी-फ्री क्वेरी मौजूद नहीं है? संदर्भ की सराहना की जाती है ... या एक प्रदर्शन (प्रमाण द्वारा) कि वे आवश्यक हैं या नहीं शानदार होंगे। धन्यवाद, और खेद है कि अगर यह एक मनाया (या तुच्छ) परिणाम है, जिसमें मैं दर्द से अंजान हूं।


5
मेरी आंत मुझे बताती है कि आप हमेशा सब कुछ एक साथ जोड़ सकते हैं और तब तक वहां से चयन कर सकते हैं जब तक आपको समग्र मूल्यों की आवश्यकता नहीं है। इसके कॉलम के औसत से अधिक मूल्य वाली सभी प्रविष्टियों का चयन करने के लिए पहले औसत की गणना की आवश्यकता प्रतीत होती है, इसलिए एक उपश्रेणी की आवश्यकता होती है।
राफेल

@ राफेल मैं निश्चित रूप से आप समग्र मूल्यों को भी कर सकता हूं, आपको बस अधिक आत्म-जोड़ और समूह-बाय करने की आवश्यकता है (इसे तेजी से बड़ा करना, लेकिन अभी भी संभव है)। यकीन नहीं है कि मैं औपचारिक रूप से कैसे साबित करूंगा कि आप सब कुछ इस तरह से कर सकते हैं, हालांकि।
केविन

@ केविन क्या आप सुनिश्चित हैं कि आवश्यक संचालन की संख्या पंक्तियों की संख्या पर निर्भर नहीं करती है? क्योंकि हमारे पास ऐसा नहीं हो सकता है, क्या हम कर सकते हैं?
राफेल

1
एक उपश्रेणी की आवश्यकता के लिए मेरे पास सामान्य उदाहरण डुप्लिकेट की गिनती है select count(*) from (select id from sometable group by id having count(*)>1) d:। क्योंकि इसमें शामिल है group byमैंने इसे उत्तर के रूप में नहीं रखा है।
मार्क हर्ड

BTW AFAIK सामान्य एसक्यूएल में ONक्लॉज की आवश्यकता होती है JOIN, हालांकि एक क्रॉस उत्पाद सिर्फ अल्पविराम के साथ प्राप्त किया जाता है।
मार्क हर्ड

जवाबों:


9

कुछ शब्दावली भ्रम है; कोष्ठक के भीतर क्वेरी ब्लॉक

SELECT t1.name, t2.address
  FROM table1 
  JOIN (SELECT id, address 
          FROM table2 AS t3 
         WHERE t3.id = t1.id) 

आंतरिक दृश्य कहलाता है । एक सबक्वेरी , जहाँ या चुने हुए खंड, जैसे, के भीतर क्वेरी ब्लॉक है

select deptno from dept
where 3 < (select count(1) from emp 
           where dept.deptno=emp.deptno)

या तो मामले में, आंतरिक दृश्य या उपश्रेणी को "फ्लैट" परियोजना-प्रतिबंधित-जुड़ने में अनावश्यक किया जा सकता है। एकत्रीकरण के साथ सहसंबद्ध उपशम समूहीकरण के साथ आंतरिक विचारों में अनावश्यक है, जो तब फ्लैट क्वेरी में अनावश्यक हो जाता है।

select deptno from dept d
    where 3 < (select avg(sal) from emp e
               where d.deptno=e.deptno)

select d.deptno from dept d, ( 
    select deptno from emp e
    group by deptno
    having avg(sal) > 3
) where d.deptno=e.deptno

select d.deptno from dept d, emp e
where d.deptno=e.deptno 
group by d.deptno
having avg(sal) > 3

क्वेरी ऑप्टिमाइज़ेशन के लिए बीजीय नियमों के अनुसार, रिलेशनल एलजेब्रा को रिलेशनल लटिस में स्वयंसिद्ध कहा जाता है जो क्वेरी परिवर्तन को सरल बनाता है जैसा कि यहां और वहां प्रदर्शित किया गया है


मैं उत्सुक हूँ। क्या आप उस क्वेरी का उदाहरण जोड़ सकते हैं जो कुछ फ़ील्ड औसत का उपयोग करती है, उदाहरण के लिए उपरोक्त औसत मान वाली सभी प्रविष्टियों का चयन करना? यह मेरे लिए स्पष्ट नहीं है कि चपटे होने के बाद कैसा लगेगा।
राफेल

16

अपने कथन को संबंधपरक बीजगणित में अनुवाद करने के लिए, मुझे लगता है कि यह पूछता है:

σ()σबी(बी)σ(σबी(बी))

σ

जवाब "हाँ," है और यह एक मानक क्वेरी अनुकूलन है। ईमानदार होने के लिए, मुझे यकीन नहीं है कि इसे गैर-प्रश्न-भिखारी तरीके से कैसे साबित किया जाए - यह सिर्फ चयन की एक संपत्ति है और इसमें शामिल हों। आप चाहे तो नेस्टेड क्वेरीज़ की कई परतों को जोड़ने के लिए सामूहिक रूप से बहस कर सकते हैं।

इसके अतिरिक्त, आप पूछ सकते हैं:

बीसी...(बी)(सीडी)

फिर से जवाब हाँ है, क्योंकि शामिल होना साहचर्य है। प्रक्षेपण के बारे में भी इसी तरह के बयान दिए जा सकते हैं।

एक उल्लेखनीय प्रकार का "सबक्वेरी" जो मुझे लगता है कि "चपटा हुआ" नहीं हो सकता है with। यह देखने का एक तरीका यह है कि यदि आपके पास एक withबयान है तो आपके पास एक पुनरावर्ती कार्य हो सकता है, जो कि उपश्रेणियों का उपयोग किए बिना नहीं लिखा जा सकता है।

इसलिए योग करने के लिए: आपके द्वारा बताए गए विशिष्ट मामले में, एसक्यूएल को सबक्वेरी की आवश्यकता नहीं है, और आप इसे सही साबित कर सकते हैं। सामान्य तौर पर, ऐसी विशेषताएं हैं जिनमें उपश्रेणियों की आवश्यकता होती है।


के माध्यम से पुनरावर्ती व्यवहार withSQL: 1999 में पेश किया गया था, और परिणामी भाषा को सख्ती से अधिक अभिव्यंजक बनाता है।
अंद्र दास सलामन

1

"क्या सबक्वेरीज़ SQL प्रश्नों में अभिव्यंजक शक्ति जोड़ते हैं?"

उन्होंने कम से कम SQL भाषा में EXCEPT की शुरूआत से पहले किया था।

EXCEPT की शुरुआत से पहले, वहाँ कोई रास्ता नहीं था इसलिए कभी भी उप-वर्गों का सहारा लिए बिना SQL में एक संबंधपरक अंतर या अर्ध-अभिव्यक्ति को व्यक्त करने के लिए।

इन दिनों, "रिलेशनल बीजगणित" के "विशिष्ट" आदिम संचालकों के सभी उप-वर्गों के बिना व्यक्त किए जा सकते हैं:

प्राकृतिक में शामिल होने के किया जा सकता है प्राकृतिक के माध्यम से शामिल हों, या में शामिल होने
यूनिअन यूनिअन के माध्यम से किया जा सकता है
माइनस छोड़कर के माध्यम से किया जा सकता है
परियोजना / नाम बदलें / चयन throug किया जा सकता है विस्तार
प्रतिबंधित के माध्यम से जहां किया जा सकता है
संबंधपरक शाब्दिक मान के माध्यम से किया जा सकता है
सकर्मक बंद कर सकते हैं के साथ पुनरावर्ती के माध्यम से किया जाना चाहिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.