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

Nested Queries और Subqueries

Subquery क्या है?

Subquery दूसरे SQL statement के अंदर nested SELECT है। Containing statement outer query कहलाता है। Parentheses inner query को mark करते हैं और उसका result outer query का operand या table source बनता है।

FormShapeTypical use
Scalarअधिकतम one row × one columnMarks को average से compare करना
ColumnMany rows × one columnIN, ANY या ALL
RowOne row × several columnsTuple comparison
TableRows × columnsFROM में derived table
Faculty method: Inner query को अकेले चलाकर shape verify करें, फिर outer context में रखें।

Verified Marks Lab

CREATE TABLE sq_students (
  student_id INT PRIMARY KEY,
  student_name VARCHAR(60) NOT NULL,
  class_name VARCHAR(20) NOT NULL,
  marks DECIMAL(5,2) NULL
);

INSERT INTO sq_students VALUES
(1, 'Aarav', 'X-A', 86.50),
(2, 'Meera', 'X-A', 91.00),
(3, 'Kabir', 'X-B', 74.00),
(4, 'Sana', 'X-B', 88.50),
(5, 'Vihaan', 'X-B', NULL);

चार known marks का total 340.00 है। AVG Vihaan का NULL ignore करके 85.00 देता है। यही controlled edge case पूरे Day 7 में use होगी।

Scalar Subquery: Overall Average से ऊपर

SELECT student_name, marks
FROM sq_students
WHERE marks > (
  SELECT AVG(marks)
  FROM sq_students
)
ORDER BY marks DESC;
Meera | 91.00 Sana | 88.50 Aarav | 86.50

Inner query one value 85.00 देती है। Outer query हर known mark compare करती है। Kabir below average है; Vihaan का NULL comparison UNKNOWN है, इसलिए WHERE उसे नहीं रखता।

SELECT में Scalar Value

SELECT student_name, marks,
       (SELECT ROUND(AVG(marks), 2)
        FROM sq_students) AS overall_average
FROM sq_students
ORDER BY student_id;

Uncorrelated average logically हर output row के लिए same है। MySQL उसकी evaluation optimize कर सकता है; literal procedural loop assume न करें।

IN के साथ Column Subquery

उन classes के students खोजें जहाँ कम-से-कम one score 90 या अधिक है:

SELECT student_name, class_name
FROM sq_students
WHERE class_name IN (
  SELECT DISTINCT class_name
  FROM sq_students
  WHERE marks >= 90
)
ORDER BY student_id;
Aarav | X-A Meera | X-A

Inner query one-column set X-A देती है। Column subquery many rows दे सकती है; IN membership test करता है, scalar demand नहीं।

FROM में Table Subquery

SELECT class_name, class_average
FROM (
  SELECT class_name,
         ROUND(AVG(marks), 2) AS class_average
  FROM sq_students
  GROUP BY class_name
) AS class_summary
WHERE class_average > 82
ORDER BY class_name;
X-A | 88.75

FROM subquery derived table है और alias माँगती है। X-B average 81.25 है क्योंकि AVG Vihaan का NULL ignore करता है। Same intermediate result CTE से भी लिखा जा सकता है, जिसे next advanced cluster में पढ़ेंगे।

Cardinality Errors और NULL Rules

  • Scalar subquery two या अधिक rows दे तो error आता है।
  • Empty scalar subquery NULL देती है।
  • Subquery में NULL हो तो NOT IN UNKNOWN बन सकता है; absence के लिए NOT EXISTS बेहतर है, जब तक NULL explicitly remove न हो।
  • Comparison types compatible रखें; implicit conversions meaning और indexes obscure कर सकते हैं।
  • Aliases अपने query block में scoped हैं; repeated names qualify करें।
-- class_name subquery में NULL हो तो unsafe:
WHERE class_name NOT IN (SELECT class_name FROM some_table)

-- Rule के अनुसार NULL explicitly हटाएँ:
WHERE class_name NOT IN (
  SELECT class_name
  FROM some_table
  WHERE class_name IS NOT NULL
)

Subquery या JOIN?

RequirementClear starting form
One aggregate से compareScalar subquery
Related row existence testEXISTS
दोनों tables की columns returnJOIN
Named intermediate result reuseCTE या derived table

Equivalent दिखने वाले rewrites NULL, duplicates या empty sets पर अलग हो सकते हैं। Performance के लिए syntax बदलने से पहले edge cases से equivalence prove करें।

Optimization और अभ्यास

  1. Inner result और expected cardinality independently verify करें।
  2. Useful selectivity हो तो correlation/filter columns index करें।
  3. EXPLAIN में semijoin या materialization जैसी transformations देखें।
  4. Inner query में केवल required columns select करें।
  5. Representative data से measure करें; readable SQL starting point है।

अभ्यास: 80 से ऊपर students list करें; scalar comparison से highest-average class खोजें; disposable database में multi-row scalar error बनाकर IN से correct करें।

Official संदर्भ

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

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

MySQL में subquery क्या है?
Subquery दूसरे statement के अंदर parentheses में लिखा SELECT है। यह scalar, row, column या table result दे सकता है।
Scalar subquery multiple rows दे तो क्या होगा?
MySQL error देता है क्योंकि scalar context अधिकतम one value माँगता है।
Empty scalar subquery क्या लौटाती है?
यह NULL लौटाती है। Outer expression को three-valued logic के अनुसार उस possibility को handle करना चाहिए।
क्या subquery को JOIN से replace कर सकते हैं?
अक्सर हाँ, खासकर matching या aggregation में; लेकिन clearest और fastest form meaning, cardinality और optimizer plan पर निर्भर है।
क्या हर subquery में ORDER BY लगाना चाहिए?
नहीं। Ordering तभी meaningful है जब LIMIT जैसी operation या final display उसे माँगे। Table result का display order guaranteed नहीं होता।
🔗

Share this topic with a friend

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

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

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

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

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