複数行を返すステートメントでMySQLユーザー変数に値を代入するとどうなる?仕組みと動作例を解説
ユーザー変数に値を代入する際、複数の行を返すステートメントを使用するとどうなるのでしょうか。結論から言うと、最終行(最後の行)の値だけがユーザー変数に保存されます。これは、MySQLのユーザー変数が単一の値しか保持できないためです。
以下では、サンプルテーブル「Tender」のデータを使って、この動作を具体的に確認していきます。
サンプルデータの確認
まず、「Tender」テーブルには次のようなデータが格納されています。
mysql> select * from Tender; +----+---------------+--------------+ | Sr | CompanyName | Tender_value | +----+---------------+--------------+ | 1 | Abc Corp. | 250.369003 | | 2 | Khaitan Corp. | 265.588989 | | 3 | Singla group. | 220.255997 | | 4 | Hero group. | 221.253006 | | 5 | Honda group | 225.292266 | +----+---------------+--------------+ 5 rows in set (0.04 sec)
複数行を返すステートメントでユーザー変数に代入する
次に、「companyname」カラムの値を「:=」演算子を使ってユーザー変数「@name」に代入してみます。
mysql> Select @name := companyname from tender; +----------------------+ | @name := companyname | +----------------------+ | Abc Corp. | | Khaitan Corp. | | Singla group. | | Hero group. | | Honda group | +----------------------+ 5 rows in set (0.00 sec)
結果セットを見ると、5行すべての会社名が表示されているように見えます。しかし、これはあくまで各行の処理時に順番に代入が行われた結果を表示しているだけであり、変数自体には毎回新しい値が上書きされていきます。
変数を参照すると最終行の値のみが残る
それでは、代入後のユーザー変数「@name」を参照してみましょう。
mysql> Select @name; +-------------+ | @name | +-------------+ | Honda group | +-------------+ 1 row in set (0.00 sec)
ご覧のとおり、変数には最終行である「Honda group」という値だけが保存されています。途中の行の値は、次の行が処理されるタイミングで上書きされてしまうため、残りません。
まとめ
- MySQLのユーザー変数は、単一の値のみを保持できる。
- 複数行を返すステートメントで代入すると、行ごとに値が上書きされ、最終行の値が変数に残る。
- 複数の値を扱いたい場合は、ユーザー変数ではなく一時テーブルやGROUP_CONCAT関数などの利用を検討するとよい。
-
MySQLのIN句を使って選択した複数行を表示する方法
MySQLのIN句で選択した複数行を表示する方法MySQLでは、IN句にタプル(行の組み合わせ)を指定することで、複数の条件に一致する行を一度に取得できます。本記事では、IdとFirstNameという2つのカラムを組み合わせた条件で、特定の複数行だけを抽出して表示する手順を解説します。1. テーブルを作成するまず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1045 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, &nbs
-
MySQLで行を列の値ごとに配列形式でグループ化する方法
MySQLで行を配列のようにグループ化したい場合は、GROUP_CONCAT() 関数と ORDER BY 句を組み合わせて使用します。この記事では、実際にテーブルを作成し、データを挿入してから、列の値ごとに行をまとめるクエリを実行する手順を具体的に解説します。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable -> ( -> Id int, -> FirstName varchar(20) -> );Query OK, 0 rows affected (0.7