MySQLのプリペアードステートメントについて

プリペアドステートメントはSQLステートメントに名前を割り当てて再利用可能にする機能です。 定義構文 PREPARE {名前} FROM '{SQLステートメント}'; 実行構文 EXECUTE {名前} USING {ユーザー変数}; 例 >-- プリペアードステートメントを定義する > PREPARE preparesql FROM 'SELECT * FROM test WHERE id = ?'; Query OK, 0 rows affected (0.00 sec) Statement prepared >-- 変数を定義する > SET @p=3; Query OK, 0 rows affected (0.00 sec) >-- プリペアードステートメントを実行する > EXECUTE preparesql USING @p; +----+----------+ | id | value | +----+----------+ | 3 | TESTTEST | +----+----------+ 1 row in set (0.00 sec) ※パラメータは値を直接指定すると実行時エラーになります。 >-- プリペアードステートメントを実行する > EXECUTE preparesql …

続きを読む

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を表します。

続きを読む

スポンサーリンク