【SQL基礎】変換関数
本項は変換関数ついて説明していきます。
変換関数とは
最後に、変換にまつわる変換関数について見ていきます。
これまでと比べて、あまり数はありません。
それでは、いくつかの関数を実際に見ていきましょう。
CAST関数(型変換)
MySQLでは、数値の100と文字列の90の大小比較などした場合、数値の100と90の比較した場合と同等の結果が得られます。
あと、よくあるのが”2021-02-28″などの文字列と日付型のデータとの比較や日付型カラムへの挿入ですね。
これも問題なく文字列の”2021-02-28″が日付として扱われて処理されます。
これはなぜかというと、DB側が暗黙的に型変換を行ってくれているからです。
この暗黙的型変換は便利ですが、検索時のパフォーマンスが低下する場合があったり、予期せぬエラーが起こりえるのでなるべく使わないようにしましょう。
明示的に型変換を行う場合は、CAST関数を使用します。
書式は下記です。
CAST(値 AS タイプ)
タイプには以下のものを指定できます。
BINARY[(N)] | バイナリ型。N句を使用するとNバイト分の引数しか使用しない |
CHAR[(N)] | VARCHAR型。N句を使用するとN文字分の引数しか使用しない |
DATE | DATE型 |
DATETIME | DATETIME型 |
DECIMAL[(M[,D])] | DECIMAL型。M句を使用するとが全体の桁数、D句を使用すると小数部分の桁数を指定できる |
SIGNED [INTEGER] | INT型。INTEGERは省略可能 |
TIME | TIME型 |
UNSIGNED [INTEGER] | UNSIGNED INT型(符号なし整数型)。INTEGERは省略可能 |
ではこれらを使って型変換をしてみましょう。
SELECT CAST("a" AS BINARY); SELECT CAST(20210228 AS CHAR); SELECT CAST(20210228 AS DATE); SELECT CAST("20210228123456" AS DATETIME); SELECT CAST(1234.1234 AS DECIMAL); SELECT CAST(1234.1234 AS DECIMAL(6,2)); SELECT CAST("000100" AS SIGNED); SELECT CAST("203050" AS TIME);
それぞれの型に変換できていることが確認できました。
数値型を「AS CHAR」で文字列に変換してるところはわかりづらいですが、数値型なら右詰で表示されるので文字列型に変換できていることがわかります。
また、DECIMALは引数を全て省略したり、小数部分の桁数を省略すると整数部分のみを扱います。
COALESCE関数(最初の非NULL値を返す)
COALESCE関数は、指定した任意の引数の値から、最初の非NULLの値を返す関数です。
なお、全ての値がNULLであった場合はNULLを返します。
書式は下記になります。
COALESCE(値1, 値2, … , 値n)
この関数、いったいどんな時に使うかわかりにくいかと思いますが
一番よく使われる使い方としては、一番最後の引数の値をNULL以外の固定値にしてNULLを別の値に変換するといった使われ方をします(同じような関数として、IFNULL関数があります)。
なぜこのようなことをするかというと、NULLが関数の引数に使われたりすると結果が全てNULLになってしまったりするのでそれを回避するために使ったりします。
それでは、実際に使ってみましょう。
また、以下のテーブルを使用します。
SELECT name, COALESCE(score, 0) FROM teachers;
テツヒコのscoreの値が0に置換されました。
今回の学習ポイント
・変換関数は変換にまつわる変換関数。
・暗黙的型変換はなるべく使わないほうがいい。
・CAST関数で型変換をすることができる。
・COALESCE関数でNULLを別の値に変換できる。
練習問題
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。 [sql] CREATE DATABASE worldcup2014;
use worldcup2014
source C:\worldcup2014.sql
[/sql]
このSQLではplayer_idがNULLになってしまっているところは0と出力されています。
COALESCE関数を使って、この部分も正常にカウントさせれるように変更してください。
SELECT player_id, COUNT(player_id) FROM goals GROUP BY player_id;