【中級者向け】MySQL CASEを使いこなしてデータの分別
MySQLのCASEはテーブル上のデータを分別したり、集計したりする際に便利です。SELECTステートメントを使用することができるのであれば、ぜひ覚えておきたい機能ですね。そこで今回の記事では、MySQL CASEの主な機能をご紹介しつつ、実際に使用する方法をハンズオンで体験していきましょう。
- MySQLのCASEはテーブルデータの分別に利用可能
- MySQLを使ったCASEのハンズオン
MySQL CASEとは
MySQLのCASEは、テーブル内のデータを一定の条件に当てはめて整理する機能を持っています。SELECTステートメントだけを使用するとテーブルの全てのデータを登録順に取得することしかできません。しかし、CASEを使用することで条件に当てはまるデータが登録されたレコードへ指定した表示ができるのです。
MySQL CASEの構文を以下で見てみましょう。
SELECT カラム名 , CASE WHEN 条件式1 THEN 結果1 WHEN 条件式2 THEN 結果2 … (ELSE ‘例外の表示’) END (AS ‘結果を表示するカラム名’) FROM テーブル名;
指定したカラムが「条件式1」に当てはまった場合には結果1の表示、「条件式2」に当てはまった場合には結果2の表示といったように、データを分別することができます。
「結果」については、「END AS」の後にカラム名を指定した場合、収納されるカラム名となります。こちらは必須でありません。
また、データが条件式に当てはまらなかった場合に「ELSE」を設定しておきましょう。こちらも必須ではありませんが、データの中に例外がある可能性もあるため、できるだけ設定しておくようにしましょう。
MySQLのCASEを使用した例
SELECTステートメントの構文を覚えている方であれば、CASEの加わる構文も難しくはないはずです。実際にMySQLのCASEが使用されている構文を見て、さらに理解を深めましょう。
以下のようなテーブルがある前提で説明を進めます。
foodsテーブル
+---------+------+ | food | type | +---------+------+ | Banana | 1 | | Apple | 1 | | Bread | 3 | | Cookie | 3 | | Beef | 2 | | Chicken | 2 | +---------+------+
「type」カラムには「果物 = 1」「肉類 = 2」「その他 = 3」といった法則で数字が入っています。この数字を利用して、CASEを使用してみましょう。
CASEを含むSELECTステートメント
SELECT *, CASE WHEN type = 1 THEN '果物' WHEN type = 2 THEN '肉類' ELSE 'その他' END AS 'ジャンル' FROM foods;
出力結果
+---------+------+--------------+ | food | type | ジャンル | +---------+------+--------------+ | Banana | 1 | 果物 | | Apple | 1 | 果物 | | Bread | 3 | その他 | | Cookie | 3 | その他 | | Beef | 2 | 肉類 | | Chicken | 2 | 肉類 | +---------+------+--------------+ 6 rows in set (0.00 sec)
CASEの後に書き込んだ条件式がを反映したテーブルが出力されました。このようにレコード内に識別記号・数字などが入っていれば、簡単にレコードを分類別表示することが可能です。
【関連記事】
▶︎MySQL初心者にマスターしてほしいコマンドラインからの使用方法
▶︎MySQLのUPDATEの基本とデータベースに格納された値を効率よく変更する方法
MySQLでCASEハンズオンにトライ
こちらでは、実際にMySQLというデータベースを使用してCASEを使ってみましょう。
準備
まずはMySQLを使用するための準備をしていきます。
MySQLのインストール・接続
まだMySQLをインストールしていない場合は、インストールしましょう。
$ brew install mysql
MySQLのインストールが終了したら、接続します。
$ sudo mysql -u root -p
データベースの作成
次にデータベースをMySQL上に作成し、使用するデータベースを指定しましょう。
mysql> CREATE DATABASE potepan; Query OK, 1 row affected (0.00 sec) mysql> USE potepan;
これでMySQLを使用する準備は完了しました。
ベースとなるテーブルの作成
次にベースとなるテーブルを作成しましょう。
CREATE TABLE creatures(name VARCHAR(50), type INT, lifespan INT); Query OK, 0 rows affected (0.01 sec)
上記は生物の名前(name)、種族(type)、寿命(lifespan)をまとめるためのテーブルです。種族は「哺乳類 = 1」「魚類 = 2」「昆虫類 = 3」に分けて登録していきます。次にレコードの登録も行いましょう。
INSERT INTO creatures VALUES('アフリカゾウ', 2, 60),('カブトムシ', 3, 0.5),('カ ツオ', 2, 10),('クマムシ', 3, 100), ('ブタ', 1, 20),('サーモン', 2, 5); Query OK, 6 rows affected (0.00 sec)
テーブルの状態
SELECT * FROM creatures; +--------------------+------+----------+ | name | type | lifespan | +--------------------+------+----------+ | アフリカゾウ | 1 | 60 | | カブトムシ | 3 | 1 | | カツオ | 2 | 10 | | クマムシ | 3 | 100 | | ブタ | 1 | 20 | | サーモン | 2 | 5 | +--------------------+------+----------+ 6 rows in set (0.00 sec)
MySQL CASEで分類表示
それでは、最初に見た例のような分類表示を体験してみましょう。creaturesテーブルから「type」カラムを「哺乳類 = 1」「魚類 = 2」「昆虫類 = 3」という法則で分別していきます。
CASEを含むSELECTステートメント
SELECT *, CASE WHEN type = 1 THEN '哺乳類' WHEN type = 2 THEN '魚類' WHEN type = 3 THEN '昆虫類' ELSE '未分類' END AS '種族' FROM creatures;
出力結果
+--------------------+------+----------+-----------+ | name | type | lifespan | 種族 | +--------------------+------+----------+-----------+ | アフリカゾウ | 1 | 60 | 哺乳類 | | カブトムシ | 3 | 1 | 昆虫類 | | カツオ | 2 | 10 | 魚類 | | クマムシ | 3 | 100 | 昆虫類 | | ブタ | 1 | 20 | 哺乳類 | | サーモン | 2 | 5 | 魚類 | +--------------------+------+----------+-----------+ 6 rows in set (0.00 sec)
上記のように種族を表示することによって、一気にテーブルの可読性が上がり、第三者が見た時にも分かりやすくなります。
MySQL CASEで分類表示2
次にlifespanカラムを利用して分別をしてみましょう。ただし、今回は条件式の書き方を変更します。条件式の書き方にも注目してみてください。
CASEを含むSELECTステートメント
SELECT *, CASE WHEN lifespan 50 THEN '長生き' WHEN lifespan 10 THEN '通常' WHEN lifespan <= 10 THEN '短命' ELSE '未分類' END AS '寿命' FROM creatures;
出力結果
+--------------------+------+----------+-----------+ | name | type | lifespan | 寿命 | +--------------------+------+----------+-----------+ | アフリカゾウ | 1 | 60 | 長生き | | カブトムシ | 3 | 1 | 短命 | | カツオ | 2 | 10 | 短命 | | クマムシ | 3 | 100 | 未分類 | | ブタ | 1 | 20 | 通常 | | サーモン | 2 | 5 | 短命 | +--------------------+------+----------+-----------+ 6 rows in set (0.00 sec)
条件式には「<」のような比較演算子を含めることもできます。比較演算子を用いた条件式を使うことで、範囲ごとに分類表示することができるため便利です。
まとめ
今回の記事では、MySQL CASEの主な機能をご紹介しつつ、実際に使用する方法をハンズオンで体験していきました。使ってみると非常に簡単なCASEですが、テーブルデータの分類を行う際には非常に便利です。ぜひ、テーブルデータの可読性を上げる際に利用してみましょう。
【関連記事】
▶︎【初心者から一歩先へ】MySQLのWHERE BETWEEN句で範囲検索!
▶︎【WHERE DATE句】MySQL 日付・時間処理関数の使い方まとめ10選