1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

あれ、このテーブルのこのカラムって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)

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?