सबक्वेरी के साथ NOT IN का उपयोग करें
एक SELECT के परिणाम से दूसरी SELECT के परिणाम को बाहर करने के लिए NOT IN के साथ सबक्वेरी का उपयोग करें।
सिंटैक्स
SELECT * FROM yourTableName
WHERE yourColumnName NOT IN (
SELECT yourColumnName FROM yourTableName WHERE yourCondition
);
व्यावहारिक उदाहरण
टेबल बनाना
mysql> CREATE TABLE DifferenceSelectDemo (
Id INT NOT NULL AUTO_INCREMENT,
UserId INT,
UserValue INT,
PRIMARY KEY(Id)
);
डेटा डालना
mysql> INSERT INTO DifferenceSelectDemo(UserId, UserValue) VALUES(10, 10); mysql> INSERT INTO DifferenceSelectDemo(UserId, UserValue) VALUES(10, 20); mysql> INSERT INTO DifferenceSelectDemo(UserId, UserValue) VALUES(20, 30); mysql> INSERT INTO DifferenceSelectDemo(UserId, UserValue) VALUES(20, 20); mysql> INSERT INTO DifferenceSelectDemo(UserId, UserValue) VALUES(30, 40); mysql> INSERT INTO DifferenceSelectDemo(UserId, UserValue) VALUES(30, 20);
सभी रिकॉर्ड
+----+--------+-----------+ | Id | UserId | UserValue | +----+--------+-----------+ | 1 | 10 | 10 | | 2 | 10 | 20 | | 3 | 20 | 30 | | 4 | 20 | 20 | | 5 | 30 | 40 | | 6 | 30 | 20 | +----+--------+-----------+
क्वेरी: Id=1 वाले UserValue (10) को छोड़कर सभी पंक्तियाँ
mysql> SELECT * FROM DifferenceSelectDemo
WHERE UserValue NOT IN (
SELECT UserValue FROM DifferenceSelectDemo WHERE Id = 1
);
आउटपुट
+----+--------+-----------+ | Id | UserId | UserValue | +----+--------+-----------+ | 2 | 10 | 20 | | 3 | 20 | 30 | | 4 | 20 | 20 | | 5 | 30 | 40 | | 6 | 30 | 20 | +----+--------+-----------+
व्याख्या
- सबक्वेरी
SELECT UserValue ... WHERE Id = 1मान10लौटाती है। - बाहरी क्वेरी उन पंक्तियों को बाहर करती है जहां
UserValue = 10है। - पंक्ति 1 (UserValue=10) परिणाम में नहीं है।
विकल्प: LEFT JOIN / NOT EXISTS
बड़े डेटासेट या NULL मानों को संभालने के लिए NOT EXISTS या LEFT JOIN ... WHERE IS NULL अक्सर बेहतर प्रदर्शन देते हैं:
-- NOT EXISTS (NULL-सुरक्षित)
SELECT * FROM DifferenceSelectDemo d1
WHERE NOT EXISTS (
SELECT 1 FROM DifferenceSelectDemo d2
WHERE d2.Id = 1 AND d2.UserValue = d1.UserValue
);
-- LEFT JOIN
SELECT d1.* FROM DifferenceSelectDemo d1
LEFT JOIN (
SELECT UserValue FROM DifferenceSelectDemo WHERE Id = 1
) d2 ON d1.UserValue = d2.UserValue
WHERE d2.UserValue IS NULL;
मुख्य बिंदु
NOT INसरल है लेकिन NULL मान होने पर अप्रत्याशित परिणाम दे सकता है।NOT EXISTSआमतौर पर सुरक्षित और तेज़ है।- सबक्वेरी केवल एक कॉलम लौटाना चाहिए।