MySQL में NOT IN उपक्वेरी का उपयोग करके विशिष्ट शर्त न पूरी करने वाली पंक्तियाँ चुनना
एक शर्त को पूरा न करने वाली पंक्तियों को चुनने के लिए NOT IN के साथ उपक्वेरी (सबक्वेरी) का उपयोग करें।
उदाहरण के साथ पूर्ण कार्यान्वयन
टेबल बनाना
mysql> CREATE TABLE DemoTable625 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName VARCHAR(100),
StudentScore INT
);
रिकॉर्ड डालना
mysql> INSERT INTO DemoTable625(StudentFirstName, StudentScore) VALUES
('John', 98), ('Chris', 39), ('Bob', 41), ('David', 40), ('Robert', 52);
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable625;
आउटपुट:
+-----------+------------------+--------------+
| StudentId | StudentFirstName | StudentScore |
+-----------+------------------+--------------+
| 1 | John | 98 |
| 2 | Chris | 39 |
| 3 | Bob | 41 |
| 4 | David | 40 |
| 5 | Robert | 52 |
+-----------+------------------+--------------+
5 rows in set (0.00 sec)
स्कोर 50 से कम वाले छात्रों को छोड़कर बाकी चुनना
mysql> SELECT * FROM DemoTable625
WHERE StudentFirstName NOT IN (
SELECT StudentFirstName FROM DemoTable625
WHERE StudentScore < 50
);
आउटपुट:
+-----------+------------------+--------------+
| StudentId | StudentFirstName | StudentScore |
+-----------+------------------+--------------+
| 1 | John | 98 |
| 5 | Robert | 52 |
+-----------+------------------+--------------+
2 rows in set (0.00 sec)
कैसे काम करता है:
- उपक्वेरी:
StudentScore < 50वाले नाम लौटाती है → {'Chris', 'Bob', 'David'} - मुख्य क्वेरी: उन नामों को नहीं रखने वाली पंक्तियाँ चुनती है → John (98), Robert (52)
समान परिणाम के लिए सरल विकल्प
-- सीधी शर्त (अधिक कुशल)
SELECT * FROM DemoTable625 WHERE StudentScore >= 50;
-- NOT EXISTS (NULL-सुरक्षित)
SELECT * FROM DemoTable625 d1
WHERE NOT EXISTS (
SELECT 1 FROM DemoTable625 d2
WHERE d2.StudentFirstName = d1.StudentFirstName
AND d2.StudentScore < 50
);
NOT IN के साथ NULL समस्या
-- यदि उपक्वेरी NULL लौटाती है, तो NOT IN कुछ नहीं लौटाता!
SELECT * FROM DemoTable625
WHERE StudentFirstName NOT IN (SELECT NULL); -- खाली परिणाम
समाधान: NOT EXISTS उपयोग करें या उपक्वेरी में WHERE column IS NOT NULL जोड़ें।
अन्य "कुछ पंक्तियाँ" पैटर्न
टॉप N प्रति ग्रुप
-- प्रत्येक विभाग के शीर्ष 2 वेतन
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn
FROM employees
) t WHERE rn <= 2;
यादृच्छिक नमूना
SELECT * FROM DemoTable625 ORDER BY RAND() LIMIT 3;
पहली/अंतिम N पंक्तियाँ
SELECT * FROM DemoTable625 ORDER BY StudentId LIMIT 2; -- पहली 2
SELECT * FROM DemoTable625 ORDER BY StudentId DESC LIMIT 2; -- अंतिम 2
पेजिनेशन
SELECT * FROM DemoTable625 ORDER BY StudentId LIMIT 2 OFFSET 2; -- पृष्ठ 2 (आकार 2)