MySQLにおけるNULLの評価②

今回は集計関数を実行したとき、その項目にNULLが含まれるとき、どういった動きをするかを見ていきます。 例えば以下のようにNULLを含むデータがあったとします。 > SELECT * FROM test; +-------+ | value | +-------+ | 10 | | NULL | | 30 | | NULL | +-------+ 4 rows in set (0.00 sec) 結論から言ってしまうと、集計関数においてNULL値は無視されます。 0として扱われるわけではないので注意が必要です。 > SELECT AVG(value) FROM test; +------------+ | AVG(value) | +------------+ | 20.0000 | +------------+ 1 row in set (0.00 sec) NULL値を含めて集計したいときはIFNULL関数などで別の値に置き換えてやると、期待通りの結果が得られます。 > SELECT AVG(IFNULL(value, 0)) FROM test; +-----------------------+ | AVG(IFNULL(value, 0)) | +-----------------------+ | …

続きを読む

MySQLにおけるNULLの評価①

どんなプログラミング言語やデータベースでもNULLの扱いは特殊で、得てして厄介な問題を生みます。 MySQLにおいても例外なく多くのエンジニアの頭を悩ませてきました。 今日から2回に分けて、MySQLにおけるNULLの扱い方を見ていきたいと思います。 まずNULLの不等号による評価の結果は必ずNULLになります。 > SELECT NULL < 1; +----------+ | NULL < 1 | +----------+ | NULL | +----------+ 1 row in set (0.00 sec) > SELECT NULL = 0; +----------+ | NULL = 0 | +----------+ | NULL | +----------+ 1 row in set (0.00 sec) > SELECT NULL != 1; +-----------+ | NULL != 1 | +-----------+ | NULL | +-----------+ 1 row in set (0.00 sec) NULLを評価する際はIS NULL演算子、<=>演算子を使います。 > SELECT NULL IS NULL; +--------------+ |…

続きを読む

ENUM型について

ENUM型では文字列定数をリスト定義し、このリストの中から一つを指定します。 定義例 CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `flag` enum('t','f') DEFAULT 't' COMMENT 'フラグ', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='ENUM型の確認' 使用例① > INSERT INTO test(flag) VALUES('t'); Query OK, 1 row affected (0.00 sec) > INSERT INTO test(flag) VALUES('f'); Query OK, 1 row affected (0.00 sec) > SELECT * FROM test; +----+------+ | id | flag | +----+------+ | 1 | t | | 2 | f | +----+------+ 2 rows in set (0.00 sec) 使用例② > INSERT INTO test(flag) VALUES(0); Quer…

続きを読む

BINARY演算子について

MySQLの文字列比較はデフォルトで大文字/小文字の区別がされません。 BINARY演算子を使用することで文字列をバイトで比較するので、大文字/小文字を区別した比較が出来きます。 > SELECT 'a' = 'A'; +-----------+ | 'a' = 'A' | +-----------+ | 1 | +-----------+ 1 row in set (0.00 sec) > SELECT BINARY 'a' = 'A'; +------------------+ | BINARY 'a' = 'A' | +------------------+ | 0 | +------------------+ 1 row in set (0.00 sec) ※MySQLの内部的には trueは1、falseは0を表します。

続きを読む

BINARY型とVARBINARY型について

BINARY型とVARBINARY型は、CHAR型とVARCHAR型に似ていますが、単純な文字列ではなくバイトの文字列が格納されます。 定義例 CREATE TABLE `test` ( `value1` binary(5) DEFAULT NULL COMMENT '値1', `value2` varbinary(5) DEFAULT NULL COMMENT '値2' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='BINARY型の確認' 使用例① 以下のように通常の文字列として扱えないので注意が必要です。 > SELECT * FROM test; +--------+--------+ | value1 | value2 | +--------+--------+ | aaa | bbb | +--------+--------+ 1 rows in set (0.00 sec) > SELECT * FROM test WHERE value1 = 'aaa'; Empty set (0.00 sec) BINARY型はバイト数に満たない場合に末尾に0x00が付与されます。 (→CHAR型の場合は半角スペース) ※0x00とは16進数でNullのこと、MySQLでの表記は「\0」 上記のクエリはWHERE句を以下の…

続きを読む

MySQL 5.6 Developer を受けてきました

最近はAndroidの開発に関する記事ばかりでしたが、表題の通り MySQL 5.6 Developer の資格を受けてきましたので少し書いておきます。 MySQL 5.6 Developer は ORACLE が運営する資格で プロメトリック で受験することができます。 試験の詳細については以下をご確認ください。 https://education.oracle.com/ja/oracle-certified-professional-mysql-56-developer/trackp_259 で、結果ですが……落ちました……orz 仕事では結構長く扱っているので余裕とまではいかなくとも6割程度の合格ラインは超えるだろうと甘く見ていたのが敗因ですね。 当然ですが普段使用しているクエリやDDL程度の知識だけでは難しいです。 クエリ一つとっても少しひねった問題が出ます。 例えば以下のクエリの実行結果はどうなると思いますか? SELECT 1--2;   (1) -1   (2) 0   (3) 1   (4) 3   (5) エラーになる 答えは以下です。 > SELECT 1--2; +------+ | 1--2 | +------+ | 3 | +------+ 1 row in s…

続きを読む

もっと見る

スポンサーリンク