新人の頃のメモ書きを見返していたら、Oracleでは NULL が常に最大値扱いとなるとあったので、他のDBについてどのような挙動になるか調べてみた。
環境
1
2
3
4
5
| $ 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
1
2
3
4
5
6
7
8
9
10
| 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
1
2
3
4
5
6
7
8
9
10
| 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
1
2
3
4
5
6
7
8
9
10
11
| 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
1
2
3
4
5
6
7
8
9
| testdb=> select * from mytable order by column1;
id | column1
----+---------
3 | 1
4 | 2
1 | a
2 | b
5 |
(5 rows)
|
まとめ
DBごとに、ソート時の NULLの扱いが異なる 。
Oracleは試していないが、メモを見る限り PostgreSQLと同じ 。
| MySQL | PostgreSQL | Oracle |
|---|
| 最小 | 最大 | 最大 |