MySQLで2つの列の値を交換する方法【UPDATE文とスワップロジック】
MySQLで2つの列の値を交換する方法
MySQLでテーブル内の2つの列(カラム)の値を入れ替えたい場合、一時的な作業用の列を作らなくても、簡単な算術演算を利用した「スワップ(交換)ロジック」で実現できます。
値の交換(スワップ)ロジックの基本
2つの値を交換するには、以下の手順に従います。
- 両方の値を合計し、1つ目の列に格納する
- 2つ目の列から1つ目の列の値を引き、その結果を2つ目の列に格納する
- 更新後の2つ目の列の値を1つ目の列から引き、その結果を1つ目の列に格納する
このルールを式で表すと次のようになります。1つ目の列を「a」、2つ目の列を「b」とします。
1. a = a + b; 2. b = a - b; 3. a = a - b;
それでは、実際にこのロジックを使って2つの列の値を入れ替えてみましょう。
テーブルの作成
まずはサンプル用のテーブルを作成します。
mysql> create table SwappingTwoColumnsValueDemo
-> (
-> FirstColumnValue int,
-> SecondColumnValue int
-> );
Query OK, 0 rows affected (0.49 sec)サンプルデータの挿入
続いて、動作確認用のレコードを挿入します。
mysql> insert into SwappingTwoColumnsValueDemo values(10,20),(30,40),(50,60),(70,80),(90,100); Query OK, 5 rows affected (0.19 sec) Records: 5 Duplicates: 0 Warnings: 0
交換前の列の値を確認する
スワップ前に現在のデータを確認しておきます。
mysql> select * from SwappingTwoColumnsValueDemo;
以下が出力結果です。
+------------------+-------------------+ | FirstColumnValue | SecondColumnValue | +------------------+-------------------+ | 10 | 20 | | 30 | 40 | | 50 | 60 | | 70 | 80 | | 90 | 100 | +------------------+-------------------+ 5 rows in set (0.00 sec)
UPDATE文で列の値を交換する
ここで、冒頭で説明したスワップロジックをUPDATE文に適用します。
mysql> UPDATE SwappingTwoColumnsValueDemo
-> SET FirstColumnValue = FirstColumnValue + SecondColumnValue,
-> SecondColumnValue = FirstColumnValue - SecondColumnValue,
-> FirstColumnValue = FirstColumnValue - SecondColumnValue;
Query OK, 5 rows affected (0.15 sec)
Rows matched: 5 Changed: 5 Warnings: 0交換後の結果を確認する
値が正しく入れ替わったかどうか、再度SELECT文で確認しましょう。
mysql> select * from SwappingTwoColumnsValueDemo;
以下が出力結果です。
+------------------+-------------------+ | FirstColumnValue | SecondColumnValue | +------------------+-------------------+ | 20 | 10 | | 40 | 30 | | 60 | 50 | | 80 | 70 | | 100 | 90 | +------------------+-------------------+ 5 rows in set (0.00 sec)
出力結果を見ると、FirstColumnValueとSecondColumnValueの値が完全に入れ替わっていることが確認できます。
補足:MySQLなら直接代入での交換も可能
MySQLでは、SET句が左から右へ順番に評価されるという仕様があるため、実は一時的な変数や算術演算を使わずに「SET col1 = col2, col2 = col1」のように直接書いても値を交換できます。ただし、標準SQLではすべての代入が元の値を基準に行われるため、この書き方はMySQL固有の動作です。上記の加減算による手法は他のデータベースにも応用できる汎用的なアプローチなので、覚えておくと便利です。
-
MySQLで列の値をシャッフルする方法【ORDER BY RAND()の使い方】
MySQLでテーブル内のレコード(列の値)をランダムに並べ替えたい場合は、ORDER BY RAND()を使用します。この記事では、実際にテーブルを作成し、データを挿入して、シャッフルの動作を手順ごとに確認していきましょう。 1. テーブルの作成 まず、以下のコマンドでサンプル用のテーブルを作成します。 mysql> create table DemoTable1557 -> ( -> SubjectId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> SubjectName varchar(20) -&
-
MySQLで空白(空文字列)の列をNULLに更新する方法
データベースを運用していると、「空文字列()」として登録されてしまったデータを「NULL」に置き換えたいケースによく出会います。NULLと空文字列は似ているようで意味が異なり、検索条件や集計処理に影響を与えるため、統一しておくことが重要です。この記事では、IF()関数とUPDATE文を組み合わせて、空白値の列をNULLに更新する手順を、実際のSQLコードと実行結果付きで解説します。1. サンプルテーブルを作成するまず、動作確認用のテーブルを作成します。ここでは氏名を格納するシンプルなテーブルを用意しました。mysql> create table DemoTable1601 -&g