【データベース】ORDER BYで色々な並び替えをする方法

データベース データベース

概要

SQLでORDER BYを使用して並び替える際のバリエーションをまとめています。

確認環境

  • PostgreSQL 9.6

使用するテーブル

id name age
0001 Alice 25
0002 Bob 27
0003 Carol 30
0004 Dave 60
0005 Eve 60

DDL(テーブル作成)

CREATE TABLE
  employee
  ( id     VARCHAR,
    name   VARCHAR,
    age    INTEGER,
    PRIMARY KEY (id));

DML(データ挿入)

INSERT INTO employee VALUES('0001','Alice',25);
INSERT INTO employee VALUES('0002','Bob',27);
INSERT INTO employee VALUES('0003','Carol',30);
INSERT INTO employee VALUES('0004','Dave',60);
INSERT INTO employee VALUES('0005','Eve',60);

基本的なソート

列を指定して、昇順に並び替えます。
昇順に並び替える場合はORDER BYでASCを指定します。
ここでは、idを昇順で並び替えます。

SELECT
  * 
FROM
  employee
ORDER BY
  id ASC;
id name age
0001 Alice 25
0002 Bob 27
0003 Carol 30
0004 Dave 60
0005 Eve 60

列を指定して、降順に並び替えます。
昇順に並び替える場合はORDER BYでDESCを指定します。
ここでは、idを降順で並び替えます。

SELECT
  * 
FROM
  employee
ORDER BY
  id DESC;
id name age
0005 Eve 60
0004 Dave 60
0003 Carol 30
0002 Bob 27
0001 Alice 25

複数条件を指定してソート

複数の条件を指定してソートします。
ここでは、ageの降順で並び替えた後に、idの昇順で並び替えてみます。

SELECT
  *
FROM
  employee
ORDER BY
  age DESC,
  id ASC;
id name age
0004 Dave 60
0005 Eve 60
0003 Carol 30
0002 Bob 27
0001 Alice 25

ちなみに、ageの降順で並び替えた後に、idの降順で並び替えた結果は以下となります。

SELECT
  *
FROM
  employee
ORDER BY
  age DESC,
  id DESC;
id name age
0005 Eve 60
0004 Dave 60
0003 Carol 30
0002 Bob 27
0001 Alice 25

条件を分岐してソート

並び替えする場合に、場合によっては、条件1に合致するデータを上位に配置して、その他のデータ内で条件2と条件3で並び替えしたい場合があると思います。その場合の方法を記載します。

ここでは、ageが30未満のデータとそれ以外でグループ分けして、それぞれのデータ内でageを降順に並び替えた後、idの降順で並び替えを行います。

SELECT
  *
FROM
  employee
ORDER BY 
  CASE  WHEN age < 30 THEN 1 
    ELSE 2 
  END ASC, 
  age DESC,
  id ASC;
id name age
0002 Bob 27
0001 Alice 25
0004 Dave 60
0005 Eve 60
0003 Carol 30

コメント