MySQL में एकाधिक मानों के लिए कुशल क्वेरी: IN() ऑपरेटर
जब आपको किसी कॉलम के विरुद्ध कई मानों की जांच करने की आवश्यकता होती है, तो IN() ऑपरेटर का उपयोग करना कई OR शर्तों या लूप की तुलना में अधिक कुशल, पठनीय और रखरखाव योग्य होता है।
टेबल बनाना
mysql> CREATE TABLE DemoTable1538 (
-> ClientId INT,
-> ClientName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.59 sec)
डेटा डालना
mysql> INSERT INTO DemoTable1538 VALUES (101,'Chris');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable1538 VALUES (102,'Robert');
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO DemoTable1538 VALUES (103,'Bob');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable1538 VALUES (104,'Adam');
Query OK, 1 row affected (0.16 sec)
सभी रिकॉर्ड्स देखना
mysql> SELECT * FROM DemoTable1538;
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 101 | Chris |
| 102 | Robert |
| 103 | Bob |
| 104 | Adam |
+----------+------------+
4 rows in set (0.00 sec)
IN() का उपयोग करके कुशल क्वेरी
mysql> SELECT * FROM DemoTable1538 WHERE ClientId IN (101,103,104);
परिणाम
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 101 | Chris |
| 103 | Bob |
| 104 | Adam |
+----------+------------+
3 rows in set (0.00 sec)
क्यों IN() बेहतर है
| पहलू | IN() | एकाधिक OR | लूप (एप्लिकेशन में) |
|---|---|---|---|
| पठनीयता | उत्कृष्ट | खराब (लंबा) | N/A |
| प्रदर्शन | अनुकूलित | धीमा (पार्सिंग ओवरहेड) | बहुत धीमा (नेटवर्क राउंड-ट्रिप्स) |
| रखरखाव | आसान | कठिन | जटिल |
| SQL इंजेक्शन जोखिम | कम (पैरामीटराइज़्ड) | उच्च | उच्च |
IN() के साथ पैरामीटराइज़्ड क्वेरी (सर्वोत्तम अभ्यास)
-- प्रोग्रामिंग भाषा में (उदाहरण: Python)
ids = [101, 103, 104]
placeholders = ','.join(['%s'] * len(ids))
query = f"SELECT * FROM DemoTable1538 WHERE ClientId IN ({placeholders})"
cursor.execute(query, ids)
बड़े IN() सूचियों के लिए विचार
- MySQL में
max_allowed_packetऔरrange_optimizer_max_mem_sizeसीमाएँ होती हैं - बहुत बड़ी सूचियों (1000+ मान) के लिए, एक अस्थायी टेबल या JOIN का उपयोग करने पर विचार करें
- IN() सूची में स्थिरांक होने पर MySQL बाइनरी खोज का उपयोग करता है (O(log n))
संबंधित ऑपरेटर: NOT IN
SELECT * FROM DemoTable1538 WHERE ClientId NOT IN (101,103,104);
यह 101, 103, 104 नहीं होने वाली सभी पंक्तियाँ लौटाता है।
चेतावनी: NULL मान
-- यदि सूची में NULL है, तो NOT IN अप्रत्याशित व्यवहार करता है
WHERE col NOT IN (1, 2, NULL) -- कभी कोई पंक्ति नहीं लौटाता!
NOT IN के साथ NULL मानों से बचें या NOT EXISTS का उपयोग करें।