2012-08-01 7 views
192

2番目のクエリで使用できるように、mysqlで変数を宣言するにはどうすればいいですか?MySQLで変数を宣言するには?

SET start = 1; 
SET finish = 10; 

SELECT * FROM places WHERE place BETWEEN start AND finish; 

答えて

337

MySQLでの変数の3種類の主にあります:

  1. User-defined variables@接頭辞):

    あなたは私のようなものを書きたいと思い

    ユーザー定義の変数に宣言せずにアクセスすることができます。 initiateそれをalizing。 が初期化されていない変数を参照する場合は、値は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クエリで使用できます。

  2. Local Variables(接頭辞なし):

    ローカル変数は、それをアクセスするDECLARE 前に使用して宣言する必要があります。

    それらはローカル変数として使用することができ、入力は、ストアドプロシージャ内部 パラメータ:DEFAULT句が欠落している場合

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

    は、初期値はNULLあります。

    ローカル変数のスコープは、宣言されている 内のBEGIN ... ENDブロックです。

    @@接頭辞)
  3. Server System Variables

    MySQLサーバは、デフォルト値に設定さsystem variables多くを維持しています。 タイプは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; 
    
+1

何とか '' '' = '' ''演算子が私のために働かなかった。 '' '' = '' ''演算子を使うとうまくいきました。 – divinedragon

+14

'='演算子は 'SET'節でのみ動作します。 'SELECT'クエリの変数に値を代入するには、':= '演算子を使うことができます。 'SELECT @start:= 1' – Omesh

+2

あなたはこれが何を意味するのかを明確にしてください:「プレフィックス@で示されるユーザ定義のセッション変数を宣言する必要はありませんか? – billynoah

8

使用を設定したり、

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

例を選択:

SELECT @price := MAX(product.price) 
FROM product 
7

SET

SET @var_name = value 

OR

SET @var := value 

両方演算子=と:=


0を受け入れられます複数のレコードセットが見つかった場合

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

を選択のみCOL2の最後の値は、(オーバーライド)維持されます。選択の結果は、col2の値に

+0

'='と ':='の違いは何ですか? –

+1

私はmysql SELECT構文が=(比較)の意味を分離する必要があると思います:=(asign) – bortunac

2

DECLAREのVAR_NAME [、VAR_NAME]を含有していない。この場合、

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

...タイプ[DEFAULT値] この文は、格納されたプログラム内のローカル変数を宣言します。

Ex。 DECLARE ID INT符号なしDEFAULT 1;

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

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

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

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

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