MySQLで2つの列(カラム)の差分を降順に並べ替えて取得する方法
MySQLでは、ORDER BY句を使うことで、2つの列(カラム)の差分を計算し、その結果を昇順・降順に並べ替えて取得できます。本記事では、実際のテーブル作成からクエリ実行までの手順を順番に解説します。
1. サンプルテーブルを作成する
まず、2つのINT型カラムを持つテーブルを作成しましょう。
mysql> create table DemoTable
(
Value1 int,
Value2 int
);
Query OK, 0 rows affected (0.54 sec)2. レコードを挿入する
次に、INSERTコマンドを使ってサンプルデータを登録します。
mysql> insert into DemoTable values(10,40); Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable values(50,5); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable values(51,56); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable values(52,78); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable values(90,7); Query OK, 1 row affected (0.21 sec)
3. テーブルの中身を確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
出力結果
+--------+--------+ | Value1 | Value2 | +--------+--------+ | 10 | 40 | | 50 | 5 | | 51 | 56 | | 52 | 78 | | 90 | 7 | +--------+--------+ 5 rows in set (0.00 sec)
4. 差分を計算して並べ替えるクエリ
ここが本題です。(Value1 - Value2)のように減算を行い、その結果にエイリアス「Sub」を付けて、ORDER BY句で降順(DESC)に並べ替えます。
mysql> select (Value1-Value2) as Sub from DemoTable order by Sub DESC;
出力結果
+------+ | Sub | +------+ | 83 | | 45 | | -5 | | -26 | | -30 | +------+ 5 rows in set (0.00 sec)
このように、各レコードの「Value1 − Value2」の差分が大きい順(降順)に表示されました。
補足:昇順に並べ替えたい場合
逆に小さい値から表示したい場合は、DESCを外すか、明示的にASCを指定します。
mysql> select (Value1-Value2) as Sub from DemoTable order by Sub ASC;
また、エイリアスではなくORDER BY (Value1-Value2)のように式を直接指定することも可能です。ただし、可読性の観点からはエイリアスを使う方法がおすすめです。
-
MySQLにおけるBIGINTとBIGINT(20)の違いとは?表示幅の意味を実例で解説
BIGINTとBIGINT(20)の違いMySQLにおける「BIGINT」と「BIGINT(20)」の違いは、表示幅(display width)だけです。括弧内の数値「20」は、値を表示する際の桁数を指定するためのものであり、格納できる数値の範囲には一切影響しません。つまり、両者とも同じ範囲の整数(-9223372036854775808 ~ 9223372036854775807)を扱うことができます。なお、MySQL 8.0.17以降では整数型の表示幅指定は非推奨(deprecated)となっているため、新規開発での利用は避けるのが望ましいでしょう。動作を確認するサンプルテーブルの作成そ
-
MySQLで2つの日時(DATETIME)値の差を求める方法
MySQLで2つの日時値の差を求める方法MySQLで2つのDATETIME型の値の差を求めるには、TIMESTAMPDIFF()関数を使用します。この関数を使うことで、秒・分・時間などの任意の単位で2つの日時の差を簡単に計算できます。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> DueDatetime1 datetime, -> DueDatetime2 datetime -> );Query OK, 0 rows affected (0.86 sec)次に、INSE