মাইএসকিউএলে ভেরিয়েবল কীভাবে ঘোষণা করবেন?


386

মাইএসকিএলে কোনও পরিবর্তনশীল কীভাবে ঘোষণা করবেন, যাতে আমার দ্বিতীয় ক্যোয়ারী এটি ব্যবহার করতে পারে?

আমি কিছু লিখতে চাই:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

ভুলে যাবেন না আপনার প্রয়োজন হতে পারে "ব্যবহারকারী ভেরিয়েবলগুলিকে অনুমতি দিন = সত্য"।
স্টিভ স্মিথ

উত্তর:


636

মাইএসকিউএলে মূলত তিন ধরণের ভেরিয়েবল রয়েছে:

  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 মান।

    ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলগুলি সেশন-নির্দিষ্ট। অর্থাৎ, একটি ক্লায়েন্ট দ্বারা সংজ্ঞায়িত একটি ব্যবহারকারী ভেরিয়েবল অন্যান্য ক্লায়েন্টদের দ্বারা দেখা বা ব্যবহার করা যায় না।

    এগুলি উন্নত মাইএসকিউএল ব্যবহারকারী পরিবর্তনশীল কৌশলগুলি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. সার্ভার সিস্টেম ভেরিয়েবল (এর সাথে পূর্বনির্ধারিত @@):

    মাইএসকিউএল সার্ভার একটি ডিফল্ট মান হিসাবে কনফিগার করা অনেক সিস্টেম ভেরিয়েবল বজায় রাখে । তারা টাইপ হতে পারে 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 = (ব্যবহারকারীর থেকে সাবস্ক্রিপশন আইড নির্বাচন করুন যেখানে ইমেলএড્રેસ='ac@tmail.com ');
সফটওয়্যার

28

সেট

SET @var_name = value 

অথবা

SET @var := value

উভয় অপারেটর = এবং : = স্বীকৃত


নির্বাচন

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

যদি একাধিক রেকর্ড সেট পাওয়া যায় তবে কল 2-তে কেবল সর্বশেষ মানটি রাখুন (ওভাররাইড);

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

এই ক্ষেত্রে নির্বাচনের ফলাফলটিতে কল 2 মান থাকে না


প্রাক্তন উভয় পদ্ধতি ব্যবহৃত

- TRIGGER_BEFORE_INSERT --- গণনা থেকে কলাম মান নির্ধারণ করা

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

3
মধ্যে পার্থক্য কি =এবং :=?
Koray Tugay

2
আমি অনুমান করি যে মাইএসকিএল-র জন্য নির্বাচনের বাক্য
গঠনটি

1
কিছু ক্ষেত্রে, ভেরিয়েবলের মধ্যে থাকা মানগুলি ফিরে আসা শেষ সারির সাথে সামঞ্জস্য না করে। উদাহরণস্বরূপ, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10অর্ডার-বাই করার আগে ভেরিয়েবল অ্যাসাইনমেন্টগুলি মূল্যায়ন করার জন্য উপস্থিত হয়, যাতে @var এর ফেরত মানটি ফিরে আসা সারিগুলির কোনওটির সাথেও সম্পর্কিত না হয়। যদিও কোন পরিস্থিতিতে এটি ঘটতে পারে তার অধীনে ডক্সটি বলে না don't
Doin থেকে


3

বিভিন্ন ধরণের পরিবর্তনশীল:

  • স্থানীয় ভেরিয়েবলগুলি (যা @ দ্বারা উপস্থাপিত হয় না) দৃ strongly়ভাবে টাইপ করা হয় এবং স্টোরেজ প্রোগ্রাম ব্লকে স্কোপ করা হয় যেখানে তারা ঘোষিত হয়। নোট করুন যেটি ডেকলার সিনট্যাক্সের অধীনে নথিভুক্ত হয়েছে :

সম্মিলিত বিবৃতিতে কেবল কোনও শুরু ... এর মধ্যে ডিক্লেয়ার অনুমোদিত হয় এবং অন্য কোনও বিবৃতি দেওয়ার আগে অবশ্যই এটির শুরুতে হওয়া উচিত।

  • ব্যবহারকারীর ভেরিয়েবলগুলি (যা @ দ্বারা উপস্থাপিত হয়) শিথিলভাবে সেশনটিতে টাইপ এবং স্কোপ করা হয়। মনে রাখবেন যে তাদের প্রয়োজন হয় না এবং ঘোষণাও করা যায় না - কেবল তাদের সরাসরি ব্যবহার করুন।

অতএব, আপনি যদি কোনও সঞ্চিত প্রোগ্রামটি সংজ্ঞায়িত করে থাকেন এবং প্রকৃতপক্ষে একটি "স্থানীয় পরিবর্তনশীল" চান, আপনার @ অক্ষরটি ড্রপ করে তা নিশ্চিত করতে হবে যে আপনার ডিক্লেয়ারের বিবৃতিটি আপনার প্রোগ্রামটি ব্লকের শুরুতে রয়েছে। অন্যথায়, "ব্যবহারকারী ভেরিয়েবল" ব্যবহার করতে, DECLARE বিবৃতিটি ড্রপ করুন।

তদ্ব্যতীত, আপনার হয় আপনার জিজ্ঞাসাটি সাব-কোয়েরি হিসাবে কার্যকর করার জন্য প্রথম বন্ধনীতে আপনার চারপাশে ঘিরতে হবে:

সেট @ অ্যাকাউন্টসটোটাল = (নির্বাচন করুন (*) এনজিআরএস থেকে);

অন্যথায়, আপনি নির্বাচন ... ব্যবহার করতে পারেন ...

নির্বাচন করুন COUNT (*) মধ্যে @ অ্যাকাউন্ট থেকে মোট এনজিগ্রাম;


1

সংক্ষিপ্ত মানগুলি পেতে কনট্যাট_উজ ফাংশনে @ পরিবর্তনশীল যে কোনও ব্যক্তির জন্য, খালি মান দিয়ে এটি পুনরায় পুনর্নিবিষ্ট করতে ভুলবেন না। অন্যথায় এটি একই সেশনের জন্য পুরানো মান ব্যবহার করতে পারে।

Set @Ids = '';

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

0
  • ঘোষণা: SET @a = 1;

  • ব্যবহার: INSERT INTO `t` (`c`) VALUES (@a);


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.