489

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

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

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
4

7 に答える 7

796

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進数、浮動小数点、バイナリまたは非バイナリ文字列、または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サーバーは、デフォルト値に構成された多くのシステム変数を維持します。タイプ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;
    
于 2012-08-01T07:48:27.897 に答える
49

セットする

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;
...
于 2017-01-19T11:10:48.197 に答える
21

セットを使用するか、選択します

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

例 :

SELECT @price := MAX(product.price)
FROM product 
于 2016-12-23T17:26:03.920 に答える
10

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

  • ローカル変数(接頭辞@が付いていない)は、強く型付けされ、宣言されているストアドプログラムブロックにスコープされます。DECLARE構文で説明されているように、次のことに注意してください。

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

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

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

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

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

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

SELECT COUNT(*)INTO @countTotal FROM nGrams;

于 2019-08-06T12:14:43.743 に答える
5
  • 宣言する: SET @a = 1;

  • 使用法: INSERT INTO `t` (`c`) VALUES (@a);

于 2019-11-09T12:38:42.547 に答える
3

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

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;
于 2018-11-27T17:01:30.050 に答える
-3

SET値

 declare @Regione int;   
 set @Regione=(select  id from users
 where id=1) ;
 select @Regione ;
于 2019-05-30T12:31:43.587 に答える