各データベース別のorder by実行時のNULLの扱い

2021-03-02Database

新人の頃のメモ書きを見返していたら、Oracleでは NULL が常に最大値扱いとなるとあったので、他のDBについてどのような挙動になるか調べてみた。

  • Oracle
  • PostgreSQL
  • MySQL

環境

$ mysql -V
mysql  Ver 14.14 Distrib 5.6.13, for osx10.8 (x86_64) using  EditLine wrapper

$ psql -V
psql (PostgreSQL) 9.3.1

調査

以下の様なテーブルとデータを作成してみた。

MySQL

create table mytable (
    id int not null auto_increment primary key,
    column1 text
);

INSERT INTO mytable ( column1 ) VALUES ( 'a' );
INSERT INTO mytable ( column1 ) VALUES ( 'b' );
INSERT INTO mytable ( column1 ) VALUES ( '1' );
INSERT INTO mytable ( column1 ) VALUES ( '2' );
INSERT INTO mytable ( column1 ) VALUES ( null );

PostgreSQL

create table mytable (
    id serial not null primary key,
    column1 text
);

INSERT INTO mytable ( column1 ) VALUES ( 'a' );
INSERT INTO mytable ( column1 ) VALUES ( 'b' );
INSERT INTO mytable ( column1 ) VALUES ( '1' );
INSERT INTO mytable ( column1 ) VALUES ( '2' );
INSERT INTO mytable ( column1 ) VALUES ( null );

それぞれソートしてみる。

MySQL

mysql> select * from mytable order by column1;
+----+---------+
| id | column1 |
+----+---------+
|  5 | NULL    |
|  3 | 1       |
|  4 | 2       |
|  1 | a       |
|  2 | b       |
+----+---------+
5 rows in set (0.00 sec)

PostgreSQL

testdb=> select * from mytable order by column1;
id | column1
----+---------
3 | 1
4 | 2
1 | a
2 | b
5 |
(5 rows)

まとめ

DBごとに、ソート時の NULLの扱いが異なる

Oracleは試していないが、メモを見る限り PostgreSQLと同じ

MySQLPostgreSQLOracle
最小最大最大

2021-03-02Database