MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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固有の動作です。上記の加減算による手法は他のデータベースにも応用できる汎用的なアプローチなので、覚えておくと便利です。

  1. MySQLで列の値をシャッフルする方法【ORDER BY RAND()の使い方】

    MySQLでテーブル内のレコード(列の値)をランダムに並べ替えたい場合は、ORDER BY RAND()を使用します。この記事では、実際にテーブルを作成し、データを挿入して、シャッフルの動作を手順ごとに確認していきましょう。 1. テーブルの作成 まず、以下のコマンドでサンプル用のテーブルを作成します。 mysql> create table DemoTable1557 -> ( -> SubjectId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> SubjectName varchar(20) -&

  2. MySQLで空白(空文字列)の列をNULLに更新する方法

    データベースを運用していると、「空文字列()」として登録されてしまったデータを「NULL」に置き換えたいケースによく出会います。NULLと空文字列は似ているようで意味が異なり、検索条件や集計処理に影響を与えるため、統一しておくことが重要です。この記事では、IF()関数とUPDATE文を組み合わせて、空白値の列をNULLに更新する手順を、実際のSQLコードと実行結果付きで解説します。1. サンプルテーブルを作成するまず、動作確認用のテーブルを作成します。ここでは氏名を格納するシンプルなテーブルを用意しました。mysql> create table DemoTable1601 -&g