回答:
MySQLには主に3つのタイプの変数があります。
ユーザー定義変数(接頭辞@
):
宣言したり初期化したりしなくても、ユーザー定義変数にアクセスできます。初期化されていない変数を参照すると、その変数の値NULL
と文字列のタイプが含まれます。
SELECT @var_any_var_name
SET
or SELECT
ステートメントを使用して変数を初期化できます。
SET @start = 1, @finish = 10;
または
SELECT @start := 1, @finish := 10;
SELECT * FROM places WHERE place BETWEEN @start AND @finish;
ユーザー変数には、限られたデータ型のセット(整数、10進数、浮動小数点、2進または非2進の文字列、またはNULL値)から値を割り当てることができます。
ユーザー定義変数はセッション固有です。つまり、1つのクライアントで定義されたユーザー変数は、他のクライアントでは表示または使用できません。
これらは、高度なMySQLユーザー変数手法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
それが宣言されているブロックです。
サーバーシステム変数(接頭辞@@
):
MySQLサーバーは、デフォルト値に設定された多くのシステム変数を維持します。タイプはGLOBAL
、SESSION
またはBOTH
です。
グローバル変数はサーバーの全体的な操作に影響しますが、セッション変数は個々のクライアント接続のサーバーの操作に影響します。
実行中のサーバーで使用されている現在の値を確認するには、SHOW VARIABLES
ステートメントまたはを使用しますSELECT @@var_name
。
SHOW VARIABLES LIKE '%wait_timeout%';
SELECT @@sort_buffer_size;
これらは、サーバーの起動時に、コマンドラインまたはオプションファイルのオプションを使用して設定できます。それらのほとんどは、サーバーがSET GLOBAL
or を使用して実行中に動的に変更できます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";
複数のレコードセットが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;
...
=
とは:=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
、order-byが実行される前に変数の割り当てを評価しているように見えるため、@ varの戻り値は、返された行のいずれにも関係しない可能性があります。ただし、ドキュメントでは、これが発生する可能性のある状況については触れられていません。
セットまたは選択を使用
SET @counter := 100;
SELECT @variable_name := value;
例:
SELECT @price := MAX(product.price)
FROM product
さまざまなタイプの変数:
DECLAREはBEGIN ... END複合ステートメント内でのみ許可されており、他のステートメントより前の開始位置になければなりません。
したがって、ストアドプログラムを定義していて、実際に「ローカル変数」が必要な場合は、@文字を削除し、DECLAREステートメントがプログラムブロックの先頭にあることを確認する必要があります。それ以外の場合、「ユーザー変数」を使用するには、DECLAREステートメントを削除します。
さらに、クエリをサブクエリとして実行するには、クエリを括弧で囲む必要があります。
SET @countTotal =(SELECT COUNT(*)FROM nGrams);
または、SELECT ... INTOを使用できます。
SELECT COUNT(*)INTO @countTotal FROM nGrams;