মাইএসকিএলে কোনও পরিবর্তনশীল কীভাবে ঘোষণা করবেন, যাতে আমার দ্বিতীয় ক্যোয়ারী এটি ব্যবহার করতে পারে?
আমি কিছু লিখতে চাই:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
মাইএসকিএলে কোনও পরিবর্তনশীল কীভাবে ঘোষণা করবেন, যাতে আমার দ্বিতীয় ক্যোয়ারী এটি ব্যবহার করতে পারে?
আমি কিছু লিখতে চাই:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
উত্তর:
মাইএসকিউএলে মূলত তিন ধরণের ভেরিয়েবল রয়েছে:
ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবল (এর সাথে পূর্বনির্ধারিত @
):
আপনি যে কোনও ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ভেরিয়েবলটি ঘোষণা না করে বা এটি আরম্ভ না করে অ্যাক্সেস করতে পারেন। আপনি যদি এমন কোনও ভেরিয়েবল উল্লেখ করেন যা আরম্ভ করা হয়নি, তবে এর মান 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
ব্যবহার করে ক্যোয়ারিতে ব্যবহার করা যেতে পারে ।
স্থানীয় চলকগুলি (উপসর্গ নেই):
স্থানীয় ভেরিয়েবলগুলি 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
ব্লকটি যার মধ্যে এটি ঘোষিত হয়।
সার্ভার সিস্টেম ভেরিয়েবল (এর সাথে পূর্বনির্ধারিত @@
):
মাইএসকিউএল সার্ভার একটি ডিফল্ট মান হিসাবে কনফিগার করা অনেক সিস্টেম ভেরিয়েবল বজায় রাখে । তারা টাইপ হতে পারে 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;
=
অপারেটর আমার পক্ষে কাজ করেনি। আমি :=
অপারেটর ব্যবহার করার সময় এটি দুর্দান্ত কাজ করেছিল ।
=
অপারেটরটি কেবল SET
ক্লজে কাজ করে । SELECT
ক্যোয়ারিতে কোনও ভেরিয়েবলের মান নির্ধারণের জন্য আপনি :=
অপারেটর ব্যবহার করতে পারেন যেমনSELECT @start := 1
সেট
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;
...
=
এবং :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
অর্ডার-বাই করার আগে ভেরিয়েবল অ্যাসাইনমেন্টগুলি মূল্যায়ন করার জন্য উপস্থিত হয়, যাতে @var এর ফেরত মানটি ফিরে আসা সারিগুলির কোনওটির সাথেও সম্পর্কিত না হয়। যদিও কোন পরিস্থিতিতে এটি ঘটতে পারে তার অধীনে ডক্সটি বলে না don't
সেট ব্যবহার করুন বা নির্বাচন করুন
SET @counter := 100;
SELECT @variable_name := value;
উদাহরণ:
SELECT @price := MAX(product.price)
FROM product
বিভিন্ন ধরণের পরিবর্তনশীল:
সম্মিলিত বিবৃতিতে কেবল কোনও শুরু ... এর মধ্যে ডিক্লেয়ার অনুমোদিত হয় এবং অন্য কোনও বিবৃতি দেওয়ার আগে অবশ্যই এটির শুরুতে হওয়া উচিত।
অতএব, আপনি যদি কোনও সঞ্চিত প্রোগ্রামটি সংজ্ঞায়িত করে থাকেন এবং প্রকৃতপক্ষে একটি "স্থানীয় পরিবর্তনশীল" চান, আপনার @ অক্ষরটি ড্রপ করে তা নিশ্চিত করতে হবে যে আপনার ডিক্লেয়ারের বিবৃতিটি আপনার প্রোগ্রামটি ব্লকের শুরুতে রয়েছে। অন্যথায়, "ব্যবহারকারী ভেরিয়েবল" ব্যবহার করতে, DECLARE বিবৃতিটি ড্রপ করুন।
তদ্ব্যতীত, আপনার হয় আপনার জিজ্ঞাসাটি সাব-কোয়েরি হিসাবে কার্যকর করার জন্য প্রথম বন্ধনীতে আপনার চারপাশে ঘিরতে হবে:
সেট @ অ্যাকাউন্টসটোটাল = (নির্বাচন করুন (*) এনজিআরএস থেকে);
অন্যথায়, আপনি নির্বাচন ... ব্যবহার করতে পারেন ...
নির্বাচন করুন COUNT (*) মধ্যে @ অ্যাকাউন্ট থেকে মোট এনজিগ্রাম;
সংক্ষিপ্ত মানগুলি পেতে কনট্যাট_উজ ফাংশনে @ পরিবর্তনশীল যে কোনও ব্যক্তির জন্য, খালি মান দিয়ে এটি পুনরায় পুনর্নিবিষ্ট করতে ভুলবেন না। অন্যথায় এটি একই সেশনের জন্য পুরানো মান ব্যবহার করতে পারে।
Set @Ids = '';
select
@Ids := concat_ws(',',@Ids,tbl.Id),
tbl.Col1,
...
from mytable tbl;
declare Regione int;
set Regione=(select id from users
where id=1) ;
select Regione ;