ER प्रतिरूप, संबंधात्मक बीजगणित, टपल कैलकुलस व SQL

कंप्यूटर विज्ञान पेपर का खंड 9, और खंड 2 से 8 की भाँति इसके लिए किसी अन्य सत्यापित पेपर का पाठ्यक्रम नहीं पढ़ा गया। अध्याय एक पाइपलाइन का अनुसरण करता है: ER प्रतिरूप में अभिकल्प, सारणियों में मानचित्रित, किसी बीजगणित से पूछा गया, किसी कैलकुलस से वर्णित, और SQL में लिखा। प्रत्येक चरण भिन्न प्रकार के प्रश्न का उत्तर देता है और प्रश्न विरले ही विनिमेय हैं। ER मानचित्रण एक गिनती-समस्या है जिसका नियम बिना विवेक लगाया जा सकता है: कोटिकता तय करती है कितनी सारणियाँ, सहभागिता तय करती है शून्य मान आएँगे क्या — M:N संबंध को सदा अपनी सारणी चाहिए, शेष कुछ भी किसी सत्ता-सारणी में समा जाता है। संबंधात्मक बीजगणित प्रक्रियात्मक है: पाँच मूल संकारक (चयन, प्रक्षेपण, सम्मिलन, अंतर, कार्तीय गुणन), शेष सब व्युत्पन्न, और परीक्षणीय विषय यह है कि किसी पृच्छा को कौन-से संकारक चाहिए और कितने टपल निकलते हैं। टपल कैलकुलस घोषणात्मक है — आप मार्ग के बजाय उत्तर वर्णित करते हैं — और वह पाठ्यक्रम में एक जानने योग्य कारण से है: वही इस कथन को सटीक बनाता है कि संबंधात्मक बीजगणित व सुरक्षित टपल कैलकुलस की अभिव्यक्ति-शक्ति ठीक समान है, और अतः वही यह कहना अर्थपूर्ण बनाता है कि कोई भी संक्रमणीय संवर्त नहीं निकाल सकता। तत्पश्चात् SQL, जो दोनों नहीं है: वह समुच्चयों के स्थान पर बहुसमुच्चयों सहित बीजगणित है और, निर्णायक रूप से, त्रि-मान तर्क सहित। लगभग प्रत्येक SQL प्रश्न जो कठिन दिखता है भीतर से शून्य-मान का प्रश्न है — COUNT(*) व COUNT(x) भिन्न हैं, AVG वह SUM/COUNT(*) नहीं, और एकमात्र शून्य मान लौटाती NOT IN उप-पृच्छा आपको कुछ भी नहीं लौटाती।

ER से सारणियाँ: कोटिकता गिनती है, सहभागिता शून्य मान

दो सत्ता-समुच्चयों के बीच एक द्विक संबंध हेतु न्यूनतम सारणियाँ
संरचनान्यूनतम सारणियाँक्यों
M:N संबंध3कोई कुंजी दूसरी को निर्धारित नहीं करती, अतः युग्मों को अपनी सारणी चाहिए
1:N संबंध2प्रत्येक N-पक्ष पंक्ति का अधिकतम एक साथी है, अतः वह विदेशी कुंजी रखती है
1:1 संबंध2किसी भी पक्ष में समाएँ; पूर्ण सहभागी को वरीयता दें
दुर्बल सत्ता-समुच्चय+1उसकी अपनी सारणी, जिसकी प्राथमिक कुंजी में स्वामी की कुंजी सम्मिलित
बहुमानी गुण+1प्रति मान एक पंक्ति; 1NF में स्तंभ समुच्चय नहीं रख सकता
⚠️ सहभागिता शून्य मान बदलती है, सारणियों की गिनती नहीं
दोनों विचार नित्य मिला दिए जाते हैं, अतः उन्हें पृथक् रखें। कोटिकता (1:1, 1:N, M:N) तय करती है कि न्यूनतम उत्तर में कितनी सारणियाँ हैं। सहभागिता (पूर्ण या आंशिक) तय करती है कि समाई विदेशी कुंजी शून्य हो सकती है क्या। ऐसे 1:N संबंध में जहाँ N पक्ष आंशिक सहभागी है, संबंध को समाना तब भी 2 सारणियाँ देता है — असंबंधित पंक्तियाँ सरलतः शून्य विदेशी कुंजी रखती हैं। यदि N पक्ष पूर्ण सहभागी हो, तो प्रत्येक पंक्ति का ठीक एक साथी है और स्तंभ NOT NULL है, जो कठोरतः श्रेष्ठ है पर भिन्न गिनती नहीं। अतः जब प्रश्न सारणियों की न्यूनतम संख्या पूछे, केवल कोटिकता पढ़ें; जब वह पूछे कि कोई विघटन शून्य मान टालता है क्या, या विदेशी कुंजी NOT NULL घोषित हो सकती है क्या, तो सहभागिता पढ़ें। सहभागिता गिनती को एक ही स्थान पर हिलाती है: ऐसा अभिकल्प जो सिद्धांततः शून्य मान अस्वीकार करे; तब आंशिक 1:1 को तीसरी सारणी चाहिए, क्योंकि किसी भी ओर समाना उन्हें बाध्य करता है।

पाँच संकारक, तथा विभाजन किससे बना है

संबंधात्मक बीजगणित में ठीक पाँच मूल संकारक हैं — चयन σ, प्रक्षेपण π, सम्मिलन ∪, समुच्चय अंतर −, तथा कार्तीय गुणन × — और शेष सब संक्षेपण है। सर्वनिष्ठ R − (R − S) है। प्राकृतिक संयोजन कार्तीय गुणन है, फिर समान गुणों पर चयन, फिर द्विरुक्त स्तंभ हटाता प्रक्षेपण। विभाजन वही है जो मूल दिखता है और नहीं है, और उसका निष्पादन एक बार करने योग्य है क्योंकि निष्पादन ही अंतर्दृष्टि है: R ÷ S R के शेष गुणों पर वे मान माँगता है जो S के प्रत्येक टपल के साथ आते हैं, और केवल मूल संकारकों से उसे निकालने का मार्ग है उन्हें खोजना जो विफल होते हैं और उन्हें घटाना।

🧠 विभाजन, निष्पादित और फिर एक निदर्श पर चलाया गया
X = R के वे गुण जो S में नहीं, इससे तत्समक है R ÷ S = πX(R) − πX((πX(R) × S) − R)। उसे दाएँ से बाएँ पढ़ें। πX(R) × S प्रत्येक वह युग्मन है जो किसी मान के अर्ह होने हेतु विद्यमान होना पड़ता; R घटाने से ठीक अनुपस्थित युग्मन बचते हैं; उन्हें X पर प्रक्षेपित करना विफल मानों का नाम देता है; और उन्हें R के सब मानों से हटाना सफल मान छोड़ देता है। एक निदर्श पर चलाएँ: R(sid, cid) अंकित करता है कौन कौन-सा पाठ्यक्रम लेता है, S में c1, c2, c3 हैं, और s1 व s4 तीनों लेते हैं जबकि s2 दो व s3 एक। तब πsid(R) है {s1, s2, s3, s4}, कार्तीय गुणन में 12 युग्म हैं, R घटाने से ठीक (s2,c3), (s3,c2), (s3,c3) बचते हैं, जिनका प्रक्षेपण {s2, s3} है — और {s1,s2,s3,s4} − {s2,s3} है {s1, s4}, जो विभाजन का अर्थ है। विभाजन का परीक्षणीय रूप सदा यही है: किसी समुच्चय के सब से संबंधित सत्ताएँ खोजें, और प्रश्न में “सब” वाक्यांश ही बताता है कि उत्तर को वह चाहिए।
परिणाम की कोटिकता: आँकड़े देखे बिना क्या परिबद्ध किया जा सकता है
R (n टपल) व S (m टपल) पर संक्रियान्यूनतमअधिकतम
R × S (कार्तीय गुणन)n × mn × m — यह यथातथ्य है
साझा गुण पर प्राकृतिक संयोजन0 — कोई मेल खाता मान नहींn × m — सर्वत्र एक ही साझा मान
R ∪ S (समान स्कीमा)max(n, m) — एक दूसरे को समाविष्ट करताn + m — असंयुक्त
R − S0 — R ⊆ Sn — असंयुक्त
गैर-कुंजी गुण-सूची पर π1n — प्रक्षेपण द्विरुक्तियाँ हटाता है
वाम बाह्य संयोजनn — प्रत्येक R टपल बचता हैn × m

टपल कैलकुलस, तथा पाठ्यक्रम उसे क्यों नामित करता है

टपल संबंधात्मक कैलकुलस किसी पृच्छा को { t | P(t) } के रूप में लिखता है — वे टपल t जो किसी प्रथम-कोटि सूत्र P को संतुष्ट करते हैं — और वह घोषणात्मक है: वह कहता है उत्तर में क्या है, कभी नहीं कि उसे कैसे निकालें। जहाँ बीजगणित πname(σdept = "Sales"(Emp)) लिखता है, कैलकुलस लिखता है { t.name | Emp(t) ∧ t.dept = “Sales” }। परिमाणक वही कार्य करते हैं जो बीजगणित में संयोजन: दूसरे संबंध पर ∃ एक संयोजन है, और ∀ एक विभाजन। प्रांत संबंधात्मक कैलकुलस वही वस्तु है जिसमें चर सम्पूर्ण टपलों के बजाय गुण-मानों पर विचरते हैं, और दोनों तुल्य हैं।

🎯 सुरक्षा, तथा वह तुल्यता जिसे कहने हेतु सम्पूर्ण विषय विद्यमान है
कैलकुलस ऐसी निरर्थकता लिख सकता है जो बीजगणित नहीं। { t | ¬ Emp(t) } वैध सूत्र है और विश्व के प्रत्येक उस टपल का नाम लेता है जो कर्मचारी नहीं — अनंत उत्तर। कोई व्यंजक सुरक्षित कहा जाता है जब उसका परिणाम परिमित प्रत्याभूत हो, जिसका व्यवहार में अर्थ है प्रत्येक चर किसी संबंध से परिबद्ध हो। इसका महत्व वह प्रमेय है जिसकी ओर पाठ्यक्रम संकेत कर रहा है: संबंधात्मक बीजगणित, सुरक्षित टपल कैलकुलस व सुरक्षित प्रांत कैलकुलस की अभिव्यक्ति-शक्ति ठीक समान है। तीन संकेतन, पृच्छाओं का एक वर्ग — और वही यह कहना अर्थपूर्ण बनाता है कि कोई पृच्छा अभिव्यक्तनीय नहीं है। और ऐसी पृच्छा का मानक उदाहरण संक्रमणीय संवर्त है: संबंध Parent(x, y) से आप संबंधात्मक बीजगणित में Ancestor(x, y) नहीं लिख सकते, क्योंकि नियत व्यंजक में संयोजनों की संख्या नियत है और पूर्वजता को असीमित रूप से अनेक चाहिए। वह आपकी पृच्छा-लेखन का अभाव नहीं; वह सिद्ध सीमा है, और इसीलिए SQL को WITH RECURSIVE को मिष्टान्न के बजाय विस्तार के रूप में जोड़ना पड़ा। समुच्चयन वही कथा है — COUNT व SUM भी शुद्ध बीजगणित के बाहर हैं, और इसीलिए SQL को समुच्चयों के बजाय बहुसमुच्चयों पर बीजगणित तथा समुच्चयन कहा जाता है।

SQL त्रि-मानी है, और वही प्रश्न है

शून्य मान कोई मान नहीं; वह किसी मान की अनुपस्थिति है, और उसे सम्मिलित करती प्रत्येक तुलना सत्य या असत्य के बजाय अज्ञात का मूल्यांकन करती है। NULL = NULL अज्ञात है। NULL <> NULL भी। कोई WHERE उपवाक्य किसी पंक्ति को केवल तब रखता है जब उसकी शर्त सत्य हो, अतः अज्ञात वहाँ असत्य जैसा व्यवहार करता है — पर सर्वत्र नहीं, और वही अंतराल है जहाँ अंक हैं। नीचे के परिणाम ऐसी पाँच-पंक्ति emp सारणी पर बने जिसमें एक वेतन व एक प्रबंधक शून्य हैं।

पाँच पंक्तियाँ, एक शून्य वेतन, एक शून्य प्रबंधक — प्रत्येक पृच्छा क्या लौटाती है
पृच्छापरिणामक्यों
COUNT(*)5पंक्तियाँ गिनता है, और पंक्ति विद्यमान है उसमें कुछ भी हो
COUNT(salary)4उस स्तंभ के गैर-शून्य मान गिनता है
COUNT(DISTINCT salary)3दो कर्मचारी 70000 साझा करते हैं, और शून्य तब भी छूटता है
AVG(salary)62500250000 / 4 — भाजक गैर-शून्य गिनती है
SUM(salary) / COUNT(*)50000250000 / 5 — भिन्न प्रश्न, 12500 का अंतर
GROUP BY mgr4 समूहशून्य मान एक समूह बनाते हैं — समूहन उन्हें समान मानता है
⚠️ एक शून्य मान रखती NOT IN उप-पृच्छा कुछ भी नहीं लौटाती
यह खंड का सर्वाधिक मूल्यवान शून्य-तथ्य है, और सहज नहीं है। किसी को न सँभालते कर्मचारी WHERE eid NOT IN (SELECT mgr FROM emp) से माँगना शून्य पंक्तियाँ लौटाता है, यद्यपि ऐसे दो कर्मचारी स्पष्टतः विद्यमान हैं। उसे विस्तारित करें: eid NOT IN (NULL, 1, 1, 2, 3) का अर्थ है eid ≠ NULL AND eid ≠ 1 AND …, और eid ≠ NULL अज्ञात है, अतः सम्पूर्ण संयोजन कभी सत्य नहीं हो सकता — अधिकतम अज्ञात हो सकता है, और WHERE उसे त्याग देता है। दो मरम्मतें, दोनों जानने योग्य। उप-पृच्छा में WHERE mgr IS NOT NULL जोड़ें, और वही पृच्छा दो पंक्तियाँ लौटाती है। या उसे NOT EXISTS (SELECT 1 FROM emp m WHERE m.mgr = e.eid) लिखें, जो उस रक्षक के बिना वे दो पंक्तियाँ लौटाती है — क्योंकि NOT EXISTS पूछता है कि कोई पंक्ति मिली क्या, वस्तुतः द्वि-मानी प्रश्न जिसे शून्य मान विषाक्त नहीं कर सकते। और वह असममिति ध्यान दें जो इसे छूटने योग्य बनाती है: शून्य सहित IN सुरक्षित है (1 IN (1, NULL) सत्य है, क्योंकि एक वियोजक सत्य है), जबकि शून्य सहित NOT IN नहीं। ले जाने योग्य नियम: शून्य-योग्य स्तंभ पर NOT IN तब तक दोष है जब तक अन्यथा सिद्ध न हो; NOT EXISTS को वरीयता दें।

मुख्य बिंदु

  • कोटिकता न्यूनतम सारणी-गिनती तय करती है: M:N को 3 चाहिए, 1:N व 1:1 को 2, दुर्बल सत्ता एक जोड़ती है।
  • सहभागिता तय करती है कि विदेशी कुंजी शून्य हो सकती है क्या, यह नहीं कि सारणियाँ कितनी हैं।
  • पाँच मूल संकारक: σ, π, ∪, − व ×। सर्वनिष्ठ, संयोजन व विभाजन सब व्युत्पन्न।
  • R ÷ S = πX(R) − πX((πX(R) × S) − R): विफल होते मान खोजें, फिर उन्हें घटाएँ।
  • प्राकृतिक संयोजन 0 से n × m टपल तक कुछ भी लौटा सकता है; वाम बाह्य संयोजन कम से कम n लौटाता है।
  • बीजगणित, सुरक्षित टपल कैलकुलस व सुरक्षित प्रांत कैलकुलस की अभिव्यक्ति-शक्ति समरूप है।
  • संक्रमणीय संवर्त व समुच्चयन शुद्ध संबंधात्मक बीजगणित के बाहर हैं — सिद्ध सीमा, कौशल का अभाव नहीं।
  • COUNT(*) पंक्तियाँ गिनता है; COUNT(x) गैर-शून्य मान; AVG(x) गैर-शून्य गिनती से भाग देता है।
  • शून्य-योग्य स्तंभ पर NOT IN कुछ नहीं लौटाता; NOT EXISTS सुरक्षित रूप है।
  • GROUP BY शून्य मानों को एक समूह मानता है, यद्यपि NULL = NULL अज्ञात है।

अभ्यास प्रश्न (8)

उत्तर खोलने से पहले प्रत्येक प्रश्न हल करें। हर व्याख्या सही विकल्प के साथ लुभावना गलत विकल्प भी बताती है, क्योंकि अंक वहीं जाते हैं।

  1. किसी ER आरेख में दो सत्ता-समुच्चय E1 व E2 एकमात्र M:N संबंध R से जुड़े हैं, और R अपना एक वर्णनात्मक गुण रखता है। संबंधात्मक स्कीमा में सारणियों की न्यूनतम संख्या क्या है?

    1. 2
    2. 3
    3. 4
    4. 1
    उत्तर देखें

    उत्तर: B — 3

    3। M:N संबंध में किसी भी सत्ता की कुंजी दूसरी को निर्धारित नहीं करती, अतः E1 की एक पंक्ति E2 की अनेक पंक्तियों से युग्मित हो सकती है व विलोमतः — किसी भी सत्ता-सारणी में एकमात्र विदेशी कुंजी रखने का स्थान नहीं। अतः युग्मों को अपनी सारणी चाहिए, जिसकी प्राथमिक कुंजी दोनों विदेशी कुंजियाँ मिलकर हैं, और R का वर्णनात्मक गुण वहाँ साधारण स्तंभ के रूप में जाता है। ध्यान दें गुण गिनती नहीं बदलता: तीसरी सारणी पहले से चाहिए थी, और गुण के बिना भी M:N संबंध को एक चाहिए। विकल्प A, 1:N या 1:1 का उत्तर है, जहाँ अनेक-पक्ष (या कोई भी पक्ष) विदेशी कुंजी रख सकता है। विकल्प C संबंध-गुण को अपनी सारणी देने से निकलता, जिसकी कोई आवश्यकता नहीं। यांत्रिक रूप से लगाने योग्य नियम: सारणी-गिनती हेतु कोटिकता पढ़ें, और सहभागिता केवल इसके लिए कि विदेशी कुंजी NOT NULL हो सकती है क्या।
  2. सारणी emp में 5 पंक्तियाँ हैं। salary स्तंभ 50000, 60000, 70000, 70000 व NULL है। AVG(salary) − SUM(salary)/COUNT(*) का मान ______ है

    संख्यात्मक उत्तर — मान टाइप करें।

    उत्तर देखें

    उत्तर: 12500

    12500। दोनों व्यंजक केवल अपने भाजक में भिन्न हैं, और वही सम्पूर्ण अभिप्राय है। SUM(salary) शून्य छोड़ता है और 250000 है। AVG(salary) भी शून्य छोड़ता है और गैर-शून्य मानों की गिनती से भाग देता है, अतः वह 250000 / 4 = 62500 है। SUM(salary)/COUNT(*) उसी अंश को पंक्तियों की गिनती से भाग देता है, 250000 / 5 = 50000। अंतर 62500 − 50000 = 12500 है। अतः AVG(x) वह SUM(x)/COUNT(x) है, कभी SUM(x)/COUNT(*) नहीं, और दोनों केवल तब सहमत हैं जब स्तंभ में कोई शून्य न हो। 0 मिलना अर्थात् दोनों को एक ही व्यंजक माना गया, और वही मान्यता तोड़ने हेतु प्रश्न विद्यमान है। उसी स्तंभ पर पूर्णता हेतु: COUNT(*) 5 है, COUNT(salary) 4, और COUNT(DISTINCT salary) 3, क्योंकि 70000 दो बार आता है और दोनों स्तंभ-रूपों में शून्य छूटता है।
  3. सारणी emp(eid, mgr) में eid 1..5 तथा mgr मान NULL, 1, 1, 2, 3 वाली पंक्तियाँ हैं। पृच्छा SELECT eid FROM emp WHERE eid NOT IN (SELECT mgr FROM emp) क्या लौटाती है?

    1. eid 4 व 5
    2. कोई पंक्ति नहीं
    3. eid 4, 5 तथा वह पंक्ति जिसका mgr NULL है
    4. सभी पाँच पंक्तियाँ
    उत्तर देखें

    उत्तर: B — कोई पंक्ति नहीं

    कोई पंक्ति नहीं, और यह खंड का सर्वाधिक मूल्यवान शून्य-तथ्य है क्योंकि अभिप्रेत उत्तर इतना स्पष्टतः 4 व 5 है। विधेय विस्तारित करें: eid NOT IN (NULL, 1, 1, 2, 3) है eid ≠ NULL AND eid ≠ 1 AND eid ≠ 1 AND eid ≠ 2 AND eid ≠ 3। प्रथम संयोजक प्रत्येक पंक्ति हेतु अज्ञात है, क्योंकि शून्य से कोई तुलना कभी सत्य या असत्य नहीं। अज्ञात रखता संयोजन अधिकतम अज्ञात है, WHERE केवल वे पंक्तियाँ रखता है जहाँ शर्त सत्य हो, और अतः प्रत्येक पंक्ति त्यक्त होती है। विकल्प A वही है जो पृच्छा को लौटाना अभिप्रेत था, और वही किसी भी मरम्मत से मिलता है: उप-पृच्छा में WHERE mgr IS NOT NULL जोड़ें, या NOT EXISTS (SELECT 1 FROM emp m WHERE m.mgr = e.eid) के रूप में पुनर्लिखें, जो निरापद है क्योंकि वह मानों की तुलना के बजाय पूछता है कि कोई पंक्ति मिली क्या। असममिति ध्यान दें: सादा IN शून्य मानों सहित सुरक्षित है — 1 IN (1, NULL) सत्य है, क्योंकि एक वियोजक सत्य है — अतः केवल निषेधित रूप संकटपूर्ण है।
  4. संबंध R व S में क्रमशः n व m टपल हैं और वे ठीक एक गुण साझा करते हैं। उनके प्राकृतिक संयोजन में टपलों की संख्या है:

    1. ठीक n × m
    2. 0 व n × m के बीच
    3. min(n, m) व n × m के बीच
    4. ठीक min(n, m)
    उत्तर देखें

    उत्तर: B — 0 व n × m के बीच

    0 व n × m के बीच, और दोनों सिरे प्राप्य हैं। निचला सिरा: यदि साझा गुण का कोई मान दोनों संबंधों में न आए, तो कुछ मेल नहीं खाता और परिणाम रिक्त है — संयोजन कुछ लौटाने को बाध्य नहीं। ऊपरी सिरा: यदि R का प्रत्येक टपल व S का प्रत्येक टपल साझा गुण का वही मान रखे, तो प्रत्येक युग्म मेल खाता है और परिणाम पूर्ण n × m है, ठीक जैसे वह कार्तीय गुणन होता। विकल्प C प्रति टपल कम से कम एक मेल मानता है, जिसके लिए ऐसा विदेशी-कुंजी प्रतिबंध चाहिए जो प्रश्न नहीं बताता — वही मान्यता संयोजन-कोटिकता प्रश्नों को लोगों को पकड़ने योग्य बनाती है। विकल्प A कार्तीय गुणन है, जिसमें प्राकृतिक संयोजन केवल ऊपर की अपभ्रष्ट स्थिति में सिमटता है। एक उपयोगी सहचर परिबंध: वाम बाह्य संयोजन कम से कम n टपल लौटाता है, क्योंकि प्रत्येक R टपल बचता है, मेल खाया हो या नहीं।
  5. संबंधात्मक बीजगणित व संबंधात्मक कैलकुलस के विषय में निम्नलिखित में से कौन-से सत्य हैं?

    1. संबंधात्मक बीजगणित व सुरक्षित टपल संबंधात्मक कैलकुलस की अभिव्यक्ति-शक्ति समान है
    2. किसी संबंध का संक्रमणीय संवर्त संबंधात्मक बीजगणित में अभिव्यक्त नहीं किया जा सकता
    3. संबंधात्मक बीजगणित घोषणात्मक है जबकि टपल कैलकुलस प्रक्रियात्मक
    4. विभाजन केवल पाँच मूल संकारकों से अभिव्यक्त किया जा सकता है
    उत्तर देखें

    उत्तर: A — संबंधात्मक बीजगणित व सुरक्षित टपल संबंधात्मक कैलकुलस की अभिव्यक्ति-शक्ति समान है; B — किसी संबंध का संक्रमणीय संवर्त संबंधात्मक बीजगणित में अभिव्यक्त नहीं किया जा सकता; D — विभाजन केवल पाँच मूल संकारकों से अभिव्यक्त किया जा सकता है

    A, B व D। A वही तुल्यता-प्रमेय है जिसकी ओर पाठ्यक्रम टपल कैलकुलस नामित करते समय संकेत करता है, और सुरक्षित शब्द भार वहन करता है: अप्रतिबंधित कैलकुलस { t | ¬ Emp(t) } लिख सकता है, अनंत उत्तर जो किसी बीजगणित-व्यंजक के पास नहीं। B इससे निकलता है कि A किसी नियत भाषा के विषय में है — बीजगणित-व्यंजक में संयोजनों की संख्या नियत है, जबकि पूर्वजता को असीमित रूप से अनेक चाहिए, और इसीलिए SQL ने WITH RECURSIVE को वास्तविक विस्तार के रूप में जोड़ा। D वह तत्समक है R ÷ S = πX(R) − πX((πX(R) × S) − R), अतः विभाजन मूल के बजाय संक्षेपण है; सर्वनिष्ठ व प्रत्येक संयोजन हेतु भी वही सत्य है। C ठीक उलटा है: बीजगणित प्रक्रियात्मक है — आप उत्तर निकालने वाली संक्रियाओं का क्रम लिखते हैं — और कैलकुलस घोषणात्मक, जो उत्तर को सूत्र से वर्णित करता है और उसे कैसे पाएँ इस विषय में कुछ नहीं कहता। दोनों के बीच स्मरण रखने योग्य वही एक भेद है, और उसे उलट देना यहाँ सर्वाधिक सामान्य त्रुटि है।
  6. संबंध Enrolled(sid, cid) अंकित करता है कौन छात्र कौन-से पाठ्यक्रम लेते हैं, और Required(cid) तीन अनिवार्य पाठ्यक्रम सूचीबद्ध करता है। कौन-सी संबंधात्मक बीजगणित संक्रिया उन छात्रों को खोजती है जो तीनों ले रहे हैं?

    1. प्राकृतिक संयोजन, फिर sid पर प्रक्षेपण
    2. विभाजन: Enrolled ÷ Required
    3. दोनों संबंधों का सर्वनिष्ठ
    4. cid पर वाम बाह्य संयोजन
    उत्तर देखें

    उत्तर: B — विभाजन: Enrolled ÷ Required

    विभाजन, और यह बताने वाला वाक्यांश है “तीनों”। विभाजन Enrolled ÷ Required ठीक वे sid मान लौटाता है जो Required के प्रत्येक cid के साथ युग्मित आते हैं। विकल्प A जाल है और उसकी विफलता का कारण देखने योग्य है: संयोजन के पश्चात् प्रक्षेपण प्रत्येक उस छात्र को लौटाता है जो कम से कम एक अनिवार्य पाठ्यक्रम ले रहा है, क्योंकि प्रक्षेपण यह जाँच नहीं सकता कि तीनों मेल उपस्थित थे — वह पंक्तियाँ पहले ही ढहा चुका है। सामान्य आकार पहचानने योग्य है: “कम से कम एक” संयोजन व प्रक्षेपण है, “सब” विभाजन। विकल्प C तो प्रकार-संगत भी नहीं — सर्वनिष्ठ हेतु दोनों संबंधों की स्कीमा समान चाहिए, और ये भिन्न हैं। विकल्प D बदलता है कि कौन-सी अमेल पंक्तियाँ बचती हैं और पूर्णता के विषय में कुछ उत्तर नहीं देता। यदि उसे मूल संकारकों से निकालना हो, तत्समक है πsid(Enrolled) − πsid((πsid(Enrolled) × Required) − Enrolled): वे छात्र खोजें जिनका कोई अनिवार्य युग्मन अनुपस्थित है, फिर उन्हें घटाएँ।
  7. स्तंभ mgr में मान NULL, 1, 1, 2, 3 हैं। SELECT mgr, COUNT(*) FROM emp GROUP BY mgr कितने समूह उत्पन्न करती है?

    1. 3 — शून्य मान त्यक्त होते हैं
    2. 4 — शून्य मान अपना एक समूह बनाते हैं
    3. 5 — प्रति पंक्ति एक समूह
    4. 3, और शून्य पंक्ति समूह के बिना पृथक् बताई जाती है
    उत्तर देखें

    उत्तर: B — 4 — शून्य मान अपना एक समूह बनाते हैं

    4 — 1, 2, 3 हेतु समूह, तथा एक समूह जो शून्य पंक्ति रखता है। यह SQL में वास्तविक असममिति है और पिछले प्रश्न के साथ रखने योग्य: GROUP BY समूहन के प्रयोजन हेतु शून्य मानों को परस्पर समान मानता है, यद्यपि NULL = NULL अज्ञात का मूल्यांकन करता है और कोई WHERE उपवाक्य उन्हें उस प्रकार कभी मेल नहीं करा सकता। वही परिपाटी DISTINCT पर लागू है, जो अनेक शून्य मानों को एक में ढहाता है, तथा UNION पर, जो द्विरुक्त शून्य हटाता है। विकल्प A समूहन को समुच्चयन से भ्रमित करता है: शून्य छोड़ने वाले समुच्चयन फलन हैं — इस स्तंभ पर COUNT(mgr) 4 है, 5 नहीं — जबकि GROUP BY उन्हें रखता है। विकल्प C हेतु प्रत्येक मान भिन्न चाहिए, पर 1 दो बार आता है। नियम: शून्य मान समुच्चयन फलनों के भीतर अवहेलित हैं और समूहन, DISTINCT व समुच्चय-संक्रियाओं द्वारा एक मान माने जाते हैं।
  8. Parent(child, parent) सारणी में किसी शीर्ष के पूर्वज निकालने हेतु SQL को WITH RECURSIVE क्यों चाहिए?

    1. क्योंकि पुनरावर्ती पृच्छाएँ संयोजनों से तीव्र चलती हैं
    2. क्योंकि संक्रमणीय संवर्त संबंधात्मक बीजगणित में अभिव्यक्तनीय नहीं, अतः कोई नियत पृच्छा उसे नहीं निकाल सकती
    3. क्योंकि सारणी की अपनी ओर विदेशी कुंजी है
    4. क्योंकि parent स्तंभ में शून्य मान साधारण संयोजन तोड़ देते हैं
    उत्तर देखें

    उत्तर: B — क्योंकि संक्रमणीय संवर्त संबंधात्मक बीजगणित में अभिव्यक्तनीय नहीं, अतः कोई नियत पृच्छा उसे नहीं निकाल सकती

    यह भाषा पर सिद्ध सीमा है, निष्पादन या सुविधा का विषय नहीं। संबंधात्मक बीजगणित व्यंजक — और अतः साधारण SQL पृच्छा, जो बहुसमुच्चयों पर वही बीजगणित तथा समुच्चयन है — में संयोजनों की संख्या नियत होती है। Parent को k बार स्व-संयोजित करना ठीक k पीढ़ी ऊपर के पूर्वज खोजता है, अतः कोई नियत पृच्छा प्रश्न का उत्तर केवल परिबद्ध गहराई हेतु देती है, जबकि पूर्वजता अपरिबद्ध है: उत्तर उन आँकड़ों पर निर्भर है जो आपने देखे नहीं। कोई भी चातुर्य वह अंतराल नहीं भरता, और इसीलिए WITH RECURSIVE भाषा का वास्तविक विस्तार है, पहले से लिखने योग्य किसी वस्तु का संक्षेपण नहीं। विकल्प A कारण उलट देता है — पुनरावर्तन अभिव्यक्ति हेतु जोड़ा गया, और वह उसके बिना अभिव्यक्तनीय किसी वस्तु का तीव्रतर मार्ग नहीं। विकल्प C स्कीमा का यथातथ्य वर्णन करता है और कुछ नहीं समझाता; स्व-संदर्भी विदेशी कुंजी साधारण है। विकल्प D अन्यत्र वास्तविक संकट है (शून्य-योग्य स्तंभ पर NOT IN) पर बिना किसी शून्य वाली सारणी का संवर्त भी नियत पृच्छा से नहीं निकाला जा सकता।