MySQLで指定したカラムが最大文字数であるレコードをサクッと調べる

# はじめに
あれ、このテーブルのこのカラムってDDLだと`VARCHAR（２５５）`ってなっているけど、今入ってるレコードで一番長いのは何文字くらいなんだろうか？
と思ったときに使ったクエリです。

# 結論
※テーブル名､カラム名は適宜読み替えてください｡
```sql
-- 方法その０
-- メリット：　一番カンタン
-- クライアントツールで列名ポチッとして降順ソートして先頭に来たもの。

-- 方法その１
-- メリット：　クエリ小さめ
SELECT
    *
FROM
    user
ORDER BY
    CHAR_LENGTH(name) DESC
LIMIT 10
;

-- 方法その２
-- メリット： 最大文字数のレコードのみが結果として表示される
SELECT
    *
FROM
    user
WHERE
    CHAR_LENGTH(name) = (
        SELECT
            MAX(CHAR_LENGTH(name))
        FROM
            user
    )
;
```

# 説明
動作環境
MySQL ８.0.28

### 方法その１
文字数を知りたいときに使う関数は`CHAR_LENGTH()`です。
```sql
mysql> select char_length('apple');
+----------------------+
| char_length('apple') |
+----------------------+
|                    5 |
+----------------------+
1 row in set (0.01 sec)

mysql> select char_length('りんご');
+--------------------------+
| char_length('りんご')    |
+--------------------------+
|                        3 |
+--------------------------+
1 row in set (0.00 sec)
```
方法その１は、nameの文字数を大きい順に並べた結果を取得しています。
※テーブルのレコードが全件表示されると面食らうので`LIMIT 10`をつけています。
<br>

### 方法その２
最大値を知りたいときに使う関数は`MAX()`です。
```sql
mysql> select * from user;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | taro   |  20 |
|  2 | jiro   |  30 |
|  3 | saburo |  40 |
|  4 | takuro |  50 |
+----+--------+-----+
4 rows in set (0.01 sec)

mysql> select max(age) from user;
+----------+
| max(age) |
+----------+
|       50 |
+----------+
1 row in set (0.00 sec)
```
<br>

方法１で使用した`CHAR_LENGTH()`と`MAX()`を組み合わせて、
`MAX(CHAR_LENGTH())`とすることで、最大文字数を知ることができます。

```sql
mysql> select * from user;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | taro   |  20 |
|  2 | jiro   |  30 |
|  3 | saburo |  40 |
|  4 | takuro |  50 |
+----+--------+-----+
4 rows in set (0.01 sec)

mysql> select max(char_length(name)) from user;
+------------------------+
| max(char_length(name)) |
+------------------------+
|                      6 |
+------------------------+
1 row in set (0.01 sec)
```
<br>

方法その２は、サブクエリで取得した`最も長いnameの文字数`と文字数が一致するレコードを取得しています。


# 実際に使ってみる
### 対象テーブル
``` sql
mysql> select * from user;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | taro   |  20 |
|  2 | jiro   |  30 |
|  3 | saburo |  40 |
|  4 | takuro |  50 |
+----+--------+-----+
4 rows in set (0.01 sec)
```

### 方法その１
```sql
mysql> SELECT
    ->     *
    -> FROM
    ->     user
    -> ORDER BY
    ->     CHAR_LENGTH(name) DESC
    -> LIMIT 10
    -> ;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  3 | saburo |  40 |
|  4 | takuro |  50 |
|  1 | taro   |  20 |
|  2 | jiro   |  30 |
+----+--------+-----+
4 rows in set (0.00 sec)
```
(そもそもレコードを４件しか作ってないので`LIMIT`の意味がないですね…)

### 方法その２
```sql
mysql> SELECT
    ->     *
    -> FROM
    ->     user
    -> WHERE
    ->     CHAR_LENGTH(name) = (
    ->         SELECT
    ->             MAX(CHAR_LENGTH(name))
    ->         FROM
    ->             user
    ->     )
    -> ;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  3 | saburo |  40 |
|  4 | takuro |  50 |
+----+--------+-----+
2 rows in set (0.00 sec)
```

# 参考
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_char-length

https://dev.mysql.com/doc/refman/5.6/ja/example-maximum-row.html