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;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
);यह 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;इसे पढ़ें: ऐसा कोई 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
| Need | Natural form |
|---|---|
| केवल related-row presence | EXISTS |
| Inner columns return | JOIN |
| Clean one-column set membership | IN |
| Possible NULLs के साथ absence | NOT EXISTS |
Students से results JOIN Aarav को twice देता है क्योंकि उसके two result rows हैं। EXISTS हर qualifying student once रखता है, DISTINCT से cardinality छिपाए बिना।
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 करें।