MySQL में वेरिएबल कैसे घोषित करें?


386

Mysql में वैरिएबल कैसे घोषित करें, ताकि मेरी दूसरी क्वेरी इसका उपयोग कर सके?

मैं कुछ लिखना चाहूंगा जैसे:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

मत भूलो कि आपको "उपयोगकर्ता चर = सत्य की अनुमति दें" की आवश्यकता हो सकती है।
स्टीव स्मिथ

जवाबों:


636

MySQL में मुख्य रूप से तीन प्रकार के चर हैं:

  1. उपयोगकर्ता-परिभाषित चर (साथ उपसर्ग @):

    आप किसी भी उपयोगकर्ता-परिभाषित चर को घोषित किए बिना या इसे आरंभ किए बिना एक्सेस कर सकते हैं। यदि आप एक ऐसे चर का संदर्भ देते हैं, जिसे आरंभिक नहीं किया गया है, तो इसका एक मान NULLऔर एक प्रकार का स्ट्रिंग है।

    SELECT @var_any_var_name

    आप किसी वेरिएबल SETया SELECTस्टेटमेंट का उपयोग करके इनिशियलाइज़ कर सकते हैं

    SET @start = 1, @finish = 10;    

    या

    SELECT @start := 1, @finish := 10;
    
    SELECT * FROM places WHERE place BETWEEN @start AND @finish;

    उपयोगकर्ता चर को डेटा प्रकारों के सीमित सेट से एक मान दिया जा सकता है: पूर्णांक, दशमलव, फ़्लोटिंग-पॉइंट, बाइनरी या नॉनबिनरी स्ट्रिंग, या NULL मान।

    उपयोगकर्ता-परिभाषित चर सत्र-विशिष्ट हैं। अर्थात्, एक क्लाइंट द्वारा परिभाषित उपयोगकर्ता चर को अन्य क्लाइंट द्वारा देखा या उपयोग नहीं किया जा सकता है।

    उन्हें उन्नत MySQL उपयोगकर्ता चर तकनीकोंSELECT का उपयोग करके प्रश्नों में इस्तेमाल किया जा सकता है ।

  2. स्थानीय चर (कोई उपसर्ग नहीं):

    स्थानीय चर का उपयोग करने DECLAREसे पहले इसे घोषित करने की आवश्यकता है।

    उन्हें स्थानीय चर के रूप में इस्तेमाल किया जा सकता है और एक संग्रहीत प्रक्रिया के अंदर इनपुट पैरामीटर:

    DELIMITER //
    
    CREATE PROCEDURE sp_test(var1 INT) 
    BEGIN   
        DECLARE start  INT unsigned DEFAULT 1;  
        DECLARE finish INT unsigned DEFAULT 10;
    
        SELECT  var1, start, finish;
    
        SELECT * FROM places WHERE place BETWEEN start AND finish; 
    END; //
    
    DELIMITER ;
    
    CALL sp_test(5);

    यदि DEFAULTखंड अनुपलब्ध है, तो प्रारंभिक मान है NULL

    स्थानीय चर का दायरा वह BEGIN ... ENDब्लॉक होता है जिसके भीतर यह घोषित किया जाता है।

  3. सर्वर सिस्टम चर (साथ उपसर्ग @@):

    MySQL सर्वर डिफ़ॉल्ट मान के लिए कॉन्फ़िगर किए गए कई सिस्टम चर बनाए रखता है । वे प्रकार के हो सकते हैं GLOBAL, SESSIONया BOTH

    वैश्विक चर सर्वर के संपूर्ण संचालन को प्रभावित करते हैं जबकि सत्र चर व्यक्तिगत क्लाइंट कनेक्शन के लिए इसके संचालन को प्रभावित करते हैं।

    किसी चालू सर्वर द्वारा उपयोग किए जाने वाले वर्तमान मानों को देखने के लिए, SHOW VARIABLESकथन का उपयोग करें या SELECT @@var_name

    SHOW VARIABLES LIKE '%wait_timeout%';
    
    SELECT @@sort_buffer_size;

    उन्हें कमांड लाइन पर या एक विकल्प फ़ाइल में विकल्पों का उपयोग करके सर्वर स्टार्टअप पर सेट किया जा सकता है। सर्वर का उपयोग करते हुए SET GLOBALया चलने पर उनमें से अधिकांश को गतिशील रूप से बदला जा सकता है SET SESSION:

    -- Syntax to Set value to a Global variable:
    SET GLOBAL sort_buffer_size=1000000;
    SET @@global.sort_buffer_size=1000000;
    
    -- Syntax to Set value to a Session variable:
    SET sort_buffer_size=1000000;
    SET SESSION sort_buffer_size=1000000;
    SET @@sort_buffer_size=1000000;
    SET @@local.sort_buffer_size=10000;

3
किसी तरह =ऑपरेटर मेरे लिए काम नहीं किया। जब मैंने :=ऑपरेटर का उपयोग किया तो यह ठीक काम कर रहा था ।
दिविवार्डन

24
=ऑपरेटर केवल SETक्लॉज में काम करता है । SELECTक्वेरी में एक वैरिएबल के लिए मान निर्दिष्ट करने के लिए आप :=ऑपरेटर का उपयोग कर सकते हैं जैसेSELECT @start := 1
ओमेश

2
क्या आप यह स्पष्ट कर सकते हैं कि इसका क्या अर्थ है: "उपसर्ग @ के साथ निरूपित उपयोगकर्ता-परिभाषित सत्र चर घोषित करने की आवश्यकता नहीं है"?
बिलीओनाह

3
@ बिलीनोहा मैं मान रहा हूं कि इसका अर्थ है कि उपयोगकर्ता-परिभाषित सत्र चर (जो @ से शुरू होते हैं) को स्पष्ट घोषणा की आवश्यकता नहीं है; आप बस उन्हें तुरंत असाइन कर सकते हैं जैसे कि वे पहले ही घोषित किए गए थे।
jobo3208

2
और आप इस तरह के एक चुनिंदा बयान के परिणाम के साथ एक चर असाइन कर सकते हैं: SET @subscriptionId = (उपयोगकर्ता से सदस्यता लें जहां emailAddress='ac@tmail.com ');
सॉफ्टवेयर पैगंबर

28

सेट

SET @var_name = value 

या

SET @var := value

दोनों ऑपरेटरों = और : = स्वीकार किए जाते हैं


चुनते हैं

SELECT col1, @var_name := col2 from tb_name WHERE "conditon";

यदि एकाधिक रिकॉर्ड सेट में पाया गया कि col2 में केवल अंतिम मान है (ओवरराइड);

SELECT col1, col2 INTO @var_name, col3 FROM .....

इस मामले में चयन का परिणाम col2 मानों से युक्त नहीं है


पूर्व दोनों तरीकों का इस्तेमाल किया

- TRIGGER_BEFORE_INSERT --- गणना से एक स्तंभ मान सेट करना

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...

3
बीच क्या अंतर है =और :=?
कोरे तुगे

2
मुझे लगता है कि mysql के लिए सिलेक्ट सिंटैक्स का अर्थ = (तुलना) को अलग करने के लिए आवश्यक है: = (
asign

1
कुछ मामलों में, चर में छोड़ा गया मान अंतिम पंक्ति के अनुरूप नहीं हो सकता है। उदाहरण के लिए, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10ऑर्डर-बाय होने से पहले वेरिएबल असाइनमेंट का मूल्यांकन करने के लिए प्रकट होता है, ताकि @var का लौटा मूल्य भी किसी भी लौटी पंक्तियों से संबंधित न हो। डॉक्स यह नहीं बताता है कि यह किन परिस्थितियों में हो सकता है।
चल रहा


3

विभिन्न प्रकार के चर:

  • स्थानीय चर (जो @ से उपसर्ग नहीं होते हैं) दृढ़ता से टाइप किए जाते हैं और संग्रहीत प्रोग्राम ब्लॉक में स्कोप किए जाते हैं जिसमें वे घोषित किए जाते हैं। ध्यान दें, जैसा कि DECLARE सिंटैक्स के तहत प्रलेखित है :

DECLARE को केवल BEGIN ... END कंपाउंड स्टेटमेंट के अंदर जाने की अनुमति है और किसी भी अन्य स्टेटमेंट से पहले इसकी शुरुआत में होना चाहिए।

  • उपयोगकर्ता चर (जो @ द्वारा उपसर्ग किए गए हैं) शिथिल टाइप किए गए हैं और सत्र में स्कोप किए गए हैं। ध्यान दें कि उन्हें न तो जरूरत है और न ही घोषित किया जा सकता है - बस उन्हें सीधे उपयोग करें।

इसलिए, यदि आप एक संग्रहीत प्रोग्राम को परिभाषित कर रहे हैं और वास्तव में "स्थानीय चर" चाहते हैं, तो आपको @ वर्ण को छोड़ना होगा और यह सुनिश्चित करना होगा कि आपका DECLARE स्टेटमेंट आपके प्रोग्राम ब्लॉक की शुरुआत में है। अन्यथा, "उपयोगकर्ता चर" का उपयोग करने के लिए, DECLARE स्टेटमेंट को छोड़ दें।

इसके अलावा, आपको या तो इसे अपनी अधीनता के रूप में निष्पादित करने के लिए कोष्ठक में अपनी क्वेरी को घेरना होगा:

SET @countTotal = (SELECT COUNT (*) FROM nGrams);

या फिर, आप SELECT ... INTO: का उपयोग कर सकते हैं

चयनित COUNT (*) में @countTotal से nGrams;


1

किसी भी व्यक्ति के लिए concat_ws फ़ंक्शन में @variable का उपयोग समवर्ती मान प्राप्त करने के लिए, इसे खाली मान के साथ फिर से संगठित करना न भूलें। अन्यथा यह एक ही सत्र के लिए पुराने मूल्य का उपयोग कर सकता है।

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;

0
  • घोषित: SET @a = 1;

  • उपयोग: INSERT INTO `t` (`c`) VALUES (@a);


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.