【保存版】MySQLでクエリ結果をソート:ORDER BY句の便利な使い方と応用例
MySQLで複数のカラムを使ってクエリ結果をソートする方法
MySQLでは、ORDER BY
句を使ってクエリ結果をソートすることができます。これは、特定のカラムを基準にして行を並べ替える機能です。
単一のカラムでソート
最も基本的な方法は、1つのカラムでソートすることです。構文は以下の通りです。
SELECT *
FROM table_name
ORDER BY column_name ASC|DESC;
*
は、すべてのカラムを選択することを意味します。必要なカラムだけを指定することもできます。table_name
は、ソート対象のテーブル名です。column_name
は、ソート基準となるカラム名です。ASC
は昇順(小さい値から大きい値へ)、DESC
は降順(大きい値から小さい値へ)でソートすることを意味します。
例:users
テーブルをage
カラムで昇順にソート
SELECT *
FROM users
ORDER BY age ASC;
ORDER BY
句にカンマ区切りで複数のカラムを指定することで、複数のカラムでソートすることができます。左から順にソート基準が適用されます。
構文は以下の通りです。
SELECT *
FROM table_name
ORDER BY column1 ASC|DESC, column2 ASC|DESC, ...;
例:users
テーブルをage
カラムで昇順、name
カラムで昇順にソート
SELECT *
FROM users
ORDER BY age ASC, name ASC;
注意点
- ソートするカラムのデータ型が一致していることを確認してください。異なる型の場合は、予期しない結果になる可能性があります。
NULL
値は、ソート結果の最後に表示されます。- インデックスが張られているカラムでソートすると、パフォーマンスが向上します。
SELECT *
FROM users
ORDER BY age ASC, name DESC;
このクエリは、まずage
カラムで昇順にソートし、同じ年齢の場合はname
カラムで降順にソートします。結果は以下のようになります。
age | name |
---|---|
10 | Alice |
10 | Bob |
20 | Charlie |
20 | David |
例2:products
テーブルをprice
カラムで昇順、stock
カラムで降順にソートし、上位10件のみ表示
SELECT *
FROM products
ORDER BY price ASC, stock DESC
LIMIT 10;
このクエリは、まずprice
カラムで昇順にソートし、同じ価格の場合はstock
カラムで降順にソートします。その後、上位10件のみを表示します。
例3:customers
テーブルをcity
カラムでグループ化し、各グループ内のname
カラムで昇順にソート
SELECT city, name
FROM customers
ORDER BY city ASC, name ASC;
このクエリは、まずcity
カラムでグループ化し、各グループ内のレコードをname
カラムで昇順にソートします。結果は以下のようになります。
city | name |
---|---|
New York | Alice |
New York | Bob |
San Francisco | Charlie |
San Francisco | David |
SELECT o.order_id, o.order_date, d.product_id, d.quantity
FROM orders o
JOIN order_details d ON o.order_id = d.order_id
ORDER BY o.order_date DESC;
このクエリは、まずorders
テーブルとorder_details
テーブルをorder_id
で結合し、order_date
カラムで降順にソートします。その後、各注文のID、注文日、商品ID、数量を表示します。
サブクエリを使用して、ソート基準となる値を算出することができます。
SELECT *
FROM users
ORDER BY (age * 2) ASC;
WINDOW関数を使用する
WINDOW
関数を使用して、範囲内の行に基づいてソートすることができます。
例:orders
テーブルを直近3件の注文でorder_amount
カラムの合計額で降順にソート
SELECT order_id, order_date, SUM(order_amount) OVER (ORDER BY order_date DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS total_amount
FROM orders
ORDER BY total_amount DESC;
ユーザー定義関数を使用する
ユーザー定義関数を使用して、独自のソートロジックを実装することができます。
例:products
テーブルを在庫量と価格に基づいてカスタムソート
CREATE FUNCTION custom_sort(price DECIMAL(10,2), stock INT)
RETURNS DECIMAL(10,2)
BEGIN
DECLARE score DECIMAL(10,2);
IF stock > 10 THEN
SET score = price * 0.8;
ELSE
SET score = price * 1.2;
END IF;
RETURN score;
END;
SELECT product_id, name, price, stock, custom_sort(price, stock) AS custom_score
FROM products
ORDER BY custom_score ASC;
クライアント側でソートする
結果セットをクライアント側で取得してからソートすることもできます。
例:Pythonを使用して、employees
テーブルをsalary
カラムで降順にソート
import mysql.connector
# データベースへの接続
db = mysql.connector.connect(
host="localhost",
user="username",
password="password",
database="db_name"
)
# クエリの実行
cursor = db.cursor()
cursor.execute("SELECT * FROM employees")
# 結果セットのフェッチ
employees = cursor.fetchall()
# `salary`カラムで降順にソート
sorted_employees = sorted(employees, key=lambda employee: employee[3], reverse=True)
# ソート結果の表示
for employee in sorted_employees:
print(employee)
# データベース接続のクローズ
db.close()
mysql sql-order-by