はじめに
あれ、このテーブルのこのカラムってDDLだとVARCHAR(255)
ってなっているけど、今入ってるレコードで一番長いのは何文字くらいなんだろうか?
と思ったときに使ったクエリです。
結論
※テーブル名、カラム名は適宜読み替えてください。
-- 方法その0
-- メリット: 一番カンタン
-- クライアントツールで列名ポチッとして降順ソートして先頭に来たもの。
-- 方法その1
-- メリット: クエリ小さめ
SELECT
*
FROM
user
ORDER BY
CHAR_LENGTH(name) DESC
LIMIT 10
;
-- 方法その2
-- メリット: 最大文字数のレコードのみが結果として表示される
SELECT
*
FROM
user
WHERE
CHAR_LENGTH(name) = (
SELECT
MAX(CHAR_LENGTH(name))
FROM
user
)
;
説明
動作環境
MySQL 8.0.28
方法その1
文字数を知りたいときに使う関数はCHAR_LENGTH()
です。
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)
方法その1は、nameの文字数を大きい順に並べた結果を取得しています。
※テーブルのレコードが全件表示されると面食らうのでLIMIT 10
をつけています。
方法その2
最大値を知りたいときに使う関数はMAX()
です。
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)
方法1で使用したCHAR_LENGTH()
とMAX()
を組み合わせて、
MAX(CHAR_LENGTH())
とすることで、最大文字数を知ることができます。
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)
方法その2は、サブクエリで取得した最も長いnameの文字数
と文字数が一致するレコードを取得しています。
実際に使ってみる
対象テーブル
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)
方法その1
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)
(そもそもレコードを4件しか作ってないのでLIMIT
の意味がないですね…)
方法その2
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)
参考