今回は、データベース言語SQLにおいて、データの並べ替えを行う「ORDER BY」について解説します。さらに、データの絞り込みを行う「WHERE」、データの集計を行う「GROUP BY」との組み合わせや、NULLデータの扱いについても解説していきます。
ORDER BYとは?
ORDER BYとは、データベースからデータ取得の際に、特定のカラムに基づいて結果をソート(並び替え)するための仕組みです。これにより、データの整理や分析を行いやすくなります。
ここでは、以下のサンプルテーブル「customer」を用います。まず、あなたがある企業やお店のために、集客目的の広告を運用する担当者になったと想定してください。
あなたは広告ad1,ad2,ad3を出して、集客を図っており、その結果6名の購入につながりました。そのレコードが「customer」テーブルに保存されています。
「customer」テーブル
1 2 3 4 5 6 7 8 9 10 |
+------------+------------+------------------------+------------+ | name | route | saved_date | price | +------------+------------+------------------------+------------+ | 佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 | | 鈴木 | ad2 | 2023-04-05 13:10:45 | 3500 | | 加藤 | ad1 | 2023-04-19 11:37:01 | 1300 | | 山本 | ad3 | 2023-05-03 15:59:58 | 4200 | | 伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 | | 松田 | ad2 | 2023-05-24 19:49:28 | 2500 | +------------+------------+------------------------+------------+ |
基本的な使い方は以下のようになります。
1 2 3 |
SELECT name, route, saved_date, price FROM customer ORDER BY price ASC; |
ここで、ASCは昇順(小さいものから大きいものへ)、DESCは降順(大きいものから小さいものへ)を示します。
この結果、以下のようにpriceで昇順にソートされたデータが取得されます。
1 2 3 4 5 6 7 8 9 10 |
+------------+-------+------------------------+-------+ | name | route | saved_date | price | +------------+-------+------------------------+-------+ | 加藤 | ad1 | 2023-04-19 11:37:01 | 1300 | | 佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 | | 松田 | ad2 | 2023-05-24 19:49:28 | 2500 | | 鈴木 | ad2 | 2023-04-05 13:10:45 | 3500 | | 山本 | ad3 | 2023-05-03 15:59:58 | 4200 | | 伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 | +------------+-------+------------------------+-------+ |
デフォルトではORDER BYは昇順でソートされます。降順でソートしたい場合はDESCを使用します。
1 2 3 |
SELECT name, route, saved_date, price FROM customer ORDER BY price DESC; |
結果:
1 2 3 4 5 6 7 8 9 10 |
+------------+-------+------------------------+-------+ | name | route | saved_date | price | +------------+-------+------------------------+-------+ | 伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 | | 山本 | ad3 | 2023-05-03 15:59:58 | 4200 | | 鈴木 | ad2 | 2023-04-05 13:10:45 | 3500 | | 松田 | ad2 | 2023-05-24 19:49:28 | 2500 | | 佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 | | 加藤 | ad1 | 2023-04-19 11:37:01 | 1300 | +------------+-------+------------------------+-------+ |
ORDER BYの使い方は?
ORDER BYを使う際の、基本的な形を構造的に示すと、以下の形になります。
1 2 3 |
SELECT 抽出するカラム名 FROM 対象のテーブル名 ORDER BY ソートしたいカラム名 ASC/DESC; |
実際に使用する際には何かしらの関数と一緒に用いることが多いため、上記の形は最小限のシンプルな形です。あくまで基本形として押さえましょう。
複数の要素でソートはできる?
ORDER BY句では、ソート条件をカンマで区切ることで、複数の要素をそれぞれ並び替えることができます。この機能は、主要なソート条件(第1ソート)で並べた後、同じ値を持つレコードに対してさらに別のカラム(第2ソート)でソートを行います。
では実際にデータを使って見ていきます。第1ソートにrouteの昇順、第2ソートにpriceの降順を適用すると、以下のようなクエリとなります。
1 2 3 |
SELECT name, route, saved_date, price FROM customer ORDER BY route ASC, price DESC; |
結果:
1 2 3 4 5 6 7 8 9 10 |
+------------+-------+------------------------+-------+ | name | route | saved_date | price | +------------+-------+------------------------+-------+ | 伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 | | 佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 | | 加藤 | ad1 | 2023-04-19 11:37:01 | 1300 | | 鈴木 | ad2 | 2023-04-05 13:10:45 | 3500 | | 松田 | ad2 | 2023-05-24 19:49:28 | 2500 | | 山本 | ad3 | 2023-05-03 15:59:58 | 4200 | +------------+-------+------------------------+-------+ |
routeカラムの昇順でad1, ad2, ad3の順番で表示され(第1ソート)、同一のroute値を持つデータについては、priceの降順(第2ソート)が表示されています。
WHERE, GROUP BY, NULLデータと併用できる?
SQLでは、データの絞り込みや集計、さらにソートを組み合わせて実行することが可能です。以下では、ORDER BYとGROUP BY、WHERE、そしてNULLデータを考慮した活用法について解説します。
WHERE句を使った絞り込みとソート
WHERE句を使用してデータを絞り込み、その後でORDER BY句を用いてソートする例を考えてみましょう。
1 2 3 4 |
SELECT name, route, saved_date, price FROM customer WHERE route = 'ad1' ORDER BY price DESC; |
上記のSQLクエリは、routeがad1のデータを抽出し、その結果をpriceの降順にソートします。
結果:
1 2 3 4 5 6 7 |
+------------+-------+------------------------+-------+ | name | route | saved_date | price | +------------+-------+------------------------+-------+ | 伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 | | 佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 | | 加藤 | ad1 | 2023-04-19 11:37:01 | 1300 | +------------+-------+------------------------+-------+ |
WHERE句の使い方や詳細については、以下の記事をご覧ください。
NULLデータについて
(注: 上記のテーブルデータにNULLが存在しないため、以下のデータを追加して説明します。)
1 |
| 山田 | ad3 | 2023-06-01 12:34:56 | NULL | |
想定: priceカラムにNULLのデータが存在するとする。この場合、ORDER BY句でソートを行う際にNULLデータはどう扱われるかを見ていきます。通常、NULLは他のどの値よりも小さいとして扱われます。
1 2 3 |
SELECT name, route, saved_date, price FROM customer ORDER BY price ASC; |
結果:
1 2 3 4 5 6 7 8 9 10 11 |
+------------+-------+------------------------+-------+ | name | route | saved_date | price | +------------+-------+------------------------+-------+ | 山田 | ad3 | 2023-06-01 12:34:56 | NULL | | 加藤 | ad1 | 2023-04-19 11:37:01 | 1300 | | 佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 | | 松田 | ad2 | 2023-05-24 19:49:28 | 2500 | | 鈴木 | ad2 | 2023-04-05 13:10:45 | 3500 | | 山本 | ad3 | 2023-05-03 15:59:58 | 4200 | | 伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 | +------------+-------+------------------------+-------+ |
このように、priceがNULLのデータは昇順ソートでは最初に表示されます。SQLの多くの実装では、NULLは最小の値として扱われるためです。
GROUP BYとの組み合わせ
データの集計にGROUP BY句を使用し、その結果をORDER BY句でソートする方法を見てみましょう。
1 2 3 4 |
SELECT route, AVG(price) as average_price FROM customer GROUP BY route ORDER BY average_price DESC; |
上記のSQLクエリは、routeごとの平均priceを計算し、その結果をaverage_priceの降順にソートします。
結果:
1 2 3 4 5 6 7 |
+-------+---------------+ | route | average_price | +-------+---------------+ | ad3 | 4200 | | ad2 | 3000 | | ad1 | 2800 | +-------+---------------+ |
この表には、各routeの平均priceが降順に表示されています。
このように、複数のSQL機能を組み合わせることで、より詳細にデータの取得や整理が行えます。
GROUP BYの使い方や詳細につきましては、以下の記事をご覧ください。
まとめ
今回紹介した、ORDER BYはSQLでデータを指定した順序で分かりやすく表示するための非常に便利な句です。
その他、SQLの様々な特徴や使用方法について例を交えて説明している記事もございますので、ぜひ参考にしてみてください。
SQLの勉強方法は?
SQLには、今回紹介したORDRE BY以外にも多くの構文があり、完全に習得し、自在にデータを扱えるようになるには多くの学習時間と実践の時間が必要になります。
特に、実践の時間については独学ではなかなか設けることができないものです。実践を交えてSQLを身につけたいと考えるのであれば、総合的な実践まで経験できるプログラミングスクールがおすすめです。
当サイトTECH MANIAでは、最短3か月で基礎から実践力・応用力まで身につけることのできるプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
独学でつまずいた方、一流のITエンジニアとしてスキルを高めていきたい方は必見です。
お問い合わせは以下のリンクからお進みください。