カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

MySQLのNULL安全等価演算子(宇宙船演算子)

今回はMySQLでのNULL安全等価演算子についてご紹介します。
NULL安全等価演算子とは<=>のことで、見た目が宇宙船に似ていることからSpaceship Operator(宇宙船演算子)とも言われます。
※他言語でもあるんですが、返り値が違ったりするのでご注意ください。

まず、値の比較について見ていきます。

11を等価演算子で比較します。

MySQL> SELECT 1 = 1;
+-------+
| 1 = 1 |
+-------+
|     1 |
+-------+

結果は真の1となりました。

次は10を比較してみましょう。

MySQL> SELECT 1 = 0;
+-------+
| 1 = 0 |
+-------+
|     0 |
+-------+

結果は偽の0となりました。

今後は1NULLを比較してみます。

MySQL> SELECT 1 = NULL;
+----------+
| 1 = NULL |
+----------+
|     NULL |
+----------+

結果は偽の0となるかと思いきや、NULLとなりました。

NULL同士を比較するとどうでしょうか。

MySQL> SELECT NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
|        NULL |
+-------------+

結果はNULLとなりました。

1NULLの場合は0NULL同士の場合は1になって欲しいですよね。
そこで登場するのが、今回のNULL安全等価演算子(宇宙船演算子)です。
それを使うと次のようになります。

1NULLの場合

SELECT 1 <=> NULL;
+------------+
| 1 <=> NULL |
+------------+
|          0 |
+------------+

NULL同士の場合

SELECT NULL <=> NULL;
+---------------+
| NULL <=> NULL |
+---------------+
|             1 |
+---------------+

ということで、まさに欲しい結果が返ってきてくれます。

続いてサンプルデータを用いて、実際の事例をご紹介します。
続きを読む…»

2,192 views

MySQL TRUNCATE関数で小数点以下の値を切り捨てる

MySQLのTRUNCATE関数を使うと小数点以下を指定の桁数で切り捨てることができます。

  • 小数点以下をすべて切り捨て

    SELECT TRUNCATE(32.768, 0);
    

    出力結果は32となります。

  • 小数点以下を2位までとし、3位以下を切り捨て

    SELECT TRUNCATE(32.768, 2);
    

    出力結果は32.76となります。

  • 第2引数に負の値を渡すと、小数点左側を指定した桁数まで0にできます。

    SELECT TRUNCATE(32.768, -1);
    

    出力結果は30となります。

公式リファレンス:https://dev.mysql.com/doc/refman/5.6/ja/mathematical-functions.html#function_truncate

1,499 views

MySQLで10進数を2・8・16進数に変換

MySQLで基数変換を行う方法をご紹介します。

2進数に変換

SELECT BIN(500);

出力結果は111110100となります。

8進数に変換

SELECT OCT(500);

出力結果は764となります。

16進数に変換

SELECT HEX(500);

出力結果は1f4となります。

CONV関数

又、CONV関数を使っても変換することが可能です。
先ほどとは逆に2進数から10進数に変換する場合等もこちらを使用します。

書式:CONV(値, 変換元の基数, 変換先の基数)

例)500を10進数から2進数に変換

SELECT CONV(500, 10, 2);

公式リファレンス
BIN関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_bin
OCT関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_oct
HEX関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_hex
CONV関数:https://dev.mysql.com/doc/refman/5.6/ja/mathematical-functions.html#function_conv

974 views

MySQL IN句とFIND_IN_SET関数

MySQLの抽出条件の指定方法としてIN句とFIND_IN_SET関数というものがあります。
その具体的な使用方法をご紹介します。

サンプルとしてテーブル「sample」を用意します。

mysql> select * from `sample`;
+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 3  | 宇野   | 3    |
| 4  | 江崎   | 1    |
| 5  | 奥本   | 2    |
+----+--------+------+

IN句

例えば、idが1・2・4のデータを取得したいとき、
IN句を使うとこのように抽出することができます。

SELECT * FROM sample WHERE id IN (1, 2, 4);

結果は以下のようになります。

+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 4  | 江崎   | 1    |
+----+--------+------+

FIND_IN_SET関数

IN句のときと同様にidが1・2・4のデータを取得してみましょう。

SELECT * FROM sample WHERE FIND_IN_SET(id, '1,2,4');

こちらも結果はIN句を使ったときと同じ結果になります。

続きを読む…»

2,804 views

MySQLの日付関数 22選

MySQLで使用できる日付の加算や減算等の関数をご紹介します。

現在の日付を返す CURDATE()

現在の日付を返します。
CURRENT_DATE(), CURRENT_DATEはCURDATE()のシノニムです。

mysql> SELECT CURDATE();
        -> '2008-06-13'
mysql> SELECT CURDATE() + 0;
        -> 20080613

日付部分を抽出する DATE()

書式:DATE(expr)
日付exprの日付部分を抽出します。

mysql> SELECT DATE('2003-12-31 01:02:03');
        -> '2003-12-31'

日付の加算 DATE_ADD()

書式:DATE_ADD(date, INTERVAL expr unit)
日付値に時間値 (間隔) を加算します。
ADDDATE()DATE_ADD()のシノニムです。

unit…YEAR,MONTH,DAY等

mysql> SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY);
        -> '2008-02-02'
mysql> SELECT ADDDATE('2008-01-02', INTERVAL 31 DAY);
        -> '2008-02-02'

日付を指定された書式に設定 DATE_FORMAT()

書式:DATE_FORMAT(date, format)
日付を指定された書式に設定します。

mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
        -> 'Sunday October 2009'
mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
        -> '22:23:00'
mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', '%D %y %a %d %m %b %j');
        -> '4th 00 Thu 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');
        -> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
        -> '1998 52'
mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
        -> '00'

日付の減算 DATE_SUB()

書式:DATE_SUB(date, INTERVAL expr unit)
日付から時間値 (間隔) を引きます。
SUBDATE()DATE_SUB()のシノニムです。

mysql> SELECT DATE_SUB('2005-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND);
        -> '2004-12-30 22:58:59'
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
        -> '1997-12-02'

続きを読む…»

904 views