【番外編】ライトノベルで学ぶMySQL入門(小説家になろう版)~chinpoの最大値がMAX()で取れない~
暑かった夏も終わり、秋の空気など感じながら、いつものように部室のドアを開ける。
「お、もういたのか、真琴」
と俺。
そこにはノートPCの前で腕を組み、鼻の下に鉛筆を挟み、『実際にこんなポーズ取るやついるのか?』ってポーズをしている真琴がいた。
「あ、ちょうどいいところに来たわね。コウタ」
「何がちょうどいいんだ?」
真琴のノートPCには、MySQLのコンソールが表示されている。
「それがね、chinpoの最大値が得られないのよ!」
「はあ?チンポの最大値がどうしたって?」
まったく、何のことだかわからない。
「ハロウィンの衣装の発注をしようと思って、参加者のサイズデータをデータベースにまとめてたとこなの」
「それで?」
「man_tblっていうテーブルがあって、idとchinpoってカラムがあるわ」
真琴はSELECT文で一覧を出す。
select * from man_tbl;
+------+--------+
| id | chinpo |
+------+--------+
| 1 | 15 |
| 2 | 10 |
| 3 | 40 |
| 5 | 45 |
| 6 | 180 |
+------+--------+
chinpoが45とか180とか、単位は何だ?まあいいか。
「ここでchinpoの最大値を求めるわ」
SELECT MAX(chinpo) FROM man_tbl;
+-------------+
| MAX(chinpo) |
+-------------+
| 45 |
+-------------+
「あれ?MAX()って最大値求めるんだよな?180にならないのか」
「そう、そこよ。180が出てほしいのに45になるわ」
「ほう、chinpoですか!」
振り向くと黒髪の美少女、愛華がいた。
「「わっ」」
俺と真琴は急に現れた愛華に驚く。
「ごめんなさい、びっくりさせちゃって。バイトの前にちょっと部室に寄ろうと思って」
真琴はさっき俺に説明した内容と同じことを愛華に説明した。
「SHOW CREATE TABLEしてもらっていいですかぁ?」と愛華。
結果はこうなる。
SHOW CREATE TABLE man_tbl\G
*************************** 1. row ***************************
Table: man_tbl
Create Table: CREATE TABLE `man_tbl` (
`id` int(11) DEFAULT NULL,
`chinpo` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
「これは、chinpoがvarchar型だからですよ。文字列扱いだから正しく最大値が取れないんです。だから……」
「わかったわ!整数型にキャストね」
真琴は新たにSQLを発行する。
SELECT MAX(CAST(chinpo AS UNSIGNED)) FROM man_tbl;
+-------------------------------+
| MAX(CAST(chinpo AS UNSIGNED)) |
+-------------------------------+
| 180 |
+-------------------------------+
正しく最大値が取れたようだ。
「このUNSIGNEDって何だ?」
「整数型ってことよ。今回は0と正の数しか値の対象にしないからUNSIGNEDにしたわ。つまり文字列であるchinpoの値を整数に変換して最大値を求めたわけね」
「マイナスがあったらどうするんだ?」
「その場合、UNSIGNEDの代わりにSIGNEDにするのがいいわね」
それにしても、ハロウィンの衣装でchinpoのサイズが必要とは、どんな衣装なんだろう……。
ともあれ、ハロウィンのイベントの準備は順調に進みそうだ。
MySQLのvarchar型のカラムに数字が入っている場合、MAX()では正確に最大値を取れないです。
この場合に本編ではキャストをする例を挙げました。
が、そもそもとして数字しか入らないカラムはINT型やBIGINT型といった、数値のみ受け入れる型にすべきですね。