SQL order byでソート指定するサンプルコード集 指定のレコードだけ先頭に並べるには?
  • facebookページ
  • twitterページ
  • 2019.10.20

    SQL order byでソート指定するサンプルコード集 指定のレコードだけ先頭に並べるには?

    SQLでソート順を指定するorder by句。当記事では、order byを使ったサンプルコードを紹介しています。

    以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用しています。

    SQLのorder byの基本的な使い方

    order byはselect文と組み合わせることが多いですが、update文やdelete文にも使えます。

    上記のSQLは、employees(社員テーブル)から、birth_date(誕生日)を降順にデータを取得します。

    結果はこうなります。


    ※1965年2月1日生まれが、社員の中で最も若いデータ

    order byのサンプルコード

    複数カラムを昇順・降順混ぜてソートするサンプル

    order byの指定には、複数カラムの指定が可能です。また、カラムごとに別々にDESC(降順)、ASC(昇順)の指定ができます。

    降順・昇順を指定しない場合はデフォルト(昇順)になります。

    上記のSQLは、employees(社員テーブル)から、emp_no(社員番号)降順、first_name(姓名の名)昇順、last_name(姓名の姓)昇順でデータを取得します。ASC、DESCの指定を省略したfirst_nameのソートはASC(昇順)になります。

    実行結果はこうなります。

    order byに条件を指定する例サンプルコード

    order byのカラム指定に条件を指定することが可能です。

    上記SQLは、employees(社員テーブル)から、emp_no(社員番号)が20000ものを一番最初に(それ以外は不定)、first_name(姓名の名)を昇順、hire_date(雇用日)を昇順で取得します。

    実行すると、こうなります。


    emp_no(社員番号)20000のデータが先頭に来ているのは良いのですが、それ以降はemp_noがバラバラです。

    内部的には、ソートの第一条件「emp_no=20000とそれ以外」、第二条件「first_nameを昇順で」、第三条件「hire_dateを昇順で」ということになります。

    「emp_no=20000のデータを先頭に、それ以外を降順に」というソート指定をするには、case式を組み合わせます。

    case式を組み合わせて任意の順番でソートする例

    上記SQLは、employees(社員テーブル)から、emp_no=20000とそれ以外を昇順、emp_no(社員番号)を降順、first_name(姓名の名)を昇順にデータを取得します。

    実行結果はこうなります。


    「case emp_no WHEN 20000 THEN 1 ELSE 2 END」というcase式で、ソートの第一条件が「1」(emp_no=20000)または「2」(emp_noが20000以外)の昇順になるんですね。

    ソート第二条件の「emo_no DESC」が適用された時点でソート順位が確定するため、ソート第三条件のfirst_name ASCは意味がないことになります。

    【関連記事】
    SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ

    fieldを使って任意の順番でソート指定する

    MySQLのみの関数ですが、field指定を使って任意の順番でソートが可能です。

    departmens(部署テーブル)のうち、dept_name(部署名)がMarketing、Sales、Developmentのものを取得し、Marketing、Sales、Developmentの順にソートして取得します。

    結果はこうなります。

    SQL実行結果

    order by 1って何? 列番号でソート順を指定する

    order by指定には、カラム名以外に列番号を指定可能です。order by 1は、第一列のカラムを昇順にソートする指定なんですね。

    上記SQLは、employees(社員テーブル)から、列2(birth_date 誕生日)昇順、列6(hire_date 雇用日)降順、列1(emp_no 社員番号)昇順でデータを取得します。

    実行するとこうなります。


    列番号でのソート指定は、SQL標準の観点から見ると、あまり好ましくありません。

    NULLのソート順を決める

    Oracle限定ですが、ソート対象のカラムがNULLだったときの扱いを指定する方法があります。

    「NULL_FIRST」でNULLのカラムは先頭に、「NULL_LAST」で、NULLのカラムは最後尾になります。

    上記のSQLは、hire_date(雇用日)がNULLのものを先頭にして降順に、first_name(姓名の名)がNULLのものを最後尾にして昇順にソートする指定になります。

    order byを使うときの注意点

    order byでユニークカラム以外を指定するとlimitで重複が出る

    DBMSの種類やバージョンによっては、order byでソート指定したカラムがユニークではない場合、並びが不定になるケースがあるようです。

    上記SQLは、employees(社員テーブル)から、hire_date(雇用日)を昇順にソートして10件取得します。

    結果はこうなりました。


    MySQL 5.7では、何度クエリを実行しても、ソート順は固定のままでした。

    ユニークでないカラムをソート指定した場合には、並び順は保証されないケースがあることは覚えておきましょう。

    参考)ORDER BYとLIMIT, OFFSETの組み合わせには注意しよう | MMMブログ

    order byが効かない group byの実行順序に注意

    まとめ

    ポテパンダの一言メモ
    • order byでは、複数カラムに昇順・降順の混合指定が可能
    • order byに条件指定したデータを先頭に並べることができる
    • 任意の順番でソートするには、order byにcase式を組み合わせる
    • MySQLでは、field関数を使って任意の順番にソートが可能
    • order by 1などの列番号指定は、なるべく避ける
    • Oracleでは、ソートでのNULLのカラムの扱いを指定可能
    • DBMSのシュルいやバージョンにより、ユニークでないカラムをソート指定すると並び順が不定になるケースあり

    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!フリーエンジニアになりたい方向けのコンテンツも盛りだくさんです。

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800万円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料25万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテクラバナー ポテプロバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE

    ポテパンおすすめ案件