MySQLで変数を宣言する方法は?


386

2番目のクエリで変数を使用できるように、mysqlで変数を宣言する方法は?

私は次のようなものを書きたいと思います:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

「ユーザー変数を許可する=真」が必要になる場合があることを忘れないでください。
Steve Smith、

回答:


636

MySQLには主に3つのタイプの変数があります。

  1. ユーザー定義変数(接頭辞@):

    宣言したり初期化したりしなくても、ユーザー定義変数にアクセスできます。初期化されていない変数を参照すると、その変数の値NULLと文字列のタイプが含まれます。

    SELECT @var_any_var_name

    SETor 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を使用したクエリで使用できます

  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 GLOBALor を使用して実行中に動的に変更できます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
どういうわけか=オペレーターは私のために働いていませんでした。:=演算子を使用するとうまくいきました。
divinedragon 2014

24
=演算子はSET句でのみ機能します。SELECTクエリで変数に値を割り当てるには、:=演算子を使用できます。例SELECT @start := 1
Omesh

2
「プレフィックス@で示されるユーザー定義セッション変数を宣言する必要がない」とはどういう意味ですか?
ビリーノア2015

3
@billynoahこれは、ユーザー定義セッション変数(@で始まる)が明示的な宣言を必要としないことを意味していると思います。すでに宣言されているかのように、すぐに割り当てることができます。
jobo3208 2015年

2
また、次のようなselectステートメントの結果を変数に割り当てることができます。SET@subscriptionId =(select subscriptionId from User where emailAddress='ac@tmail.com ');
ソフトウェアの預言​​者2016

28

セットする

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;
...

3
違いは何である=とは:=
Koray Tugay

2
MySQLのSELECT構文では、=(比較)の意味を:=(asign)から分離する必要があると思います
bortunac

1
場合によっては、変数に残された値が、返された最後の行に対応しないことがあります。たとえばSELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10、order-byが実行される前に変数の割り当てを評価しているように見えるため、@ varの戻り値は、返された行のいずれにも関係しない可能性があります。ただし、ドキュメントでは、これが発生する可能性のある状況については触れられていません。
Doin


3

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

  • ローカル変数(接頭辞@が付いていない)は厳密に型指定され、それらが宣言されているストアドプログラムブロックにスコープされます。下の文書として、なおDECLARE構文

DECLAREはBEGIN ... END複合ステートメント内でのみ許可されており、他のステートメントより前の開始位置になければなりません。

  • ユーザー変数(接頭辞@付き)は緩やかに型指定され、セッションのスコープが設定されます。これらは必要も宣言もできないことに注意してください。直接使用するだけです。

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

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

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

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

SELECT COUNT(*)INTO @countTotal FROM nGrams;


1

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

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.