SQL入門：SQLの検索結果を自在にカスタマイズ！ORDER BY & LIMIT を使いこなすしてみた

## はじめに
データベースを扱う際、検索結果を特定の順番で並び替えたり、取得する件数を制限したりすることはよくあります。

:::note note
**SQLには、そうした処理を簡単に実現する `ORDER BY` と `LIMIT` という便利な機能があります。**
:::

本記事では、これらの基本的な使い方から応用例まで詳しく解説していきます。

## 書こうと思ったきっかけ
データ分析やWeb開発において、データの並び替えや件数制限は頻繁に行われる操作です。

:::note warn
***しかし、`ORDER BY` と `LIMIT` の使い方を正しく理解していないと、意図しない結果を得たり、パフォーマンスが低下したりすることがあります。***
:::

そこで、基本的な構文から実際の活用例までをまとめ、スムーズにSQLを活用できるようにしたいと思いました。

### 事前準備

データベースがない場合は、まず作成してから選択します。

```sql
mysql> CREATE DATABASE my_database;
mysql> USE my_database;
```


## テーブルの作成
まず、`users` テーブルを作成し、サンプルデータを挿入します。

### テーブル作成のSQL
```sql
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    score INT
);
```

### サンプルデータの挿入
```sql
INSERT INTO users (name, age, score) VALUES
('Alice', 25, 85),
('Bob', 30, 90),
('Charlie', 22, 88),
('David', 28, 92),
('Eve', 27, 80);
```

## ORDER BY とは
`ORDER BY` は、SQLで取得するデータを特定の順序で並び替えるために使用される句です。デフォルトでは昇順 (`ASC`) で並び替えられますが、降順 (`DESC`) にすることもできます。

### 基本構文
```sql
SELECT カラム名 FROM テーブル名 ORDER BY カラム名 [ASC | DESC];
```

### 使用例
#### 昇順に並び替え
```sql
SELECT name, age FROM users ORDER BY age ASC;
```
→ `age` の値が小さい順に `users` テーブルのデータを取得。

**実際のターミナル画面**

![Screenshot 2025-03-20 at 19.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ee69d16c-a58e-4ec8-a7cf-58a8219bd1ea.png)

#### 降順に並び替え
```sql
SELECT name, age FROM users ORDER BY age DESC;
```
→ `age` の値が大きい順にデータを取得。

**実際のターミナル画面**

![Screenshot 2025-03-20 at 19.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3e7b88bb-31c9-4ed8-a570-38447cdacd01.png)

#### 複数のカラムで並び替え
```sql
SELECT name, age, score FROM users ORDER BY age ASC, score DESC;
```
→ `age` を昇順に並び替え、その中で `score` を降順に並び替える。

**実際のターミナル画面**

![Screenshot 2025-03-20 at 19.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/10dd3fb2-31dc-46a2-88f4-e45a1e924fa1.png)

## LIMIT とは
`LIMIT` は、取得するデータの最大件数を制限するために使用される句です。大量のデータがある場合にパフォーマンスを考慮し、必要な件数のみ取得するのに役立ちます。

### 基本構文
```sql
SELECT カラム名 FROM テーブル名 LIMIT 件数;
```

### 使用例
#### 上位3件を取得
```sql
SELECT name, age FROM users ORDER BY age ASC LIMIT 3;
```
→ `age` の昇順で上位3件を取得。

**実際のターミナル画面**

![Screenshot 2025-03-20 at 19.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/fa666e9d-0559-421c-94ca-09693659da3a.png)

#### OFFSET を使用して範囲指定
```sql
SELECT name, age FROM users ORDER BY age ASC LIMIT 3 OFFSET 2;
```
→ 3件取得するが、最初の2件をスキップして3件目から取得。

**実際のターミナル画面**

![Screenshot 2025-03-20 at 19.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/83ada0fe-d143-43e5-a3aa-3b54a5383082.png)

## ORDER BY と LIMIT の組み合わせ
`ORDER BY` と `LIMIT` を組み合わせることで、ランキング上位や最新のデータのみを取得することができます。

### 例: 最新の5件を取得
```sql
SELECT * FROM orders ORDER BY created_at DESC LIMIT 5;
```
→ `created_at` の降順（最新順）で並び替え、最新の5件を取得。

### 例: スコア上位10件を取得
```sql
SELECT name, score FROM users ORDER BY score DESC LIMIT 10;
```
→ `score` の高い順に10件取得。

**実際のターミナル画面**

![Screenshot 2025-03-20 at 19.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2d653a74-0d06-4362-8280-c88c74733d73.png)

## まとめ
- `ORDER BY` はデータの並び順を指定するために使用。
- `LIMIT` は取得する件数を制限するために使用。
- `ORDER BY` と `LIMIT` を組み合わせることで、ランキングや最新データの取得が可能。

これらの機能を適切に活用することで、SQLのパフォーマンスを向上させながら必要なデータを効率よく取得できます！