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

MySQL カラムの値をSELECT…INTO構文で変数に格納する

SELECT...INTO構文を使用すると、クエリー結果を変数に格納することができます。
ストアドファンクションで利用する機会があったのでご紹介します。

構文例

SELECT field_name INTO @param FROM table limit 1;

最後にlimit 1と付けているのは、この構文を使うときはレコード数が1件でないといけないからです。
もし1件以上のデータが合致してしまった場合はエラーが発生し、以下のようなメッセージが返されます。

ERROR 1172 (42000): Result consisted of more than one row

SELECT...INTOが成功した後に以下を実行すると、設定した変数の内容を確認することができます。

SELECT @param;

こちらは公式リファレンスマニュアルにも掲載されている方法です。
https://dev.mysql.com/doc/refman/5.6/ja/select-into.html

1,458 views

MySQL 今日の日付を取得する

MySQLで今日の日付を利用したいとき、取得する方法が何通りかあります。

SELECT CURDATE();

もしくは

SELECT DATE(NOW());

その他、CURRENT_DATECURRENT_DATE()でも同様に今日の日付が取得できます。

上記すべて、結果は次のようになります。

2022-09-12

また、YYYYMMDDというハイフンなしの形式が良い場合はCURDATE()+0とすることで数値の扱いとなり20220912と表示されます。

2,055 views

SQLの行挿入で、カラム名省略時のデフォルト値の使用

SQLの行挿入(INSERT)で、カラム名を省略することができます。

まず、通常はこのようにします。

INSERT INTO `TEST_TABLE`
    (id, name, age)
    VALUES
    (1, '赤井', 23);

カラム名を省略する場合、このようになります。

INSERT INTO `TEST_TABLE`
    VALUES
    (1, '赤井', 23);

ここで、カラムnameがデフォルト値「名無」という設定だったとします。
カラムnameを「名無」で登録したい場合はデフォルトの値を使ってもらうという意味のDEFAULTを使います。

INSERT INTO `TEST_TABLE`
    VALUES
    (1, DEFAULT, 23);

また、もしこの時、カラムidAUTO_INCREMENTが設定されていたら、次のIDがいくつかを取得して挿入しないといけないですよね。
しかしそんなことは面倒です。
そんな時はDEFAULT、もしくはNULLと指定すればOKです。

INSERT INTO `TEST_TABLE`
    VALUES
    (DEFAULT, '赤井', 23);

NULLでも可

INSERT INTO `TEST_TABLE`
    VALUES
    (NULL, '赤井', 23);

こうすることにより、AUTO_INCREMENTで次のIDにて挿入されます。

4,414 views

JOIN句で結合するカラムにNULLが含まれる場合

JOIN句を使って複数のテーブルを結合するとき、結びつけるカラムにNULLが含まれる場合があるとデータが抽出されません。
これは「NULL = NULL」がtrueにならないからだそうです。

そんなときは以下のようにすると抽出することができます。

SELECT * FROM TEST_TABLE1
INNER JOIN TEST_TABLE2 AS TEST_T2
ON TEST_T1.id = TEST_T2.id 
    AND ((TEST_T1.name = TEST_T2.name) OR (TEST_T1.name IS NULL AND TEST_T2.name IS NULL));

もしくは以下のようでもOKです。

AND IFNULL(TEST_T1.name, '') = IFNULL(TEST_T2.name, '');

こちらはNULL安全等価演算子(宇宙船演算子)を使うことで解決できます。
別の記事にしましたので、そちらをご覧ください。
MySQLのNULL安全等価演算子(宇宙船演算子)

14,980 views

ORDER BY句で使える条件式

SQLのORDER BY句では、特定のカラムを昇順や降順に並べ替えることができます。
更にCASE式を使えば任意の並び順にすることも可能です。

今回は、特定のカラムがNULLとなる場合があるテーブルで、NULLは最後にまとめて表示し、それ以外は昇順の表示になるようにしてみたいと思います。

例として以下のようなテーブルがあったとします。

TEST_TABLE
id name age
1 赤井 35
2 池田 22
3 内山 NULL
4 江崎 54
5 太田 NULL

年齢の昇順でデータを表示してみましょう。

SELECT * FROM TEST_TABLE ORDER BY age;

そうすると、NULLが先に表示され、それ以降が年齢の昇順という形になるかと思います。

TEST_TABLE
id name age
3 内山 NULL
5 太田 NULL
2 池田 22
1 赤井 35
4 江崎 54

これを、NULLは最後にまとめて表示し、それ以外を年齢の昇順で表示したい…というのが今回の焦点でしたね。
そのような場合にORDER BY句でCASEの条件式を使います。

SELECT * FROM TEST_TABLE 
ORDER BY
    CASE WHEN age IS NULL THEN 2 ELSE 1 END,
    age;

このようにORDER BY句でCASE式を使用し、年齢がNULLの場合の優先順位を下げてあげるわけです。
その後、年齢の昇順を指定しているので、実行結果の並び順は以下のようになります。

TEST_TABLE
id name age
2 池田 22
1 赤井 35
4 江崎 54
3 内山 NULL
5 太田 NULL

ただし、パフォーマンスはあまりよくないようなので、大規模なデータベースで使うのは避けたほうが良いかもしれません。

使いようによっては便利なので、是非一度試してみてください。

公式マニュアル:
https://docs.microsoft.com/ja-jp/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver16#Case

466 views