web-dev-qa-db-ja.com

MySQLで変数を宣言する方法

2番目のクエリで使用できるように、mysqlで変数を宣言する方法を教えてください。

以下のように書きたいと思います。

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
304
cdub

MySQLには主に3種類の変数があります。

  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;
    

    ユーザー変数には、整数、10進数、浮動小数点数、2進数または非2進数の文字列、またはNULL値の限られたデータ型から値を代入できます。

    ユーザー定義変数はセッション固有です。つまり、1つのクライアントによって定義されたユーザー変数は、他のクライアントから見たり使用したりすることはできません。

    を使用してSELECTクエリで使用することができます/ - 高度なMySQLユーザ変数技術

  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サーバは多くの システム変数を管理しています デフォルト値に設定されています。それらはGLOBALSESSIONまたは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;
    
513
Omesh

セット

SET @var_name = value 

OR

SET @var := value

= := の両方の演算子が受け入れられます


SELECT

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

複数のレコードセットでcol2の最後の値のみが見つかった場合は、keep(override)です。

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

この場合、selectの結果はcol2値を含みません

21
bortunac

設定 または 選択 を使用

SET @counter := 100;
SELECT @variable_name := value;

例:

SELECT @price := MAX(product.price)
FROM product 
11
KouchakYazdi

DECLARE var_name [、var_name] ... type [DEFAULT value]この文は、ストアドプログラム内のローカル変数を宣言します。

例DECLARE id INT符号なしDEFAULT 1;

変数にデフォルト値を指定するには、DEFAULT句を含めます。値は式として指定できます。定数である必要はありません。 DEFAULT句がない場合、初期値はNULLです。

ローカル変数は、データ型とオーバーフローチェックに関して、ストアドルーチンのパラメータと同様に扱われます。

変数宣言は、カーソル宣言またはハンドラ宣言の前に置く必要があります。

ローカル変数名は大文字と小文字を区別しません。許容文字および引用規則は他の識別子の場合と同じです

ローカル変数の有効範囲は、それが宣言されているBEGIN ... ENDブロックです。同じ名前の変数を宣言するブロックを除いて、変数は宣言ブロック内にネストされたブロック内で参照できます。

2
AJS

SET値

 declare Regione int;   
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;
0
Hari Lakkakula

さまざまなタイプの変数:

  • ローカル変数(@を前に付けない)は、それらが宣言されているストアドプログラムブロックに厳密に型指定され、スコープが設定されます。 DECLARE Syntax で文書化されていることに注意してください。

DECLAREはBEGIN ... END複合ステートメント内でのみ許可され、他のステートメントの前に開始する必要があります。

  • ユーザー変数(プレフィックスは@)は、緩やかに入力され、セッションにスコープされます。これらは宣言する必要もなければ宣言もできないことに注意してください。直接使用するだけです。

したがって、ストアドプログラムを定義しているときに実際に「ローカル変数」が必要な場合は、@文字を削除し、DECLAREステートメントがプログラムブロックの先頭にあることを確認する必要があります。それ以外の場合、「ユーザー変数」を使用するには、DECLAREステートメントをドロップします。

さらに、クエリをサブクエリとして実行するには、クエリを括弧で囲む必要があります。

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

または、SELECT ... INTOを使用できます。

SELECT COUNT(*)INTO @countTotal FROM nGrams;

0
mohammadAli

連結値を取得するためにconcat_ws関数で@variableを使用している人は、空の値で再初期化することを忘れないでください。そうでなければ、同じセッションに古い値を使うことができます。

Set @Ids = '';

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