mysql関数とプロセス制御の詳細
10799 ワード
関数とは
関数、?ストレージ・プロシージャを定義できる以上、なぜ関数を作らなければならないのでしょうか.実は、関数はsql文で使用され、ストレージ・プロシージャはsql文を実行します.両者を区別する
組み込み関数数学関数 関数#カンスウ#
説明
ROUND(x,y)
戻りパラメータxの四捨五入yビット小数の値
RAND()
0~1のランダム値を返します.RAND()乱数ジェネレータは、パラメータ(シード)を指定して指定した値を生成します.集約関数 関数#カンスウ#
説明
AVG(col)
指定した列の平均値を返します.
COUNT(col)
指定したカラムのNull以外の値の数を返します.
MIN(col)
指定した列の最小値を返します
MAX(col)
指定した列の最大値を返します.
SUM(col)
指定した列のすべての値の和を返します.
GROUP_CONCAT(col)
グループに属するカラム値を組み合わせた結果を返します.文字列関数 関数#カンスウ#
説明
CHAR_LENGTH(str)
戻り値は文字列strの長さであり、長さの単位は文字である.1つのマルチバイト文字を1つの単一文字として計算します.
CONCAT(str1,str2,…)
文字列の結合パラメータがNULLの場合、NULLが返されます.
CONCAT_WS(separator,str1,str2,…)
文字列結合(カスタムコネクタ)CONCAT_WS()は空の文字列を無視しません.(ただしNULLはすべて無視されます).
CONV(N,from_base,to_base)
進数変換例:SELECT CONV(‘a’,16,2);aを16進数から2進数文字列に変換して表す
FORMAT(X,D)
数字Xの書式を'#,##,###,###.#',小数点以下のDビットを四捨五入して保持し、結果を文字列として返します.Dが0の場合、返される結果に小数点は含まれないか、小数点は含まれません.例えば:SELECT FORMAT(12332.1,4);結果は「12332.100」
INSERT(str,pos,len,newstr)
strの指定された位置に文字列posを挿入する:位置を置換する実際の位置len:置換の長さnewstr:新しい文字列、特にposが元の文字列の長さを超えると、元の文字列が返されます.lenが元の文字列の長さを超える場合は、新しい文字列で完全に置き換えられます.
INSTR(str,substr)
文字列strにおけるサブ文字列の最初の出現位置を返します.
LEFT(str,len)
文字列strの最初のlen位置からのサブシーケンス文字を返します.
LOWER(str)
小文字にする
UPPER(str)
大文字に変更
REVERSE(str)
文字列strを返します.順序と文字順序が逆です.
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
lenパラメータを持たないフォーマットは、位置posから始まる文字列strからサブ文字列を返します.lenパラメータを持つフォーマットは、文字列strからlen文字と同じ長さのサブ文字列を返し、位置posから開始します.FROMのフォーマットを標準SQL構文として使用します.posに負の値を使用することもできます.もしそうならば、サブ文字列の位置は、文字列の先頭位置ではなく、文字列の末尾のpos文字から始まる.次のフォーマットの関数でposに負の値を使用できます.日付時間関数 関数#カンスウ#
説明
CURDATE()
またはCURRENT_DATE()は現在の日付を返します
CURTIME()
またはCURRENT_TIME()が現在の時刻を返す
DAYOFWEEK(date)
dateが表す週の数日目(1~7)を返します.
DAYOFMONTH(date)
戻りdateは1ヶ月目の何日目(1~31)
DAYOFYEAR(date)
戻りdateは1年目の何日目(1~366)
DAYNAME(date)
SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt)
指定したfmtフォーマットに従ってUNIXタイムスタンプtsをフォーマットする
HOUR(time)
timeの時間値を返す(0~23)
MINUTE(time)
timeの分値を返します(0~59)
MONTH(date)
dateの月値(1~12)を返します.
MONTHNAME(date)
SELECT MONTHNAME(CURRENT_DATE);
NOW()
現在の日付と時刻を返します.
QUARTER(date)
SELECT QUARTER(CURRENT_DATE);
WEEK(date)
戻り日dateは1年のうち何週目(0~53)
YEAR(date)
日付dateを返した年(1000~9999)
DATE_FORMAT(date,format)
format文字列に基づいてdate値をフォーマットする
重点学習:DATE_FORMAT暗号化関数 関数#カンスウ#
説明
MD5()
計算文字列strのMD 5チェックサム
PASSWORD(str)
文字列strの暗号化バージョンを返します.この暗号化プロセスは不可逆的であり、UNIX暗号化プロセスとは異なるアルゴリズムを使用します.制御フロー関数 関数#カンスウ#
説明
CASE WHEN[test1] THEN [result1]…ELSE [default] END
testNが真の場合はresultNを返し、そうでなければdefaultを返します.
CASE [test] WHEN[val1] THEN [result]…ELSE [default]END
testとvalNが等しい場合はresultNを返し、そうでない場合はdefaultを返します.
IF(test,t,f)
testが本当なら、tを返します.そうでなければfを返す
IFNULL(arg1,arg2)
arg 1が空でない場合はarg 1を返し、そうでない場合はarg 2を返します.
NULLIF(arg1,arg2)
arg 1=arg 2がNULLを返す場合.そうでなければarg 1に戻る
カスタム関数
関数の作成
関数の削除
じっこうかんすう
に注意
関数の数はsql文を書くことはできません.そうしないと、エラーを報告します.関数はただの機能です.sqlで使用する機能はsqlを書く場合は、ストレージ・プロシージャを使用します.
プロセス制御
じょうけんステートメント
実行結果
ループステートメント whileサイクル
実行結果 repeatサイクル
実行結果 loopサイクル
実行結果
関数、?ストレージ・プロシージャを定義できる以上、なぜ関数を作らなければならないのでしょうか.実は、関数はsql文で使用され、ストレージ・プロシージャはsql文を実行します.両者を区別する
組み込み関数
説明
ROUND(x,y)
戻りパラメータxの四捨五入yビット小数の値
RAND()
0~1のランダム値を返します.RAND()乱数ジェネレータは、パラメータ(シード)を指定して指定した値を生成します.
説明
AVG(col)
指定した列の平均値を返します.
COUNT(col)
指定したカラムのNull以外の値の数を返します.
MIN(col)
指定した列の最小値を返します
MAX(col)
指定した列の最大値を返します.
SUM(col)
指定した列のすべての値の和を返します.
GROUP_CONCAT(col)
グループに属するカラム値を組み合わせた結果を返します.
説明
CHAR_LENGTH(str)
戻り値は文字列strの長さであり、長さの単位は文字である.1つのマルチバイト文字を1つの単一文字として計算します.
CONCAT(str1,str2,…)
文字列の結合パラメータがNULLの場合、NULLが返されます.
CONCAT_WS(separator,str1,str2,…)
文字列結合(カスタムコネクタ)CONCAT_WS()は空の文字列を無視しません.(ただしNULLはすべて無視されます).
CONV(N,from_base,to_base)
進数変換例:SELECT CONV(‘a’,16,2);aを16進数から2進数文字列に変換して表す
FORMAT(X,D)
数字Xの書式を'#,##,###,###.#',小数点以下のDビットを四捨五入して保持し、結果を文字列として返します.Dが0の場合、返される結果に小数点は含まれないか、小数点は含まれません.例えば:SELECT FORMAT(12332.1,4);結果は「12332.100」
INSERT(str,pos,len,newstr)
strの指定された位置に文字列posを挿入する:位置を置換する実際の位置len:置換の長さnewstr:新しい文字列、特にposが元の文字列の長さを超えると、元の文字列が返されます.lenが元の文字列の長さを超える場合は、新しい文字列で完全に置き換えられます.
INSTR(str,substr)
文字列strにおけるサブ文字列の最初の出現位置を返します.
LEFT(str,len)
文字列strの最初のlen位置からのサブシーケンス文字を返します.
LOWER(str)
小文字にする
UPPER(str)
大文字に変更
REVERSE(str)
文字列strを返します.順序と文字順序が逆です.
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
lenパラメータを持たないフォーマットは、位置posから始まる文字列strからサブ文字列を返します.lenパラメータを持つフォーマットは、文字列strからlen文字と同じ長さのサブ文字列を返し、位置posから開始します.FROMのフォーマットを標準SQL構文として使用します.posに負の値を使用することもできます.もしそうならば、サブ文字列の位置は、文字列の先頭位置ではなく、文字列の末尾のpos文字から始まる.次のフォーマットの関数でposに負の値を使用できます.
説明
CURDATE()
またはCURRENT_DATE()は現在の日付を返します
CURTIME()
またはCURRENT_TIME()が現在の時刻を返す
DAYOFWEEK(date)
dateが表す週の数日目(1~7)を返します.
DAYOFMONTH(date)
戻りdateは1ヶ月目の何日目(1~31)
DAYOFYEAR(date)
戻りdateは1年目の何日目(1~366)
DAYNAME(date)
SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt)
指定したfmtフォーマットに従ってUNIXタイムスタンプtsをフォーマットする
HOUR(time)
timeの時間値を返す(0~23)
MINUTE(time)
timeの分値を返します(0~59)
MONTH(date)
dateの月値(1~12)を返します.
MONTHNAME(date)
SELECT MONTHNAME(CURRENT_DATE);
NOW()
現在の日付と時刻を返します.
QUARTER(date)
SELECT QUARTER(CURRENT_DATE);
WEEK(date)
戻り日dateは1年のうち何週目(0~53)
YEAR(date)
日付dateを返した年(1000~9999)
DATE_FORMAT(date,format)
format文字列に基づいてdate値をフォーマットする
重点学習: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'
説明
MD5()
計算文字列strのMD 5チェックサム
PASSWORD(str)
文字列strの暗号化バージョンを返します.この暗号化プロセスは不可逆的であり、UNIX暗号化プロセスとは異なるアルゴリズムを使用します.
説明
CASE WHEN[test1] THEN [result1]…ELSE [default] END
testNが真の場合はresultNを返し、そうでなければdefaultを返します.
CASE [test] WHEN[val1] THEN [result]…ELSE [default]END
testとvalNが等しい場合はresultNを返し、そうでない場合はdefaultを返します.
IF(test,t,f)
testが本当なら、tを返します.そうでなければfを返す
IFNULL(arg1,arg2)
arg 1が空でない場合はarg 1を返し、そうでない場合はarg 2を返します.
NULLIF(arg1,arg2)
arg 1=arg 2がNULLを返す場合.そうでなければarg 1に戻る
カスタム関数
関数の作成
delimiter //
create function sum2(
a int,
b int)
returns int
begin
declare num int;
set num = a + b;
return(num)
end //
delimiter ;
delimiter //
create function fun(i int)
returns int
begin
declare res int default 0;
if i = 10 then
set res = 10;
elseif i = 20 then
set res = 200;
elseif i = 30 then
set res = 300;
else
set res = 400;
end if;
return res;
end //
delimiter ;
関数の削除
drop function fun_name;
じっこうかんすう
#
select UPPER('egon') into @res;
select @res;
#
select fun(11),name from tb2;
に注意
関数の数はsql文を書くことはできません.そうしないと、エラーを報告します.関数はただの機能です.sqlで使用する機能はsqlを書く場合は、ストレージ・プロシージャを使用します.
プロセス制御
じょうけんステートメント
-- if
delimiter //
create procedure pro_if()
begin
declare i int default 0;
if i = 1 then
select 1;
elseif i = 2 then
select 2;
else
select 7;
end if;
end //
delimiter ;
実行結果
mysql> call pro_if();
+---+
| 7 |
+---+
| 7 |
+---+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
ループステートメント
delimiter //
create procedure pro_while()
begin
declare num int;
set num = 0;
while num < 3 do
select
num;
set num = num + 1;
end while ;
end //
delimiter ;
実行結果
mysql> call pro_while();
+------+
| num |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
+------+
| num |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
+------+
| num |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
delimiter //
create procedure pro_repeat()
begin
declare i int;
set i = 0;
repeat
select i;
set i = i + 1;
until i >= 5
end repeat;
end //
delimiter ;
実行結果
mysql> call pro_repeat();
+------+
| i |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
+------+
| i |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
+------+
| i |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
+------+
| i |
+------+
| 4 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
-- 100
delimiter //
create procedure sum2(a int)
begin
declare sum int default 0;
declare i int default 1;
loop_name: loop #
if i > a then
leave loop_name; # leave break
end if;
set sum = sum + i;
set i = i + 1;
end loop; #
select sum; #
end //
delimiter ;
実行結果
mysql> call sum2(100);
+------+
| sum |
+------+
| 5050 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)