MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで特定の月番号を条件にテーブルからレコードを抽出する方法:MONTH()関数の使い方

MySQLでは、MONTH()関数を使うことで、日付データから月の番号(1〜12)を取得し、特定の月に該当するレコードだけを簡単に抽出できます。ログ履歴や売上データなど、月単位での集計・検索を行いたい場面で非常に便利な関数です。

MONTH()関数を使った基本構文

SELECT yourColumnName FROM yourTableName WHERE MONTH(yourColumnName) = yourValue;

この構文では、WHERE句の中でMONTH()関数を適用し、指定した月番号と一致する行のみを取得します。

サンプルテーブルの作成

それでは、実際に動きを確認するためにテーブルを作成してみましょう。ユーザーのログイン日時を記録するテーブルを作成します。

mysql> create table UserLoginTimeInformation
    -> (
    -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> UserLoginDatetime datetime
    -> );
Query OK, 0 rows affected (0.55 sec)

テストデータの挿入

次に、INSERTコマンドを使って複数のレコードを挿入します。現在の日時から3か月後の日付と、さまざまな年月の固定日時を登録しています。

mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values(date_add(now(), interval 3 month));
Query OK, 1 row affected (0.14 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2013-05-13 13:45:34');
Query OK, 1 row affected (0.17 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2013-06-11 12:41:04');
Query OK, 1 row affected (0.19 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2012-05-25 15:03:24');
Query OK, 1 row affected (0.23 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2017-05-21 12:12:40');
Query OK, 1 row affected (0.10 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2018-09-29 11:30:34');
Query OK, 1 row affected (0.10 sec)
mysql> insert into UserLoginTimeInformation(UserLoginDatetime) values('2016-03-10 16:40:45');
Query OK, 1 row affected (0.27 sec)

登録済みレコードの確認

SELECT文ですべてのレコードを表示して、データが正しく登録されているか確認します。

mysql> select *from UserLoginTimeInformation;

実行結果は以下の通りです。

+--------+---------------------+
| UserId | UserLoginDatetime   |
+--------+---------------------+
|      1 | 2019-05-13 15:01:24 |
|      2 | 2013-05-13 13:45:34 |
|      3 | 2013-06-11 12:41:04 |
|      4 | 2012-05-25 15:03:24 |
|      5 | 2017-05-21 12:12:40 |
|      6 | 2018-09-29 11:30:34 |
|      7 | 2016-03-10 16:40:45 |
+--------+---------------------+
7 rows in set (0.00 sec)

実例:5月のレコードを抽出する

ここでは、月番号「5」(5月)に該当するすべてのレコードを抽出するクエリを実行します。MONTH()関数の引数に対象の日付カラムを渡し、比較値として5を指定します。

mysql> select UserLoginDatetime from UserLoginTimeInformation where MONTH(UserLoginDatetime) = 5;

実行結果

+---------------------+
| UserLoginDatetime   |
+---------------------+
| 2019-05-13 15:01:24 |
| 2013-05-13 13:45:34 |
| 2012-05-25 15:03:24 |
| 2017-05-21 12:12:40 |
+---------------------+
4 rows in set (0.00 sec)

ご覧の通り、年は異なっていても月が5月であるレコードだけが4件抽出されました。MONTH()関数は年を問わず月番号だけで判定するため、「毎年同じ月のデータ」をまとめて取得したい場合に最適です。

補足:パフォーマンスに関する注意点

WHERE句でカラムに関数を適用すると、インデックスが利用されず全件スキャンになる場合があります。大量のデータを扱う場合は、範囲検索(例:UserLoginDatetime >= '2023-05-01' AND UserLoginDatetime < '2023-06-01')を組み合わせることで、クエリのパフォーマンスを改善できます。

  1. MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法

    MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)

  2. MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

    MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec