Theory
आप एक अज्ञात रहस्य के आधार पर एक record कैसे खोजते हैं?
कल्पना कीजिए एक manager आपसे हमारे TicketDesk system में सारे helpdesk tickets खोजने को कहता है जो 'Server Crash' नामक ticket के बाद उठाए गए। आप बिल्कुल date नहीं जानते जब 'Server Crash' हुआ। एक standard database query में, आपको उस crash की date खोजने के लिए एक query चलानी होगी, इसे नीचे copy करना होगा, और उस date इस्तेमाल करके एक दूसरी query लिखनी होगी। यह हाथ का तरीक़ा automated production systems और university exams में पूरी तरह विफल होता है। आप एक query से date खोजकर तुरंत इसे एक दूसरी query में कैसे feed करें?
Theory
Box के अंदर Box Lookup
एक nested query को एक puzzle box की तरह सोचिए जहाँ बाहरी संदूक़ खोलने की चाबी एक छोटे भीतरी box के अंदर छिपी है। आप बाहरी संदूक़ तब तक नहीं खोल सकते जब तक आप पहले भीतरी box को तोड़कर चाबी न निकालें। SQL में, database engine पहले inner query हल करता है, अकेला value या values की सूची निकालता है, और फिर उस ताज़ा जानकारी को एक constant value के रूप में इस्तेमाल करके outer query को filter करता और अपने-आप चलाता है।
Theory
Nested Queries को औपचारिक रूप से परिभाषित करना
Oracle dialect में, एक nested query एक SELECT statement है जो एक outer query के WHERE या HAVING clause के अंदर लिखा जाता है। inner query पहले execute होती है और अपने results outer query को पास करती है। Nested queries को single-row subqueries में वर्गीकृत किया जाता है, जो बिल्कुल एक value return करती हैं और =, >, या < जैसे operators इस्तेमाल करती हैं, और multi-row subqueries में, जो values का एक column return करती हैं और structural mismatches रोकने के लिए IN, ANY, या ALL जैसे operators माँगती हैं।
At a glance
inner query outputs और matching operators के आधार पर Oracle nested queries का वर्गीकरण
| Query Type | Returned Rows | Allowed Operators | TicketDesk Instance |
|---|---|---|---|
| Single-Row | बिल्कुल 1 row और 1 column | =, >, <, != | एक अकेले ज्ञात ticket की date के बाद उठाए tickets खोजना |
| Multi-Row | कई rows और 1 column | IN, ANY, ALL | active agents की एक ख़ास सूची को assigned tickets खोजना |
| Correlated | outer loop rows पर निर्भर | EXISTS, NOT EXISTS | उन agents को खोजना जो Critical status वाला कम से कम एक ticket सँभालते हैं |
Practical
Single-Row और Multi-Row Nested Queries लिखना
-- Step 1: Single-row nested query to find tickets raised after 'Server Crash'
SELECT id, title, raised_on
FROM tickets
WHERE raised_on > (SELECT raised_on FROM tickets WHERE title = 'Server Crash');
-- Step 2: Multi-row nested query to find tickets assigned to specific agents
SELECT title, priority
FROM tickets
WHERE agent_id IN (SELECT id FROM agents WHERE name LIKE 'Amit%');This example runs in Gri-Learn on the web, where you can edit it and see the output.
Quiz
क्या होगा अगर एक outer query '=' operator इस्तेमाल करती है, पर inner nested query एक से ज़्यादा row return करती है?
- Oracle अपने-आप पहली row चुनेगा और बाक़ी को नज़रअंदाज़ करेगा
- Oracle एक runtime error फेंकेगा क्योंकि एक single-row operator कई values की तुलना नहीं कर सकता
- outer query execute होगी पर एक सुरक्षा उपाय के रूप में शून्य rows return करेगी
- Oracle पर्दे के पीछे '=' operator को dynamically 'IN' में बदल देगा
Show the answer
Oracle एक runtime error फेंकेगा क्योंकि एक single-row operator कई values की तुलना नहीं कर सकता
जब आप = जैसा एक single-row comparison operator इस्तेमाल करते हैं, Oracle बिल्कुल एक value की उम्मीद करता है। अगर inner nested query कई rows return करती है, Oracle एक mismatch से टकराता है और प्रसिद्ध ORA-01427 error फेंकता है: single-row subquery returns more than one row। कई rows सँभालने के लिए, आपको IN जैसा एक multi-row operator इस्तेमाल करना होगा।
Think first
Mental Challenge: औसत से ऊपर Tickets खोजना
tickets table से उन सारे tickets की id और title खोजने के लिए एक nested query मन में लिखिए जिनका priority level या numerical rating सारे tickets की औसत rating से ज़्यादा है। reveal करने को tap करने से पहले उस aggregate function के बारे में सोचिए जो आपको चाहिए।
Show the answer
query है: SELECT id, title FROM tickets WHERE priority_level > (SELECT AVG(priority_level) FROM tickets); inner query पहले अकेला औसत value calculate करती है, और फिर outer query हर individual row की उस औसत परिणाम से तुलना करती है।
Watch out
Column Count Mismatch जाल
university exams में marks गँवाने वाली एक आम ग़लती inner query में कई columns चुनना है जब outer query केवल एक की उम्मीद करती है। उदाहरण के लिए, WHERE agent_id IN (SELECT id, name FROM agents) लिखना। Oracle इसे एक syntax error के साथ अस्वीकार करेगा क्योंकि यह एक अकेले ID column की एक dual-column परिणाम से तुलना नहीं कर सकता। पक्का कीजिए कि आपकी inner query बिल्कुल एक column चुनती है जो outer column के datatype से मेल खाता है।
Theory
असली दुनिया का इस्तेमाल और भविष्य के Semesters
Nested queries जटिल reports बनाते समय या AI dashboards के लिए backend logic सँभालते समय अहम हैं। अपने frontend code में data लाने और धीमे loops चलाने के बजाय, एक nested query अधिकतम कुशलता के लिए पूरी तरह database server पर चलती है। अपने Sem 3 SQLite curriculum में, आप इन समान nested query structures का इस्तेमाल mobile applications के अंदर local data filter करने के लिए भारी boilerplate code लिखे बिना करेंगे।
Summary
Key takeaways
- एक nested query एक SELECT statement है जो एक दूसरी query के WHERE या HAVING clause के अंदर रखा जाता है।
- inner query पहले execute होती है, और इसका output outer query द्वारा एक filtering constraint के रूप में इस्तेमाल होता है।
- Single-row nested queries एक value return करती हैं और = या > जैसे single-value operators माँगती हैं।
- Multi-row nested queries कई records return करती हैं और IN, ANY, या ALL जैसे list operators माँगती हैं।
- Inner queries को structural column mismatch errors से बचने के लिए बिल्कुल एक column return करना होगा।
- Memory hook: Inner query रहस्य उजागर करती है, outer query अंतिम परिणाम देती है!