Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 73

MySQL में Correlated Subquery

Correlation समझें

Correlated subquery अपने query block से बाहर current outer row की value use करती है। Outer alias उस reference का scope precise बनाता है।

SELECT o.student_name
FROM sq_students AS o
WHERE o.marks > (
  SELECT AVG(i.marks)
  FROM sq_students AS i
  WHERE i.class_name = o.class_name
);
Inside-out पढ़ें: current outer student o के लिए same class के inner students i का average निकालें, फिर o.marks compare करें।

Shared Verified Dataset

StudentClassMarks
AaravX-A86.50
MeeraX-A91.00
KabirX-B74.00
SanaX-B88.50
VihaanX-BNULL

X-A average 88.75 और X-B average 81.25 है क्योंकि AVG NULL ignore करता है। Next outputs verify करते समय ये checkpoints सामने रखें।

अपनी Class Average से ऊपर Students

SELECT o.student_name, o.class_name, o.marks
FROM sq_students AS o
WHERE o.marks > (
  SELECT AVG(i.marks)
  FROM sq_students AS i
  WHERE i.class_name = o.class_name
)
ORDER BY o.class_name, o.student_id;
Meera | X-A | 91.00 Sana | X-B | 88.50

यह overall 85.00 average से अलग है। Aarav overall average से ऊपर लेकिन X-A के stronger average से नीचे है, इसलिए correlated result सही रूप से Aarav को exclude करता है।

हर Class का Top Known Mark

SELECT o.student_name, o.class_name, o.marks
FROM sq_students AS o
WHERE o.marks = (
  SELECT MAX(i.marks)
  FROM sq_students AS i
  WHERE i.class_name = o.class_name
)
ORDER BY o.class_name;
Meera | X-A | 91.00 Sana | X-B | 88.50

Maximum पर two students tie करें तो दोनों return होंगे। “All top scorers” के लिए यही सही है। Exactly one row चाहिए तभी window-function tie-break rule लें।

Correlated Scalar Count

SELECT o.student_name, o.class_name,
       (
         SELECT COUNT(*)
         FROM sq_students AS i
         WHERE i.class_name = o.class_name
       ) AS class_strength
FROM sq_students AS o
ORDER BY o.student_id;
Aarav | X-A | 2 Meera | X-A | 2 Kabir | X-B | 3 Sana | X-B | 3 Vihaan | X-B | 3

COUNT(*) rows count करता है, known marks नहीं। Assessed students count करने के लिए COUNT(i.marks) लें; X-B के लिए 2 मिलेगा।

Aggregated Derived Table से Rewrite

SELECT s.student_name, s.class_name, s.marks
FROM sq_students AS s
JOIN (
  SELECT class_name, AVG(marks) AS class_average
  FROM sq_students
  GROUP BY class_name
) AS a
  ON a.class_name = s.class_name
WHERE s.marks > a.class_average
ORDER BY s.class_name, s.student_id;

Result Meera और Sana ही है। यह form one aggregate row per class बनाता और relationship visible रखता है। Report में average column भी चाहिए तो इसे extend करना आसान है। इसे always faster न मानें; actual plans compare करें।

Alias Scope, NULL और Performance

  • Same table की outer/inner instances के लिए अलग aliases लें।
  • Inner name resolution nearest query block पहले देखता है; repeated columns qualify करें।
  • NULL outer marks ordinary comparison fail करते हैं; aggregates अपने rules से NULL inputs ignore करते हैं।
  • Useful हो तो correlation key index करें; small tables efficiently scan भी हो सकती हैं।
  • EXPLAIN और representative timings देखें; optimizer eligible query decorrelate कर सकता है।
Missing correlation condition per-class calculation को same global calculation बना देती है। Intended group key explicitly compare करें।

अभ्यास

  1. अपनी class average से नीचे students लौटाएँ।
  2. हर row के साथ class का known-marks count दिखाएँ।
  3. Sana के equal another student जोड़कर top-per-class query में दोनों verify करें।
  4. Top query को grouped derived table से rewrite करें।

हर answer से पहले X-A और X-B checkpoints लिखें। Per-group expected result पहले known हो तो correlated logic reliable बनती है।

Official संदर्भ

Syntax और behavior official MySQL 8.4 manual से जाँचे गए हैं। Production से पहले हर query disposable copy पर test करें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

Subquery correlated कब होती है?
जब वह outer query block की column reference करती है। Outer reference inner calculation को current outer row या group से जोड़ता है।
क्या correlated subquery हर row पर execute होती है?
यह useful logical model है, लेकिन MySQL work transform या cache कर सकता है। Physical execution assume करने के बजाय EXPLAIN और measurement लें।
Group average से ऊपर rows कैसे खोजें?
Inner AVG को outer row की group key से correlate करें, जैसे inner.class_name = outer.class_name, फिर outer value compare करें।
क्या correlated query JOIN में rewrite हो सकती है?
अक्सर। Correlation key पर derived table/CTE में aggregate करें, detail table से join करें और values compare करें।
कौन-सी columns index करें?
Correlation, filtering और joining columns candidates हैं। इस lesson में class_name से शुरू index मदद कर सकता है, पर plan verify करें।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.