MySQL में @ चिह्न **उपयोगकर्ता-परिभाषित चर (user-defined variables)** को दर्शाता है। ये चर सत्र-विशिष्ट (session-specific) होते हैं और एक कनेक्शन के भीतर मानों को अस्थायी रूप से संग्रहीत करके क्वेरी के बीच साझा करने की अनुमति देते हैं।
सिंटैक्स
SET @variable_name := value;
या SELECT में असाइनमेंट:
SELECT @variable_name := value;
व्यावहारिक उदाहरण
टेबल बनाएं:
mysql> CREATE TABLE DemoTable1331 (
Id INT,
Name VARCHAR(20)
);
डेटा डालें:
mysql> INSERT INTO DemoTable1331 VALUES(10, 'Chris'); mysql> INSERT INTO DemoTable1331 VALUES(101, 'David'); mysql> INSERT INTO DemoTable1331 VALUES(40, 'Bob'); mysql> INSERT INTO DemoTable1331 VALUES(30, 'Mike'); mysql> INSERT INTO DemoTable1331 VALUES(60, 'John');
डेटा देखें:
mysql> SELECT * FROM DemoTable1331;
+------+-------+ | Id | Name | +------+-------+ | 10 | Chris | | 101 | David | | 40 | Bob | | 30 | Mike | | 60 | John | +------+-------+
उपयोगकर्ता-परिभाषित चर सेट करें और उपयोग करें
mysql> SET @Value := 40; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM DemoTable1331 WHERE Id > @Value;
परिणाम
+------+-------+ | Id | Name | +------+-------+ | 101 | David | | 60 | John | +------+-------+
मुख्य विशेषताएं
- सत्र-स्कोप: चर केवल वर्तमान कनेक्शन में मान्य
- कमजोर टाइपिंग: मान का प्रकार डायनामिक रूप से निर्धारित होता है
- केस-इनसेंसिटिव:
@Value,@value,@VALUEसमान हैं - डिफ़ॉल्ट NULL: असाइन न किए गए चर
NULLहोते हैं
उन्नत उपयोग
क्वेरी में गणना और पुनर्उपयोग
SELECT @row_num := @row_num + 1 AS RowNum, Name FROM DemoTable1331, (SELECT @row_num := 0) AS r ORDER BY Name;
एक क्वेरी से मान लेकर दूसरी में उपयोग
SELECT @max_id := MAX(Id) FROM DemoTable1331; SELECT * FROM DemoTable1331 WHERE Id = @max_id;
प्रक्रियात्मक लूप में (स्टोर्ड प्रोसीजर नहीं)
SET @i := 0; SELECT @i := @i + 1 AS Counter FROM DemoTable1331 LIMIT 5;
सावधानियां
- समानांतर क्वेरी में क्रम अनिश्चित:
SELECT @a := 1, @a := 2का क्रम गारंटी नहीं - रीप्लिकेशन असुरक्षित: स्टेटमेंट-आधारित रीप्लिकेशन में समस्या हो सकती है
- ऑप्टिमाइज़र प्रभाव: चर उपयोग करने से क्वेरी ऑप्टिमाइज़ेशन प्रभावित हो सकता है
- MySQL 8.0+: CTE (
WITH) और विंडो फ़ंक्शन कई उपयोग केस बदल देते हैं
आधुनिक विकल्प (MySQL 8.0+)
-- रो नंबर के लिए SELECT ROW_NUMBER() OVER (ORDER BY Name) AS RowNum, Name FROM DemoTable1331; -- पिछली पंक्ति का मान SELECT Name, LAG(Name) OVER (ORDER BY Id) AS PrevName FROM DemoTable1331;
सारांश
@ चिह्न MySQL में सत्र-स्तरीय चर घोषित करता है। ये तदर्थ गणना, क्वेरी के बीच मान पारित करने, और सरल प्रक्रियात्मक तर्क के लिए उपयोगी हैं, लेकिन आधुनिक MySQL में CTE/विंडो फ़ंक्शन पसंद किए जाते हैं।