MySQLの変数とは何ですか?使い方?

不言
リリース: 2018-12-30 09:19:19
転載
7151 人が閲覧しました

この記事では、MySQL の変数とは何かについて説明します。使い方?困っている友人は参考にしていただければ幸いです。

MySQL の変数は、ローカル変数、ユーザー変数、セッション変数、グローバル変数の 4 種類に分類されます。ローカル変数は関数とストアド プロシージャ内にのみ存在します。ここでは詳しく知りません。このうちセッション変数とグローバル変数を総称してMySQLではシステム変数と呼びます。

ユーザー変数

基本

名前が示すように、これらはユーザー定義変数です。変数を定義するにはどうすればよいですか?メソッドは 2 つあります。

SET メソッド

# 两种方式都可以
SET @variable = expr
SET @variable := expr
ログイン後にコピー

SELECT メソッド

# 必须 :=
SELECT @variable := expr
ログイン後にコピー

ユーザー変数定義の備考:

  1. 未定義変数 初期値値は null (変数を定義せずに直接使用でき、エラーは報告されません)

  2. 変数名は大文字と小文字が区別されません

  3. selectlimit ステートメントなど、リテラル値が必要な場所では変数を使用できません。

  4. ユーザー変数を呼び出す式の評価順序は、実際には未定義です。たとえば、SELECT @a = 0、@a := @a 1;、両方の列が0になる。

  5. ユーザー変数に値を割り当てる場合、式の値が最初に決定されます。理解方法は、次のコードを見てください。

    SET @m = 0;
    SET @m = 3, @n = @m;
    SELECT @n; # 0
    ログイン後にコピー
  6. ユーザー変数の型は動的に変更できますが、引き継ぎ時に生命の危険にさらされる可能性があるため、お勧めできません。コード:p 。

変数として、ユーザー変数はすべてセッション全体に対して有効です。つまり、セッション全体に対して有効です。これは問題ないようですが、接続プールが使用されており、カスタム ユーザー変数が正しく初期化されていない場合、予期しない問題が発生する可能性があることに注意してください。実際には破棄されていないため、最後の結果が記録されます。

シリアル番号関数を実装する簡単な例を見てみましょう。テーブルとデータは次のとおりです。

CREATE TABLE employee (
   id int primary key,
   salary int not null
);

INSERT INTO employee VALUES(1, 100);
INSERT INTO employee VALUES(2, 200);
INSERT INTO employee VALUES(3, 300);
ログイン後にコピー

これまでに学んだことに基づいて、次のことができます。次の SQL が出力されます:

SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
FROM employee, (SELECT @rowno := 0) r;
ログイン後にコピー

問題はありません。すべてが期待どおりです。次に、WHERE 条件を追加して試します:

SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
FROM employee, (SELECT @rowno := 0) r
WHERE @rowno = 0;
ログイン後にコピー

理論的には、これはデータを返さないはずです。ただし、ID 1 のデータも返します。 ###なぜ? WHERE 条件で使用される @rowno は常に同じ値 0 であり、SELECT で変更されるためリアルタイムには応答しません。
WHERE の機能を実現するには、次のように書き換える必要があります。

SELECT salary, rowno
FROM (
    SELECT salary, (@rowno := @rowno + 1) AS 'rowno'
    FROM employee, (SELECT @rowno := 0) r
) m
WHERE rowno = 2;
ログイン後にコピー
実際には、SELECT の WHERE、GROUP BY、ORDER BY 内のユーザー変数が期待どおりに動作しません。古い値はリアルタイムで変更されます。

システム変数

セッション変数

セッション変数は、クライアント接続ごとにサーバーによって維持される変数です。クライアントが接続すると、クライアントのセッション変数は、対応するグローバル変数の現在の値を使用して初期化されます。

名前が示すように、セッション変数のスコープはセッションです。セッション変数の値を設定するにはどうすればよいですか?次のとおりです:

set session var_name = value;
set @@session.var_name = value;
set var_name = value;
ログイン後にコピー
値を設定できるのは既存のセッション変数のみであり、新しいセッション変数を作成することはできないことに注意してください。では、セッション変数を取得するにはどうすればよいでしょうか?次のとおりです:

show session variables;
# 以上代码会把所有会话变量罗列出来,可通过 like 进行过滤
show session variables LIKE "%var%";
ログイン後にコピー
グローバル変数

グローバル変数は、サーバーの全体的な動作に影響します。ただし、再起動すると、これらの設定はリセットされます。グローバル変数を変更するには、SUPER 権限が必要であることに注意してください。

その設定はセッション変数の設定と似ています:

set global var_name = value;
set @@global.var_name = value;
ログイン後にコピー
グローバル変数は新しい変数を追加できません。変更できるのは既存の変数のみです。グローバル変数を取得する操作はセッション変数と似ています:

show session variables;
show global variables like "%var%";
ログイン後にコピー


以上がMySQLの変数とは何ですか?使い方?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート