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

EXISTS और NOT EXISTS

EXISTS Rows Test करता है, Values नहीं

Subquery कम-से-कम one qualifying row दे तो EXISTS TRUE है। कोई qualifying row न हो तो NOT EXISTS TRUE है। “At least one” और “none” questions के लिए ये ideal हैं।

WHERE EXISTS (
  SELECT 1
  FROM sq_results AS r
  WHERE r.student_id = s.student_id
)

Correlation inner r को current outer s से जोड़ती है। SELECT 1 convention है; projected value use नहीं होती।

Verified Results Lab

CREATE TABLE sq_subjects (
  subject_code VARCHAR(10) PRIMARY KEY,
  subject_name VARCHAR(60) NOT NULL
);

CREATE TABLE sq_results (
  student_id INT NOT NULL,
  subject_code VARCHAR(10) NOT NULL,
  marks DECIMAL(5,2) NOT NULL,
  PRIMARY KEY (student_id, subject_code),
  FOREIGN KEY (student_id)
    REFERENCES sq_students(student_id),
  FOREIGN KEY (subject_code)
    REFERENCES sq_subjects(subject_code)
);

INSERT INTO sq_subjects VALUES
('CSC', 'Computer Science'),
('MAT', 'Mathematics');

INSERT INTO sq_results VALUES
(1, 'MAT', 86), (1, 'CSC', 91),
(2, 'MAT', 92), (3, 'CSC', 74),
(4, 'MAT', 89);

Aarav के two results; Meera, Kabir और Sana का one each; Vihaan का none है।

कम-से-कम One Result वाले Students

SELECT s.student_id, s.student_name
FROM sq_students AS s
WHERE EXISTS (
  SELECT 1
  FROM sq_results AS r
  WHERE r.student_id = s.student_id
)
ORDER BY s.student_id;
1 | Aarav 2 | Meera 3 | Kabir 4 | Sana

Aarav के two inner matches होने पर भी वह once आता है। EXISTS हर outer row का Boolean question है; existence पता चलते ही additional match की आवश्यकता नहीं रहती।

बिना Result वाले Students

SELECT s.student_id, s.student_name
FROM sq_students AS s
WHERE NOT EXISTS (
  SELECT 1
  FROM sq_results AS r
  WHERE r.student_id = s.student_id
);
5 | Vihaan

यह anti-match key पर correlated होने से robust है। Equivalent LEFT JOIN pattern WHERE r.student_id IS NULL test करता है, लेकिन NOT EXISTS “no related row” अधिक directly बताता है।

Relational Division: हर Subject लिया

SELECT s.student_id, s.student_name
FROM sq_students AS s
WHERE NOT EXISTS (
  SELECT 1
  FROM sq_subjects AS sub
  WHERE NOT EXISTS (
    SELECT 1
    FROM sq_results AS r
    WHERE r.student_id = s.student_id
      AND r.subject_code = sub.subject_code
  )
)
ORDER BY s.student_id;
1 | Aarav

इसे पढ़ें: ऐसा कोई required subject नहीं जिसके लिए Aarav का result missing हो। केवल Aarav के पास CSC और MAT दोनों हैं। Empty requirements table पर mathematically every student “all zero subjects” satisfy करता है; business rule अलग हो सकता है।

EXISTS बनाम JOIN, IN और NOT IN

NeedNatural form
केवल related-row presenceEXISTS
Inner columns returnJOIN
Clean one-column set membershipIN
Possible NULLs के साथ absenceNOT EXISTS

Students से results JOIN Aarav को twice देता है क्योंकि उसके two result rows हैं। EXISTS हर qualifying student once रखता है, DISTINCT से cardinality छिपाए बिना।

Subquery में NULL हो तो NOT IN कोई TRUE row न दे सकता है। NULL explicitly exclude करें या correctly correlated NOT EXISTS लें।

Indexes, EXPLAIN और अभ्यास

  • Inner correlation columns index करें। Primary key (student_id, subject_code) lesson lookups support करती है।
  • Subject-code driven queries के लिए subject_code से शुरू additional index मदद कर सकता है।
  • EXPLAIN देखें; MySQL eligible EXISTS/IN forms को semijoin strategies से implement कर सकता है।
  • Subquery predicate selective रखें और keys/data types verify करें।

अभ्यास: Mathematics वाले students; Computer Science के बिना students; no-student subjects खोजें; फिर third required subject जोड़कर double-NOT-EXISTS result पहले predict करें।

Official संदर्भ

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

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

EXISTS क्या लौटाता है?
Subquery कम-से-कम one row दे तो TRUE होता है। Subquery द्वारा projected values truth test में irrelevant हैं।
EXISTS में SELECT 1 क्यों लिखते हैं?
यह बताता है कि केवल row existence मायने रखती है। SELECT * logically valid है, पर SELECT 1 intent स्पष्ट करता है।
क्या NOT EXISTS, NULL वाले NOT IN से safer है?
Anti-matching में सामान्यतः हाँ, क्योंकि यह correlated row की absence test करता है और unrelated set के NULL से UNKNOWN नहीं बनता।
क्या EXISTS duplicate outer rows बनाता है?
EXISTS हर outer row के लिए Boolean test है, इसलिए many inner matches outer row multiply नहीं करते। JOIN कर सकता है।
हर subject complete करने वाले students कैसे खोजें?
Double NOT EXISTS लें—ऐसा कोई required subject न हो जिसके लिए उस student का matching result missing हो।
🔗

Share this topic with a friend

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

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

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

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

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