mysqlで変数を宣言して、2番目のクエリで使用できるようにする方法は?
私は次のようなものを書きたいと思います:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
MySQLには主に3つのタイプの変数があります。
ユーザー定義変数(接頭辞@
):
宣言したり初期化したりせずに、任意のユーザー定義変数にアクセスできます。初期化されていない変数を参照する場合、その変数の値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;
ユーザー変数には、整数、10進数、浮動小数点、バイナリまたは非バイナリ文字列、または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
またはを使用して動的に変更でき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 @var_name = value; /* or */ SET @var_name := value;
演算子=と:=の両方が受け入れられます
選択する
SELECT col1, @var_name := col2 from tb_name WHERE "conditon";
複数のレコードセットが見つかった場合、col2の最後の値のみがkeep(オーバーライド)です。
SELECT col1, col2 INTO @var_name, col3 FROM .....
この場合、selectの結果にはcol2値が含まれていません
使用した両方の方法の例
--TRIGGER_BEFORE_INSERT---計算からの列値の設定
...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col = IFNULL( @NR, 0 ) + 1;
...
セットを使用するか、選択します
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;
宣言する:
SET @a = 1;
使用法:
INSERT INTO `t` (`c`) VALUES (@a);
concat_ws関数で@variableを使用して連結値を取得する場合は、空の値で再初期化することを忘れないでください。それ以外の場合は、同じセッションに古い値を使用できます。
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 ;