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