【SQL】ORDER BY の挙動【NULL値、複数条件】

SQL

まずはテーブルとデータの用意。

CREATE TABLE `order_test` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `point` int DEFAULT NULL,
  `priority_1` int DEFAULT NULL,
  `priority_2` int DEFAULT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
INSERT INTO
  sandbox.order_test (`point`, priority_1, priority_2, created, modified)
VALUES
  (
    3,
    2,
    4,
    '2020-11-03 18:40:30',
    '2020-11-03 19:19:38'
  ),(
    NULL,
    2,
    3,
    '2020-11-03 18:43:49',
    '2020-11-03 19:19:38'
  ),(
    2,
    1,
    2,
    '2020-11-03 18:44:07',
    '2020-11-03 19:19:38'
  ),(
    2,
    1,
    1,
    '2020-11-03 19:19:21',
    '2020-11-03 19:19:21'
  );
SELECT * FROM order_test;
id|point|priority_1|priority_2|created            |modified           |
--|-----|----------|----------|-------------------|-------------------|
 1|    3|         2|         4|2020-11-03 18:40:30|2020-11-03 19:19:38|
 2|     |         2|         3|2020-11-03 18:43:49|2020-11-03 19:19:38|
 3|    2|         1|         2|2020-11-03 18:44:07|2020-11-03 19:19:38|
 4|    0|         1|         1|2020-11-03 19:19:21|2020-11-03 19:25:21|

まず、NULL値の扱いについてpointの値でORDER BYをかけて検証してみる。
NULL値は0より小さい値として扱われる模様。
並び順はDESCだと末尾に、ASCだと先頭になる。

SELECT * FROM order_test ot ORDER BY ot.`point` DESC;
id|point|priority_1|priority_2|created            |modified           |
--|-----|----------|----------|-------------------|-------------------|
 1|    3|         2|         4|2020-11-03 18:40:30|2020-11-03 19:19:38|
 3|    2|         1|         2|2020-11-03 18:44:07|2020-11-03 19:19:38|
 4|    0|         1|         1|2020-11-03 19:19:21|2020-11-03 19:25:21|
 2|     |         2|         3|2020-11-03 18:43:49|2020-11-03 19:19:38|

SELECT * FROM order_test ot ORDER BY ot.`point` ASC;
id|point|priority_1|priority_2|created            |modified           |
--|-----|----------|----------|-------------------|-------------------|
 2|     |         2|         3|2020-11-03 18:43:49|2020-11-03 19:19:38|
 4|    0|         1|         1|2020-11-03 19:19:21|2020-11-03 19:25:21|
 3|    2|         1|         2|2020-11-03 18:44:07|2020-11-03 19:19:38|
 1|    3|         2|         4|2020-11-03 18:40:30|2020-11-03 19:19:38|

次に、条件を複数掛けしたときの挙動。
最初の指定値の並びで並び変える。それ以降は、その前の並び変えで同じ値の中で並び変える。
例ではpriority_1で並び変えて、priority_1が同じ値の中でpriority_2の値で並び替えている。
補足としては、指定の並び変えで並び替えた後は、基本は登録順で並ぶ。(別途要検証)

SELECT * FROM order_test ot ORDER BY ot.priority_1 DESC, ot.priority_2 ASC;

id|point|priority_1|priority_2|created            |modified           |
--|-----|----------|----------|-------------------|-------------------|
 2|     |         2|         3|2020-11-03 18:43:49|2020-11-03 19:19:38|
 1|    3|         2|         4|2020-11-03 18:40:30|2020-11-03 19:19:38|
 4|    0|         1|         1|2020-11-03 19:19:21|2020-11-03 19:25:21|
 3|    2|         1|         2|2020-11-03 18:44:07|2020-11-03 19:19:38|

コメント

タイトルとURLをコピーしました